2009-06-18 125 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) 

告诉我,如果你的作品