数据库(六):多表关系

进击の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!

我们只需要在建立外键的时候,将外键的属性约束成唯一就行了

(这个一对一,建议你自己操作,师傅领进门,修行在个人!)


*****
*****
原文地址:https://www.cnblogs.com/jevious/p/11446904.html