多对多自引用关系
Many to Many Self referencing relationship
我正在尝试使用 SQL 创建一个图书馆数据库,其中一个 book_id 推荐另一个 book_id 号码。
我创建的table如下:
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)
我是否需要创建一个单独的 table 来加强这种多对多的自我关系?
您可以像这样创建一个相关的多对多 table:
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)
然后您可以添加任意数量的条目。假设 id 1 = "Huckleberry Finn" 在 Books table 中,你可以将 1 添加为 Book_id1 的值,将 2 添加为 Book_id2 的值,其中 book 2 为 [=28] =];然后添加 "The Travels of Jaimie McPheeters" 作为另一个连接器,等等
例如,如果这些在书里 table:
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”记录取决于您是否希望能够说 "people who liked Huck Finn recommend Tom Sawyer" 以及 "people who liked Tom Sawyer recommend Huck Finn"(或者是否单向推荐被认为是双向的,没有明确记录)。
此后应该可以确定book2("Tom Sawyer")和book3("The Travels of Jaimie McPheeters")之间存在联系,即使没有“2,3”记录。这有点像谚语 "Seven Degrees of Kevin Bacon" - 所有相互推荐的书本身就是相互推荐的。或者,OTOH,您可以将连接限制为直接连接("Huck Finn" 连接到 "Tom Sawyer" 但 "Tom Sawyer" 不连接到 "Jamie McPheeters" 除非您插入 2,3 记录.
等- 你明白我的意思了,我敢肯定。
我正在尝试使用 SQL 创建一个图书馆数据库,其中一个 book_id 推荐另一个 book_id 号码。
我创建的table如下:
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)
我是否需要创建一个单独的 table 来加强这种多对多的自我关系?
您可以像这样创建一个相关的多对多 table:
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)
然后您可以添加任意数量的条目。假设 id 1 = "Huckleberry Finn" 在 Books table 中,你可以将 1 添加为 Book_id1 的值,将 2 添加为 Book_id2 的值,其中 book 2 为 [=28] =];然后添加 "The Travels of Jaimie McPheeters" 作为另一个连接器,等等
例如,如果这些在书里 table:
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”记录取决于您是否希望能够说 "people who liked Huck Finn recommend Tom Sawyer" 以及 "people who liked Tom Sawyer recommend Huck Finn"(或者是否单向推荐被认为是双向的,没有明确记录)。
此后应该可以确定book2("Tom Sawyer")和book3("The Travels of Jaimie McPheeters")之间存在联系,即使没有“2,3”记录。这有点像谚语 "Seven Degrees of Kevin Bacon" - 所有相互推荐的书本身就是相互推荐的。或者,OTOH,您可以将连接限制为直接连接("Huck Finn" 连接到 "Tom Sawyer" 但 "Tom Sawyer" 不连接到 "Jamie McPheeters" 除非您插入 2,3 记录.
等- 你明白我的意思了,我敢肯定。