zoukankan      html  css  js  c++  java
  • 数据库外键关系分类一对多,一对一,多对多

    1.OneToOne

    如何判断表关系满足一对1

    比如用户表和用户详细信息表

    举例:

    1.核心思想换位思考:第一先站在user表思考一个用户有可以对应有几个详细信息,当然是一个由此判断user表到userdetail表满足1单向一对1

    2.再站在userdetail表,一个userdetail可以属于几个用户,显然只能属于一个,userdetail到user表满足单向一对1,如果任意单向满足一对多,则为一对多关系,

    结论:双向一对一均成立,关系为一对一

    创建表注意事项:

    外键可以在两个表任何一方,一般放在主要频繁查询的表,如用户表

    2.OneToMany

    举例员工和部门表:

    1.核心思想:换位思考:

    一个部门可以有多个员工所以部门对员工为一对多,一个员工只能属于一个部门,员工对部门为1对一,所以判断任何一方满足一对多就为一对多,结论:

    部门与员工一对多关系

    2.创建表注意事项:a.外键foregin创建在多的一方 b.创建表时必须先创建references 的被关联表 c录入数据时也必须先录入被关联的表这里是dep表,为什么呢:

    因为employ有dep_id 字段,如果不先创建dep表无法获取到dep_id外键dep的主键(这里是默认id,实际开发可以指定其他字段)字段

    问题:如果现在我想修改或者删除dep的部门id ,则会报外键约束报错,如何实现同步删除更新呢?

    解决思路1:先删除/修改外键表数据,再删除/修改部门数据,(太繁琐,不适用)

    解决思路2:同步更新,同删除,俗称级联删除 CASCADE

    create   table emp (id int(64)  primary key auto_increment,
    emp_name  varchar(64),
    emp_id int(64) ,
    dep_id  int,
    foregin key(dep_id) refences dep(id)  
    on update cascade
    on detele cascade 
     )
    

      

    3.ManyToMany

    多对多关系:其实就是双向一对多,则满足多对多

    案例:图书表和作者表:假设可以这么写映射关系,发现两个表都有个外键字段,上面一对多介绍过单项一对多时都必须先创建外键表的被关联表references ,站在book表,你要先建author表由于外键author_id

    ,但是跑去创建author表,我靠你又需要先创建book表由于book_id外键,这样你先,你先,谁都别想create 成功

    问题思考:多对多实际无非就想直到书和作者关系,所以两个表无法实现的,需要借助第三张表,专门存储两张表的之间的关系,也就是储存他们的外键

    解决办法:

     创建表sql:

    create table book_author( id int primary key auto_increment,
    book_id int ,
    author_id int ,
    foregin key(book_id) refences book(id)  
    on update cascade
    on detele cascade ,
    foregin key(author_id) refences author(id)  
    on update cascade
    on detele cascade 
    );
    

      

  • 相关阅读:
    layDate关闭方法
    iOS Crash日志符号化
    图像压缩工具ImageOptim介绍
    UITextField设置光标位置
    Detect backspace in UITextField
    scrollsToTop小结
    查看UIWindows的视图层次
    弹出框适配总结
    关于IOS获取keyBoard键盘是否弹出
    UItableViewCell滑动删除时,调整cell子视图的位置大小
  • 原文地址:https://www.cnblogs.com/SunshineKimi/p/13800036.html
Copyright © 2011-2022 走看看