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_increament,
- 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
- );
来源: http://www.bubuko.com/infodetail-3682103.html