在MySQL中创建一对多的关系

时间:2014-06-04 21:56:57

标签: mysql sql

我有两张桌子,一张是任意一排书,另一张是特定的主题和ids行。

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的数组?

然后我可以在书籍表上查询哪些书与一个主题相关吗?

1 个答案:

答案 0 :(得分:2)

这是一种多对多的关系,而不是一对多的关系。 (一本书可以有几个科目,一个科目可以有几本书。)

规范模式是实施第三个表来存储书籍和主题之间的“关系”。

作为最小关系表的一个例子:

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相关。


检索与特定books相关的subjects的查询将涉及对books_subjects表的JOIN操作。

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

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

查找没有任何books的{​​{1}},例如

subjects

注意:我通常使用表格的单数名称。因此,我的列名和外键名中的“s”字符会少得多。我可能在打字时省略了“s”或两个。