2009-08-14 98 views
2

假設我希望表Regions中的條目具有類型,例如,一個城市,一個國家等等。假設我將使用O/RM(在我的情況下爲NHibernate),什麼是存儲此類型的可接受方式?我看到兩個選項:數據庫中的枚舉和O/RM

  • 在C#bussines圖層中使用類型枚舉enum,並在表中將類型存儲爲tinyint
  • 查找表RegionTypes帶有類型標識符(字符串或整數),並在Regions表中引用它們。

從數據庫的角度來看,第二種方法似乎更合理,因爲我有外鍵約束,再加上我可以有關於區域類型的其他數據,例如,一個城市是一個國家的孩子類型(因爲我使用的是SQL Server 2008空間特徵,實際上我需要這些信息進行空間操作)。然而,從C#的角度來看,我基本上必須有一個實體RegionType並從數據庫中加載它每次我想分配給一個區域(因爲我明白NHibernate不會讓我做的類型一個枚舉,如果我將它存儲在查找表中)。這對於這樣一個簡單的任務來說有點乏味,因爲他們知道區域類型基本上是固定的,不太可能改變。

其他類型,如DayOfWeek哪些不可能改變或具有附加屬性,如果他們有他們的查找表和實體呢?

回答

2

一般規則是使用枚舉 s如果您確定該值不會被更改由用戶。否則,最好使用查找表。

0

雖然我通常會使用後一種選項,但我會創建一個通用的排列方式,將多個類型的項存儲在同一個表中,以便最終不會生成15個類型的表。基本是這樣的

Types 
    TypeID int, 
    Name varchar(20), 
    Description varchar(100) 

Type_Items 
    ItemID int, 
    TypeID int -> Types.TypeID, 
    Name varchar(20), 
    Description varchar(100), 
    Value varchar(100) 
+0

這將是一個很好且有效的查找/參考系統,但在數據庫關係完整性方面完全無效。 – 2009-08-14 18:20:50

+0

@Philip:怎麼樣? – 2009-08-14 18:39:14

+0

除非完整的主鍵(Type + Id)出現在* both * parent和child表中,否則您將無法將外鍵約束設置到查找表中。 RDBMS在執行關係完整性方面非常優秀,我不想失去這種內置功能。 – 2009-08-14 19:09:28

1

一個原因使用查找表是在菜單或顯示的東西可能值的常見情況。查詢查詢表很容易,但如果enum在數據庫數據類型或約束中或在C#枚舉中進行了硬編碼,則不太容易。