進擊の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!
我們只需要在建立外鍵的時候,將外鍵的屬性約束成唯一就行了
(這個一對一,建議你自己操作,師傅領進門,修行在個人!)