数据库(六):多表关系
进击のpython
数据库——多表关系
多表问题其实可以把它变成两个表之间的关系
就像上一节我们提到的外键,就是两个表之间的关系
所以对于多表之间的关系,我们可以化繁为简讨论两个表之间的关系
表与表之间的关系就好像数学函数的y和x的关系,也分为三种:
一对一,多对一,多对多~
多对一
怎么说呢?其实上一节我们做的那个外键表就是一个多对一模式
怎么叫做多对一呢?有个十分简单的的方法来解决这个问题
还是拿上一个举例子~ staff员工表和department职位表
盘腿坐下思考两个问题:
小张能不能既属于技术部,又属于财务部?不能!
技术部可不可以有小刘和小李两个人?能!
这样一面行,另一面不行,就是多对一
能的 就是被关联的表,所以 部门就是被关联的!
再来个例子:出版社 书
盘腿坐下思考两个问题:
书能不能被多个出版社出版?不能!
出版社能不能有多本书?能!
那知道了吧,这就是多对一
所以 书 就应该用 forgen... ...,出版社就是被关联的表~
(自己试着把这个敲一遍)
多对多
多对多就更好玩了,书 作者
我们继续盘腿思考:
书能不能有多个作者?能!
一个作者能不能写多本书?能!
这就相当于什么?两边都是多对一,双向的多对一,所以就是多对多
但是怎么建呢???按照这个逻辑,这两个表彼此应该都有外键
而前面学习到的是有外键要先建被关联的表,A的外键是B,B的外键是A,好家伙~死循环了
那针对这个问题聪明的人想出了一种解决办法:
这么僵持指定是没有解决办法,于是想到,我们可以把这种外键的关联信息,存到另一个表里
这样,这两个表在建立的时候,就不会因为没有外键而建不出来了
author:
id | author |
---|---|
1 | tom |
2 | alex |
3 | jerry |
4 | john |
5 | boss |
6 | alise |
book:
id | book |
---|---|
1 | Red_Ball |
2 | Sun_raise |
3 | Green_tree |
author2book:
author_id | book_id |
---|---|
1 | 1 |
2 | 3 |
3 | 2 |
4 | 1 |
5 | 3 |
6 | 1 |
mysql> select * from book;
+----+------------+
| id | name |
+----+------------+
| 1 | Red_Ball |
| 2 | Sun_raise |
| 3 | Green_tree |
+----+------------+
3 rows in set (0.00 sec)
mysql> select * from author;
+----+-------+
| id | name |
+----+-------+
| 1 | tom |
| 2 | alex |
| 3 | jerry |
| 4 | john |
| 5 | boss |
| 6 | alise |
+----+-------+
6 rows in set (0.00 sec)
然后就开始建第三个表:
mysql> create table author2book(
->
-> id int not null unique auto_increment,
-> author_id int not null,
-> book_id int not null,
->
-> foreign key(author_id) references author(id)
-> on delete cascade
-> on update cascade,
->
-> foreign key(book_id) references book(id)
-> on delete cascade
-> on update cascade,
->
-> primary key(author_id,book_id)
-> );
Query OK, 0 rows affected (1.64 sec)
mysql> select * from author2book;
+----+-----------+---------+
| id | author_id | book_id |
+----+-----------+---------+
| 1 | 1 | 1 |
| 2 | 2 | 3 |
| 3 | 3 | 2 |
| 4 | 4 | 1 |
| 5 | 5 | 3 |
| 6 | 6 | 1 |
+----+-----------+---------+
6 rows in set (0.00 sec)
这就算是建好了联系
一对一
男女之间总是要结婚的,那此时就会出现一对一的情况
一个名单是男,一个名单是女,那这两个一定是一一对应的才是合理的,那这就是,一对一的情况
外键通过前面的你也发现了,forgen这个创造外键的方式创造的是多对一的方式
那如何才能让他一对一呢?其实问题就在于,添加的键有重复才会让其变成多对一的情况
那变成一对一就是让数据部从夫,数据不重复用的是什么约束?unique!
我们只需要在建立外键的时候,将外键的属性约束成唯一就行了
(这个一对一,建议你自己操作,师傅领进门,修行在个人!)