多对多自引用关系

4

我正在尝试使用SQL创建一个图书馆数据库,其中一个book_id推荐另一个book_id编号。

我创建的表如下:

   CREATE TABLE BOOK (
   Book_id INT NOT NULL,
   Book_name VARCHAR(40) NOT NULL,
   Description VARCHAR (100) NOT NULL,
   Image BLOB NOT NULL,
   Category_id INT NOT NULL,
   PRIMARY KEY (Book_id),
   FOREIGN KEY (Category_id) REFERENCES Category (Category_id)

我需要创建一个单独的表来强制执行这个多对多的自关系吗?

关联实体 - Ňɏssa Pøngjǣrdenlarp
1个回答

10
你可以创建一个类似这样的相关的多对多表:
CREATE TABLE RECOMMENDED_BOOKS (
   Book_id1 INT NOT NULL, // FK related to BOOK.Book_id
   Book_id2 INT NOT NULL), // FK related to BOOK.Book_id
   CONSTRAINT pk_RecommendedBooks PRIMARY KEY (Book_id1, Book_id2)
你可以添加任意数量的条目。例如,在Books表中id为1的书名是“哈克贝利·费恩历险记”,你可以将1添加为Book_id1的值,将2添加为Book_id2的值,其中第二本书是“汤姆·索亚历险记”;然后再加上“詹米·麦克菲特斯的旅行”作为另一个连接器,以此类推。

例如,如果这些内容在BOOK表中:

Book_id 1, Book_name "The Adventures of Huckleberry Finn"
Book_id 2, Book_name "The Adventures of Tom Sawyer"
Book_id 3, Book_name "The Travels of Jaimie McPheeters"
Book_id 4, Book_name "Westward Ho"
Book_id 5, Book_name "Main Traveled Roads"

...你可以添加这些记录:

INSERT INTO RECOMMENDED_BOOKS (Book_id1, Book_id2) VALUES (1, 2)
INSERT INTO RECOMMENDED_BOOKS (Book_id1, Book_id2) VALUES (1, 3)

是否插入“2,1”和“3,1”记录也取决于您是否希望能够说“喜欢《哈克贝利·费恩历险记》的人推荐《汤姆·索亚历险记》”,并且也可以说,“喜欢《汤姆·索亚历险记》的人推荐《哈克贝利·费恩历险记》”(或者是否应该将单向推荐视为未明确记录的双向推荐)。

此后应该能够确定书2(“汤姆·索亚历险记”)和书3(“杰米·麦克菲特斯的旅行”)之间存在联系,即使没有“2,3”记录。这有点像谚语中的“凯文·贝肯的七度分离” - 所有具有相互推荐的图书本身都是相互推荐的。或者,您也可以将连接限制为直接连接(“哈克贝利·费恩”连接到“汤姆·索亚”,但“汤姆·索亚”不连接到“杰米·麦克菲特斯”,除非插入2,3记录。

等等 - 您肯定明白我的意思。


1
自动递增列不是必需的。PRIMARY KEY 可以是 (book_id1, book_id2) - ypercubeᵀᴹ
无效的 CREATE SQL。 - geoidesic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接