它是最好的存儲枚舉值或數據庫表中的字段的枚舉名?枚舉存儲在數據庫領域
例如,我應該將'TJLeft'作爲字符串存儲還是將其存儲在數據庫中?
Public Enum TextJustification
TJLeft
TJCenter
TJRight
End Enum
我目前傾向於名稱爲一些以後可以一起走,並明確分配不同的值。
編輯 -
一些枚舉的是我的控制下,但也有一些來自第三方。
它是最好的存儲枚舉值或數據庫表中的字段的枚舉名?枚舉存儲在數據庫領域
例如,我應該將'TJLeft'作爲字符串存儲還是將其存儲在數據庫中?
Public Enum TextJustification
TJLeft
TJCenter
TJRight
End Enum
我目前傾向於名稱爲一些以後可以一起走,並明確分配不同的值。
編輯 -
一些枚舉的是我的控制下,但也有一些來自第三方。
存儲一個ID(值)和一個varchar名稱;這可以讓你以任何方式查詢。如果您的ID(值)稍後可能不同步,則搜索該名稱是合理的。
最好使用整數表示...如果你必須稍後改變Enum(添加更多的值等),你可以明確地分配整數值給枚舉值,這樣你的代碼中的Enum表示仍然匹配你有在數據庫中。
這取決於性能與可讀性的重要性。數據庫可以比字符串更容易索引數值,這意味着您可以在不使用更多內存的情況下獲得更好的性能。它也會減少通過電線的數據量。另一方面,當您查看數據庫中的數值時,您必須引用代碼文件進行翻譯,這可能很煩人。
在大多數情況下,我會建議使用該值,但是您需要確保明確設置這些值,以便在未來添加值時不會移動引用。
由於經常這取決於很多事情:
你想通過枚舉的自然順序進行排序?使用數字值。 您是否使用低級工具直接在數據庫中工作?使用該名稱。 你有大量的數據和性能是一個問題嗎?用數字
對我來說最重要的問題是大部分時間可維護性:
如果枚舉在未來改變,名稱要麼匹配正確的失敗,硬而響亮。有了數字,可以添加枚舉實例,更改所有枚舉的所有數字,因此您必須更新使用枚舉的所有表。而且幾乎沒有辦法知道你是否錯過了一張桌子。
存儲數值的另一個原因是,如果您在枚舉中使用[Flags]屬性,而您希望允許多個枚舉值。比方說,例如,你想讓某人選擇一週中的哪些日子,他們可以提供某些東西......
[Flags]
public enum WeekDays
{
Monday=1,
Tuesday=2,
Wednesday=4,
Thursday=8,
Friday=16
}
在這種情況下,你可以存儲在數據庫中的數值爲值的任意組合(例如,3 ==週一和週二)
我一直使用由字段的查詢表
dbscript讓我從我的查找表中生成C#代碼,所以我的代碼總是與數據庫同步。
對於您自己的枚舉,使用數字值有一個簡單的原因:它允許enum
的功能的每個部分,開箱即用,沒有麻煩。唯一需要注意的是,在enum
定義中,每個成員都必須明確給出一個數字值,這可以從不更改(或者至少在您完成第一次發佈之後)。我總是爲枚舉數據庫添加一個突出的評論,所以人們不會改變常量。
這裏有一些原因的數值比字符串標識符更好:
[Flags]
添加到您的enum
,而不是破壞您的代碼和/或現有數據[Flags]
存儲在一個字符串字段:
[Flags]
與否),如果數據庫進行模糊處理,該字段已經被處理,這大大地影響的能力和效率操作的方式檢索/分類代碼時,如在先前的點只有兩個地方使用數據庫中的成員名稱可能是有利的情況:
enum
。查找表,這是我極力勸阻,因爲他們是一個單向的子彈火車到維護的噩夢:
[Flags]
功能需要使用聯結表,這意味着更復雜的查詢(現有的查詢需要重寫)並增加了複雜性。現有的客戶數據呢?enum
值。然後我們甚至不會考慮[Flags]
枚舉。,如果你想獲得存儲在數據庫中回枚舉值,那就試試這個
EnumValue = DirectCast([Enum].Parse(GetType(TextJustification), reader.Item("put_field_name_here").ToString), TextJustification)
告訴我,如果你的作品
名稱映射到的值枚舉應該只在一個地方定義,這是枚舉的定義 – 2009-06-18 20:53:18