2016-03-03 64 views
0

我正在嘗試使用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

[關聯實體](https://en.wikipedia.org/wiki/Associative_entity) – Plutonix

回答

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表中,可以添加1作爲Book_id1和2的值作爲Book_id2的值,其中book 2是「Tom Sawyer」;然後添加 「賈米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」記錄取決於您是否希望能夠說「喜歡哈克芬的人推薦湯姆索耶」並且還說:「喜歡湯姆索耶的人推薦哈克芬「(或者單向推薦是否被認爲是雙向的而沒有明確的r據此)。

此後應該可以確定book2(「Tom Sawyer」)和book3(「Jaimie McPheeters的旅行」)之間存在關聯,儘管沒有「2,3」記錄。這有點像「凱文培根的七度」 - 所有有相互推薦的書本身都是相互推薦的。 OR,OTOH,你可以將你的連接限制爲直接連接(除非插入2,3條記錄,否則「Huck Finn」連接到「Tom Sawyer」,但是「Tom Sawyer」不連接到「Jamie McPheeters」)

+1

不需要自動遞增列,「PRIMARY KEY」可以是'(book_id1,book_id2)'。 –