2014-02-14 61 views
0

我正在閱讀Len Silverston的數據建模書籍。數據庫設計:迷惑Len Silverston的概念

例如,我們有兩個表:

enter image description here

倫·錫爾弗斯頓說:

主鍵被識別作爲主鍵 屬性的組合(具有識別「#」)以及與代字號關係指向的實體的主鍵。

Therefore the primary key to the ORDER ITEM is the order item seq ID 
plus the primary key of the order, order id. 

當我實現RDBMS(MySQL的)這個模型系統,我感到困惑的是:

  • 如何找到它們訂單的孩子的所有訂單項?

  • 當我們刪除一個訂單時,如何確保所有的訂單商品(訂單的子女)之前被刪除?

  • 如果訂單商品有多個外鍵會發生什麼?

回答

2

「因此到訂單項目的主鍵是訂單項目SEQ ID 加的順序的主鍵,訂單ID」。

看起來像一個identifying relationship 。或者是多對多關係的部分表示。

在任何情況下,上圖都是不完整的 - 它不顯示通過關係遷移的屬性。換句話說,「ORDER ITEM」實體中應該有一個「ORDER ID」屬性。

在這種情況下,在複合鍵中的屬性的順序應該被反轉(即,{「ORDER ID」,「SEQ ID」}),以物理cluster相同的順序的項目一起。


「如何找到它們訂單的孩子的所有訂單項?」

如果你已經知道訂單ID,那麼你可以:

SELECT * 
FROM "ORDER ITEM" 
WHERE "ORDER ID" = <known value> 

否則,您可以:

SELECT * 
FROM "ORDER ITEM" 
WHERE "ORDER ID" = (SELECT "ORDER ID" FROM ORDER WHERE <some search criteria>) 

甚至:

SELECT "ORDER"."ORDER ID", <other fields...> 
FROM "ORDER" JOIN "ORDER ITEM" ON "ORDER"."ORDER ID" = "ORDER ITEM"."ORDER ID" 
WHERE <some search criteria> 

「什麼時候我們刪除了一個訂單,如何確保所有訂單商品(訂單的子女)之前被刪除?「

也許最簡單的方法是使用了正確的級聯參照動作......

CREATE TABLE "ORDER ITEM" (
    ... 
    FOREIGN KEY ("ORDER ID") REFERENCES ORDER ("ORDER ID") ON DELETE CASCADE 
) 

...和DBMS會自動刪除當你刪除父相應的兒童。

否則,你可以手動刪除這樣的:

DELETE FROM "ORDER ITEM" 
WHERE "ORDER ID" = <known value> 

甚至:

DELETE FROM "ORDER ITEM" 
WHERE "ORDER ID" = (SELECT "ORDER ID" FROM ORDER WHERE <some search criteria>) 

「如果訂單項目有多於一個外鍵會發生什麼?」

沒什麼特別的。 DBMS將爲每個聲明的外鍵強制執行參照完整性。可以「合併」通過多個外鍵遷移的字段,這對於正確建模某些情況是必需的,而對於其他情況則完全錯誤。

有什麼具體的情況,你想知道更多關於?

+0

感謝您的回答。我的意思是'Plus'是a + b = c,並不意味着'Plus'是'include'。但你是真的,我已經研究過B2B,而且我不認爲這個建模太簡單。問題來自'Plus' :-) –