2011-05-25 82 views
21

仅供参考:我明确指SQL Server 2000-8和C#。所以支持MySql这样的枚举的DBMS不是我的问题的主题。将枚举值存储在数据库中

我知道这个问题已经在SO中多次提出过。但是,我仍然看到在答案中采用了不同的方法来将枚举值存储在db中。在代码

  1. 保存枚举如在分贝int和提取枚举值(使用反射或枚举描述属性):
    这是我通常使用的方法。问题是当我试图从SSMS中的数据库查询时,检索到的数据很难理解。

  2. 将枚举保存为字符串(varchar)并将其转换回代码中的int。
    其实,这可能是最好的解决方案。但是(不要笑!)它感觉不对。我不确定这些缺点。 (除了通常可以接受的db中的更多空间)那么还有其他方法反对这种方法?

  3. 在db中有一个单独的表,它与代码的枚举定义同步并在主表和枚举表之间建立外键关系。
    问题是,当以后应该添加另一个枚举值时,代码和数据库都需要更新。此外,可能会有错别字,这可能是一种痛苦!

所以一般时,我们可以接受第二液对数据库的开销,什么是存储在数据库枚举值的最佳方式是什么?有关于此的一般定义的设计模式规则吗?
谢谢。

回答

18

没有明确的设计规则(我知道),但我更喜欢方法1。

  1. 是我喜欢的方法。这很简单,枚举通常足够紧凑,我开始记住数字的意思。
  2. 它更具可读性,但可以在您想要的时候阻碍重构或重命名您的枚举值。你失去了你的代码的一些自由。突然之间,你需要让一个DBA参与(取决于你在哪里/如何工作)只是为了改变一个枚举值,或者随之而来。解析一个枚举也有一些性能影响,因为像Locale这样的东西起作用,但可能忽略不计。
  3. 解决了什么问题?除非您想要添加联接的开销,否则表中某个表中仍然有不可读的数字。但有时候,这也是正确的答案,这取决于数据的使用方式。

编辑: 克里斯的评论有一个很好的一点:如果你这样做下去的数值方法,你应该明确地指定值,以便可以重新排序它们。例如:

public enum Foo 
{ 
    Bar = 1, 
    Baz = 2, 
    Cat = 9, 
    //Etc... 
} 
+0

嗯,你是对的。第2号导致麻烦如果我们想要重命名枚举值。 +1谢谢! – Kamyar 2011-05-25 16:39:19

+2

如果您重新排列枚举,则1号会导致麻烦。 – 2011-05-25 16:56:41

+3

@Chris:然后明确定义值。 – vcsjones 2011-05-25 16:57:44

7

一个想法,我见过哪个是你的选项3或多或少

  • 一个数据库中的表(外键等)
  • 的匹配枚举在客户端代码
  • 一个启动检查(通过数据库调用),以确保它们符合

数据库表表只能有一个触发器或检查约束以降低更改风险。它不应该有任何写权限,因为数据绑定到一个客户端代码版本,但它增加了一个安全系数,以防DBA松了一口气

如果您有其他客户端正在阅读代码(这很常见),那么该数据库具有完整的数据。

+0

“加入”开销如何?这值得么? – Kamyar 2011-05-25 16:58:48

+5

@Kamyar:在数据库引擎中加入开销?你在开玩笑吧? – gbn 2011-05-25 16:59:20

+2

是不是造成开销?在许多文章中使用较少的连接建议。 (只要它不会影响正常化*非常糟糕*)例如:http://www.sql-server-performance.com/2007/database-design/ – Kamyar 2011-05-25 17:04:57

相关问题