2016-09-20 136 views
0

我有一个表DriversId,Name,Status。在C#我有司机状态T-SQL枚举数字或字符串

public enum DriverStatus 
{ 
    Online = 0, 
    Offline = 1, 
    Busy = 2, 
    SoonFree = 3 
} 

目前数据库中的枚举,我使用的Statusvarchar数据类型,这意味着我有这样的记录:

1  John  Online 
2  Elsy  Offline 

这接缝是糟糕,我想是因为这需要更改到状态栏类型tinyint

  1. T-SQL Tinyint只有一个字节大小与范围0 -255。
  2. 现在通常不能按状态列进行排序,因为它是varchar,因此它按字母顺序排序而不是枚举优先级。
  3. 如果我重命名DriverStatus枚举值的名称我也需要更新数据库以保持一致。

然后我问别人为什么我们使用varchar,枚举列的唯一原因是,它是更容易调试正如你看到的文字不是数字,如0或3是任何地方真的很好的理由,这对于在枚举字符串数据库?

+0

呀,他们的理由是非常好的。理解数据更容易。如果您是未来的开发人员或报告创建者,您还有什么知道这些值是什么意思?如果您真的需要他们排序,那么请使用CASE WHEN在您的视图中翻译它们。我绝对不认为你会选择一个数值超过文本值进行查找的唯一原因是为了排序目的。 –

+1

你*可以*在数据库中有另一个表,它将'StatusCode'关联到'StatusDescription'。你不必真的使用它,但它会在那里让别人看到。 –

+0

可能的解决方案:1)打开代表数据库表的C#实体类并查看所描述的核心枚举(如果有)。 2)如果是纯数据库项目,可以为枚举键值分开表格,那么报表创建者可以加入它以获得用户友好的值。 –

回答

2

对于枚举值使用查找表是绝对更好的。

优点:

  • 一般使用数据库中的空间更小。
  • 重命名显示值非常简单。
  • 全球化是可能的。
  • 退休不再使用的值很容易。
    • 我的查找表总是包含三个字段:标识/主键],名称,并启用