2010-09-09 33 views
0

我有一個表,我必須將主鍵相互關聯。除了它們存在以外,沒有關於這些組的信息。具體而言,我將書籍版本組合在一起,因此我可以知道某組書籍是彼此的版本。一對多表設置

我目前有一個設置,我有一個版本_Group_ISBN列,其中一個ISBN是任意選擇的,以將一組版本組合在一起。

這個問題的典型方法是有一個像Book_Editions這樣的單獨表格,其中我會有一個自動增量整數主鍵,如將Editions鏈接在一起的「Edition_Group_ID」。我被告知這種方法是可取的。

但是,實現該系統的問題與加載數據有關。我如何動態加載版本組?一種解決方案可能是鎖定表格並對自動增量中的下一個ID進行交易。不過,我想這會比我現在的方法更慢,更麻煩。

鑑於在該系統下插入數據的困難,解決此問題的最佳系統是什麼?

+0

如何(在你的進程時)你確定哪些書都涉及到一個另一個? – 2010-09-09 17:38:16

+0

每當用戶搜索書籍(通過ISBN,標題,作者或其他方式) – babonk 2010-09-09 22:26:00

回答

1

您可以通過在版本組表中使用ISBN表外鍵加載版本組,然後使用ISBN書籍表的主鍵和查詢的外鍵在查詢中內部連接兩個表聯接中的「版本組」表。

ISBN Table 
    ISBN_ID         // Auto-incrementing Primary Key 
    ISBN 
    Book_Title 
    .etc 

EDITIONS Table 
    Edition_ID 
    FIRST_EDITION_ISBN_ID 
    ASSOCIATED_ISBN_ID       // Foreign Key to ISBN table 

大多數數據庫系統有一個方法返回一個新插入的記錄的主鍵ID,所以:

NEW_ID = INSERT INTO ISBN (ISBN, BOOK_TITLE) 
     VALUES (12345678, "The Frog Prince"); 
     SELECT SCOPE_IDENTITY();    // Returns new ID from ISBN table. 

INSERT INTO EDITIONS (FIRST_EDITION_ISBN_ID, ASSOCIATED_ISBN_ID) 
    VALUES (12345678, NEW_ID); 
+0

您可以舉一個INSERT查詢的例子嗎? – babonk 2010-09-09 02:46:56

+0

在MySQL中,SCOPE_IDENTITY()的等價物是LAST_INSERT_ID()。該功能是否可以動態添加數據?我是否需要鎖定表格,以便在查詢之間沒有新的ID?不知道如何設置查詢... – babonk 2010-09-09 02:58:01

+0

另外,有關你的表設置的一個問題。爲什麼需要Edition_ID?爲什麼不把(FIRST_EDITION_ISBN_ID和ASSOCIATED_ISBN_ID)作爲主鍵? – babonk 2010-09-09 02:58:49