簡體   English   中英

在MySQL中建立一對多關系

[英]Create a one to many relationship in MySQL

我有兩張桌子,一張桌子有任意行的書,另一張桌子有特定行的主題和ID。

mysql> describe books;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | YES  |     | NULL    |       |
| title | varchar(250) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+


mysql> describe subjects;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id       | int(11)      | YES  |     | NULL    |       |
| subjects | varchar(250) | YES  |     | NULL    |       |
+----------+--------------+------+-----+---------+-------+

我想將一本書與許多主題ID相關聯,是否可以使用任何數組類型,以便我的Books表中的一列包含一組不同的主題ID?

然后,我可以在“圖書”表上進行查詢以查看哪些圖書與一個主題相關嗎?

這是多對多的關系,而不是一對多的關系。 (一本書可以包含多個主題,而一個主題可以包含多個書籍。)

規范模式是實現第三個表來存儲書籍和主題之間的“關系”。

作為最小關系表的示例:

CREATE TABLE books_subjects
( subjects_id  INT(11) NOT NULL COMMENT 'PK, FK ref subjects(id)'
, books_id     INT(11) NOT NULL COMMENT 'PK, FK ref books(id)'
, PRIMARY KEY (subjects_id, books_id)
);

對於InnoDB,我們可以定義外鍵約束:

ALTER TABLE books_subjects ADD CONSTRAINT FK_books_subjects_books
  FOREIGN KEY (books_id) REFERENCES books(id);

ALTER TABLE books_subjects ADD CONSTRAINT FK_books_subjects_subjects
  FOREIGN KEY (subjects_id) REFERENCES subjects(id);

這有效地將多對多關系分解為兩個一對多關系。

books可以有多個books_subjects ,但是books_subjects與一books完全相關。

一個subjects可以有多個books_subjects ,但是一個books_subjects恰好與一個subjects


檢索與特定subjects相關的books查詢將涉及到books_subjects表的JOIN操作。

例如,要查找所有特定subjects books

SELECT b.id
     , b.title
  FROM books b
  JOIN books_subjects j
    ON j.books_id = b.id
  JOIN subjects s
    ON s.id = j.subjects_id
 WHERE s.subjects = 'Psychology'
 ORDER BY b.title

查找沒有任何subjects books ,例如

SELECT b.id
     , b.title
  FROM books b
  LEFT
  JOIN books_subjects j
    ON j.books_id = b.id
 WHERE j.books_id IS NULL
 ORDER BY b.title

注意:我通常對表使用單數名稱。 因此,列名和外鍵名中的“ s”字符會少很多。 我在鍵入時可能省略了一個或兩個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM