2010-11-18 103 views
3

什麼是存儲枚舉的最佳方式? 例如,我有一個實體Person,它擁有一個屬性Sex。我能想到的第一個選項是一個存儲枚舉值和名稱的表(1表示男性,2表示女性),然後在Person表中存儲int值。第二個選項是在代碼中枚舉一個相應的int值,並在Person表中存儲int值。最後一個選項是再次枚舉代碼並存儲字符串值。例如,性別爲'男'的人。什麼時候應該使用存儲在數據庫中的枚舉和代碼中的枚舉?

哪種方法更好,什麼時候?

回答

5

代碼中的枚舉很酷且方便,但是在更改枚舉時可以破壞數據庫的完整性。

所以一般情況下:當需要關係完整性時,在數據庫中使用枚舉。我們在代碼中使用顯式映射枚舉來處理這個問題;並在數據庫中強制執行完整性。像:

| Id | Value | 
--------------- 
| 1 | Male | 
| 2 | Female | 

// FK from the table above to the table containing all your data, and in code: 

enum Gender { Male = 1, Female = 2 } 

何時只在代碼中使用枚舉?
F.e. Bitmasking!因此,您可以在您的數據庫中有效存儲一些在您的應用程序中才有意義的設置。誠信並不真正關心,因爲數據庫與此無關。

1

對於這個特定的例子,性別將永遠是男性或女性,所以使數據庫攜帶的靜態細節不是很有益。

但是有一些枚舉更具動態性,就像一個商店有枚舉Visa和萬事達卡。可能以後他們將不得不添加Discover和Amex,此時數據庫枚舉更有用,因爲您也可以動態地在代碼中處理它。

1

第三個選項(存儲字符串值)是最差的:然後您需要在字符串和枚舉之間進行轉換。將枚舉存儲爲int更好,因爲枚舉本身基本上是整數,所以來回投射便宜。

是否將查找存儲在數據庫中取決於您想要在數據庫中執行的操作:對該表使用外鍵引用將確保只存儲正確的值。但是你也可以決定你的程序總是存儲一個正確的值,因爲它來自你的枚舉。

1

我會使用兩者。你應該以任何方式限制你的數據庫,所以你不能輸入任何無效的值。如果您不這樣做,您將能夠從您的程序或可能使用相同數據庫的任何其他(未來)程序中插入無效值。

您確實可以使用包含所有性別的表,因爲這樣可以允許外鍵約束,從而實施正確的數據。你也可以很容易地擴展表格的額外值,儘管這在性別的情況下可能沒有用處。

但是我也可以理解,如果有人想讓它成爲一個可以包含M,F和可能包含一些其他值的字符(1)字段,則這兩個值都代表未知的,都不是(都取決於存儲在數據庫中的物種)。

但是在此之後,在代碼中創建枚舉仍然很方便,您可以使用它來輕鬆轉換這些數據庫值。如果你實際上是「女性」,你不會希望在值得使用值'2',所以你會想要使用枚舉或至少一些直接或間接映射的常量,因爲抽象是數據庫中的關鍵開發 - 到數據庫中的實際值。

0

如果某些其他應用程序,報告系統等可能需要數據,則將數據存儲在數據庫中。

0

如果正確使用約束,數據庫枚舉肯定更有用。

Person 
Name |Age |Gender |FK_Country_ID| 
-------|------|-------|-------------| 
varchar|int |bit |int   | 

Country 
CountryID|Country| 
---------|-------| 
int  |varchar| 

Person 0.* ----- 1 Country 

一個外鍵約束將確保您的數據在數據庫中插入或更新有效。硬編碼的枚舉將迫使你稍後重新編譯你的代碼。閱讀外鍵值並提供動態查找是更好的做法。

1

您應該使用兩者,但它們應該存儲在數據庫中。如果您使用Visual Studio,則可以創建自定義T4(文本模板轉換工具包)模板(.tt文件)。這將允許您直接根據存儲在數據庫中的內容創建類/枚舉。您將獲得右鍵單擊該tt文件的能力,選擇「運行自定義工具」並讓您的c#文件從您存儲在數據庫中的內容中進行更新。