2013-02-24 187 views
0

我想了解實體,表和外鍵。我有以下幾點: -關係數據庫設計

AnObject - 我已經確定這是一個實體類型。

ID (Primary Key)  
Description  
State  
DependsOn  
Creator 

現在狀態只有兩個值,它可以是[Alive, Dead]。然而,它未來可能會有另一個。它可能只是一個或另一個,但它們之間可能會發生變化。

問:

應該說明是自己的實體類型?它會是一個實體類型還是 只是一個表格?國家應該有一個外鍵的AnObject或副 ? EG

國家

ID (PK) 
Description 
AnObject_ID (Foreign Key references AnObject) 

問題:AnObject的DependsOn屬性可以有其他AnObject實體類型的多個值。顯然一個字段不能有多個值,但我不知道如何建模?

AnObject的Creator屬性也佔用了嚴格的數值[Fred,Jim,Dean]。我是否應該爲具有AnObject ID的外鍵的Creator創建一個實體類型(表格)?因此,創作者可以創建0,1,m AnObjects,但AnObject只能有一個創作者?

感謝,

回答

0

國家可能僅僅是一個enum場,除非你需要用戶能夠通過用戶界面添加其他國家的價值觀,在這種情況下,你可以使用一個查找表(一個一對多關係),如你所建議的。我不知道你使用的是什麼數據庫,但是這裏有關於MySQL中的enum類型的一些信息:http://dev.mysql.com/doc/refman/5.6/en/enum.html

如果使用查找表,那麼AnObject應該有一個名爲StateID的字段,該字段指向State表中所需的行。

聽起來像DependsOn是一個多對多的關係。對於您將需要一個連接表,例如:

Table: Dependencies 

Primary key (called a "composite key" because it's made up of more than one field): 
    AnObjectParentID 
    AnObjectChildID 

我認爲是需要的父子關係的依賴,但如果情況並非如此,你可能要命名錶或字段不同。

0

您可以使用AnObject的外鍵向枚舉值添加額外的表。狀態可能會被最好地表示爲varchar不爲null的單個字段。你可以讓一個表的主鍵是一個varchar字段 - 它們不一定是int類型。

這將限制值,但允許你使用合理的語法來查詢事物(即WHERE狀態='活着'(儘管在這種情況下,我認爲你過早地抽象了事物 - 我會保持簡單和公正有一個簡單的布爾列IsDead)。

DependsOn是一個單向的屬性(你大概不能有依賴於B以及乙依賴於A)。這裏真正的問題是你如何打算查詢這些項目以及它們將會有多少如果你想一次拉出整個鏈的鏈,並且鏈很長,那麼你想要避免做數百個單獨的查詢來做到這一點。你的用例是什麼?