多对多的自我引用关系

时间:2016-03-03 21:42:50

标签: sql database many-to-many

我正在尝试使用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)

我是否需要创建一个单独的表来强制实施这种多对多的自我关系?

1 个答案:

答案 0 :(得分:1)

您可以像这样创建一个相关的“多对多”表:

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 =“Huckleberry Finn”,你可以将Book_id1的值加1,Book_id2的值加2,其中book 2是“Tom Sawyer”;然后添加“Jaimie McPheeters的旅行”作为另一个连接器等。

例如,如果它们在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”记录取决于您是否希望能够说“喜欢Huck Finn的人推荐Tom Sawyer”并且还说“喜欢Tom Sawyer的人”推荐Huck Finn“(或者单向推荐是否被认为是单向推荐而没有明确记录)。

此后应该可以确定book2(“Tom Sawyer”)和book3(“Jaimie McPheeters的旅行”)之间存在联系,即使没有“2,3”记录。这有点像众所周知的“七度凯文培根” - 所有相互推荐的书本身都是相互推荐的。或者,OTOH,您可以将您的连接限制为直接连接(“Huck Finn”连接到“Tom Sawyer”,但“Tom Sawyer”不连接到“Jamie McPheeters”,除非您插入2,3记录。

等。 - 你明白了。