2009-06-18 144 views
3

它是最好的存儲枚舉值數據庫表中的字段的枚舉枚舉存儲在數據庫領域

例如,我應該將'TJLeft'作爲字符串存儲還是將其存儲在數據庫中?

Public Enum TextJustification 
    TJLeft 
    TJCenter 
    TJRight 
End Enum

我目前傾向於名稱爲一些以後可以一起走,並明確分配不同的值。

編輯 -

一些枚舉的是我的控制下,但也有一些來自第三方。

回答

0

存儲一個ID(值)和一個varchar名稱;這可以讓你以任何方式查詢。如果您的ID(值)稍後可能不同步,則搜索該名稱是合理的。

+0

名稱映射到的值枚舉應該只在一個地方定義,這是枚舉的定義 – 2009-06-18 20:53:18

0

最好使用整數表示...如果你必須稍後改變Enum(添加更多的值等),你可以明確地分配整數值給枚舉值,這樣你的代碼中的Enum表示仍然匹配你有在數據庫中。

0

這取決於性能與可讀性的重要性。數據庫可以比字符串更容易索引數值,這意味着您可以在不使用更多內存的情況下獲得更好的性能。它也會減少通過電線的數據量。另一方面,當您查看數據庫中的數值時,您必須引用代碼文件進行翻譯,這可能很煩人。

在大多數情況下,我會建議使用該值,但是您需要確保明確設置這些值,以便在未來添加值時不會移動引用。

0

由於經常這取決於很多事情:

你想通過枚舉的自然順序進行排序?使用數字值。 您是否使用低級工具直接在數據庫中工作?使用該名稱。 你有大量的數據和性能是一個問題嗎?用數字

對我來說最重要的問題是大部分時間可維護性:

如果枚舉在未來改變,名稱要麼匹配正確的失敗,硬而響亮​​。有了數字,可以添加枚舉實例,更改所有枚舉的所有數字,因此您必須更新使用枚舉的所有表。而且幾乎沒有辦法知道你是否錯過了一張桌子。

5

存儲數值的另一個原因是,如果您在枚舉中使用[Flags]屬性,而您希望允許多個枚舉值。比方說,例如,你想讓某人選擇一週中的哪些日子,他們可以提供某些東西......

[Flags] 
public enum WeekDays  
{ 
    Monday=1, 
    Tuesday=2, 
    Wednesday=4, 
    Thursday=8, 
    Friday=16 
} 

在這種情況下,你可以存儲在數據庫中的數值爲值的任意組合(例如,3 ==週一和週二)

1

我一直使用由字段的查詢表

  • OID INT(PK)作爲數字值
  • 的ProgID VARCHAR(獨特)作爲值在C#標識符(即常量名,或枚舉符號)
  • ID N varchar作爲顯示值(UI)

dbscript讓我從我的查找表中生成C#代碼,所以我的代碼總是與數據庫同步。

2

對於您自己的枚舉,使用數字值有一個簡單的原因:它允許enum的功能的每個部分,開箱即用,沒有麻煩。唯一需要注意的是,在enum定義中,每個成員都必須明確給出一個數字值,這可以從不更改(或者至少在您完成第一次發佈之後)。我總是爲枚舉數據庫添加一個突出的評論,所以人們不會改變常量。

這裏有一些原因的數值比字符串標識符更好:

  • 它是代表值的最簡單方法
  • 數據庫搜索/排序更快
  • 降低數據庫存儲成本(其對於某些應用可能是嚴重問題)
  • 您可以將[Flags]添加到您的enum,而不是破壞您的代碼和/或現有數據
  • 對於[Flags]存儲在一個字符串字段:
    • 不佳的標準化數據
    • 做匹配(即當
    • 可能會產生假陽性異常,如果你有「銷售」和「零售額」的成員,只是做了一個字符串搜索「銷售」將在任何一種類型上匹配)。這必須通過在字邊界上使用正則表達式(finicky使用數據庫和緩慢)或限制枚舉本身來限制,這是非標準的,容易出錯並且非常難以調試。
  • 對於字符串字段(或者[Flags]與否),如果數據庫進行模糊處理,該字段已經被處理,這大大地影響的能力和效率操作的方式檢索/分類代碼時,如在先前的點
  • 提到
  • 您可以在不破壞數據庫代碼和/或現有客戶端數據的情況下重命名任何成員。
  • 少過的線數據傳輸的空間/時間需要

只有兩個地方使用數據庫中的成員名稱可能是有利的情況:

  • 如果你正在做手動編輯大量數據......但是誰做的?如果你是,那麼你很可能不會使用enum
  • 第三方枚舉,他們可能不那麼勤奮以維護數值常量。但是我不得不說,任何發佈一個體面寫作的API的人絕大部分可能足夠聰明,以保持值不變。 (標識符必須保持不變,因爲改變它們會破壞現有的代碼。)

查找表,這是我極力勸阻,因爲他們是一個單向的子彈火車到維護的噩夢:

  • 添加[Flags]功能需要使用聯結表,這意味着更復雜的查詢(現有的查詢需要重寫)並增加了複雜性。現有的客戶數據呢?
  • 如果標識符存儲在數據表中,首先有一個查找表有什麼意義?
  • 如果數值存儲在數據表中,則不會得到任何結果,因爲您仍然必須從查找表中查找標識符。爲了更容易,你可以創建一個視圖...對於表中有一個enum值。然後我們甚至不會考慮[Flags]枚舉。
  • 引入數據庫和代碼之間的任何類型的同步只是要求麻煩。現有的客戶數據呢?
0

,如果你想獲得存儲在數據庫中回枚舉值,那就試試這個

EnumValue = DirectCast([Enum].Parse(GetType(TextJustification), reader.Item("put_field_name_here").ToString), TextJustification) 

告訴我,如果你的作品