2013-06-24 48 views
2

我正在設計一個數據庫(用於mysql),允許新的用戶定義屬性到一個名爲節點的實體。數據庫設計 - 自定義屬性表 - 與「相關」實體表

爲了實現這一點,我創建了2個其他表。一個customvars表中包含所有自定義屬性和一個* nodes_customvars *,這些屬性定義了節點customvars之間的關係,創建1..n和n..1的關係。

這裏是他鏈接到drawed型號:Sketched database model

到目前爲止好......但我不能夠正確處理使用單獨的ID爲每個表INSERT和UPDATE。

例如,如果我有一個自定義屬性,叫做顏色在* nodes_customvars *表插入特定節點,如果我嘗試「INSERT ... ON DUPLICATE KEY UPDATE」要麼總是插入或者總是更新。

我鑫卡特從* nodes_customvars *表中刪除了「ID」字段,並使用節點IDcustomvarsID使它成爲一個複合鍵,但我不知道這是我讀過的最好的解決辦法...

這篇文章,評論,還有:http://weblogs.sqlteam.com/jeffs/archive/2007/08/23/composite_primary_keys.aspx

什麼是對此最好的解決方案?

編輯:

補全:我不知道* nodes_customvars * ID,只有節點IDcustomvarsID。分析* nodes_customvars *表:

1 - 如果我讓節點ID和/或customvarsID UNIQUE在此表中,使用 「INSERT ... ON DUPLICATE KEY UPDATE」 會隨時更新。由於多個節點可以共享相同的customvar,這是錯誤的;

2 - 如果我不作任何UNIQUE鍵, 「INSERT ... ON DUPLICATE KEY UPDATE」 總是插入,因爲沒有唯一密鑰在聲明中已經找到......

+0

nodes_customvars描述節點和customvars之間的多對多的關係。所以在技術上node_customvars PK應該是一個複合關鍵 – SyntaxGoonoo

回答

0

對於解決「INSERT ... ON DUPLICATE KEY」的特定問題,您有兩種選擇,要麼始終按照描述插入或更新。

  1. 更改主要使用的NodeId和customvarId(由SyntaxGoonoo和在作爲可能的選擇您的問題的建議)的複合密鑰。

  2. 使用nodeId和customvarId添加複合唯一索引。

    CREATE UNIQUE INDEX IX_NODES_CUSTOMVARS ON NODES_CUSTOMVARS(nodeId, customvarId); 
    

兩個選項將允許「INSERT ... ON重複鍵」功能,根據您的需要(INSERT,如果節點ID和customvarId的獨特組合,不存在工作;如果更新它確實)。

至於是否有複合主鍵或帶有附加唯一索引的單獨主鍵列的問題,在設計中需要考慮很多事項。有1NF的考慮因素和您正在使用的數據庫平臺的物理特性以及您正在使用的ORM的偏好(如果有的話)。鑑於InnoDB二級索引的工作方式(請參見最後一段:http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html),我建議您保留現有的設計並添加額外的唯一索引。

HTH,

-Dipin

+0

非常感謝你! –

0

您當前實體設計打破1NF。這意味着您的模式可能會錯誤地存儲重複數據。

nodes_customvars描述了nodescustomvars之間的多對多關係。這種類型的表有時被稱爲輔助表,因爲其內容純粹是從基表(在這種情況下是節點和定製表)派生而來的。

描述多對多關係的輔助表的PK應該是一個組合鍵,以防止重複。基本上是1NF。

表上的任何PK本質上都是唯一的。不管它是單一的還是複合鍵。所以在某些方面你的問題沒有意義,因爲你在談論如何在id上打開/關閉UNIQUE約束nodescustomvars。如果你的id實際上是PK,那麼你不能這樣做。

那麼你究竟想在這裏實現什麼?

+0

好的...我不知道那... node_customvars表創建只是爲了尊重NFs,因爲節點x customvars是一個多對多的關係。但我不知道我必須使用組合鍵而不是新的PK ...我正在嘗試爲節點創建用戶定義的屬性...我不知道實現這個目的的最佳實踐是什麼。 ..其他鏈接: - http://stackoverflow.com/questions/5106335/how-to-design-a-database-for-user-defined-fields; http://stackoverflow.com/questions/870808/entity-attribute-value-database-vs-strict-relational-model-ecommerce-question –