五、表的關聯關係
阿新 • • 發佈:2022-05-21
五、表的關聯關係
一對多關係為關係資料庫中兩個表之間的一種關係,該關係中第一個表中的單個行可以與第二個表中的一個或多個行相關,但第二個表中的一個行只可以與第一個表中的一個行相關。
-- 書籍表 CREATE TABLE book( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(32), price DOUBLE(5,2), pub_id INT NOT NULL )ENGINE=INNODB CHARSET=utf8; -- 出版社表 CREATE TABLE publisher( id INT PRIMARY KEY AUTO_INCREMENT, nameVARCHAR(32), email VARCHAR(32), addr VARCHAR(32) )ENGINE=INNODB CHARSET=utf8; -- 插入資料 INSERT INTO book(title,price,pub_id) VALUES ('西遊記',15,1), ('三國演義',45,2), ('紅樓夢',66,3), ('水滸傳',21,2), ('紅與黑',67,3), ('亂世佳人',44,6), ('飄',56,1), ('放風箏的人',78,3); INSERT INTO publisher(id,name,email,addr) VALUES (1,'清華出版社',"123","bj"), (2,'北大出版社',"234","bj"), (3,'機械工業出版社',"345","nj"), (4,'郵電出版社',"456","nj"), (5,'電子工業出版社',"567","bj"), (6,'人民大學出版社',"678","bj");
mysql> select * from book; +----+------------+-------+--------+ | id | title | price | pub_id | +----+------------+-------+--------+ | 1 | 西遊記 |15.00 | 1 | | 2 | 三國演義 | 45.00 | 2 | | 3 | 紅樓夢 | 66.00 | 3 | | 4 | 水滸傳 | 21.00 | 2 | | 5 | 紅與黑 | 67.00 | 3 | | 6 | 亂世佳人 | 44.00 | 6 | | 7 | 飄 | 56.00 | 1 | | 8 | 放風箏的人 | 78.00 | 3 | +----+------------+-------+--------+ 8 rows in set (0.00 sec) mysql> select * from publisher; +----+----------------+-------+------+ | id | name | email | addr | +----+----------------+-------+------+ | 1 | 清華出版社 | 123 | bj | | 2 | 北大出版社 | 234 | bj | | 3 | 機械工業出版社 | 345 | nj | | 4 | 郵電出版社 | 456 | nj | | 5 | 電子工業出版社 | 567 | bj | | 6 | 人民大學出版社 | 678 | bj | +----+----------------+-------+------+ 6 rows in set (0.00 sec)
5.2、多對多
多對多,在資料庫中也比較常見,可以理解為是一對多和多對一的組合。要實現多對多,一般都需要有一張中間表(也叫關聯表),將兩張表進行關聯,形成多對多的形式。
比如一本書有多個作者,一個作者可以出版多本書籍。
-- 作者表 CREATE TABLE author( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(32) NOT NULL )ENGINE=INNODB CHARSET=utf8; -- 作者表和書籍表的多對多關係表 CREATE TABLE book2author( id INT NOT NULL UNIQUE AUTO_INCREMENT, author_id INT NOT NULL, book_id INT NOT NULL )ENGINE=INNODB CHARSET=utf8; -- 插入資料 INSERT INTO author(NAME) VALUES ('yuan'), ('rain'), ('alvin'), ('eric'); -- 插入關係資料 INSERT INTO book2author(author_id,book_id) VALUES (1,1), (1,2), (2,1), (3,3), (3,4), (1,3);
5.3、一對一
一對一是將資料表“垂直切分”,其實是不常見,或不常用的。也就是 A 表的一條記錄對應 B 表的一條記錄。
場景:
- 一個系統必然有 Employee(員工表)(包含欄位:EmployeeId、姓名、性別、年齡、電話、地址等),每個員工都為一個使用者,所以還有張 User 表(包含欄位:UserId(關聯 EmployeeId)、使用者名稱、密碼、角色等),這樣你會發現,整合為一張表是否不太妥當?因為,User 的記錄只會在登入時用到,感覺有點違背三大正規化中的“確保每列都和主鍵列直接關聯,而不是間接關聯”。
- 還有種情況,這就要根據具體的業務來決定了。如果,當一張表的欄位過於太多,而很多欄位可能只有在某些情況下,才會使用到,這時也可以考慮使用一對一設計。
在我們這個例子中,比如,作者表可以有一張一對一的作者詳細資訊表。
CREATE TABLE authorDetail( id INT PRIMARY KEY AUTO_INCREMENT, tel VARCHAR(32), addr VARCHAR(32), author_id INT NOT NULL unique -- 也可以給author新增一個關聯欄位: alter table author add authorDetail_id INT NOT NULL )ENGINE=INNODB CHARSET=utf8; -- 插入資料 INSERT INTO authorDetail(tel,addr,author_id) VALUES ("110","北京",1), ("911","成都",2), ("119","上海",3), ("111","廣州",4);
區別於一對多,關聯欄位加唯一約束!