我正在尝试使用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)
我是否需要创建一个单独的表来强制实施这种多对多的自我关系?
答案 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记录。
等。 - 你明白了。