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
);