2012-01-09 122 views
14

是否有更好或更简单的方法在SQL Server数据库中存储枚举(在C#等编程语言中可用的枚举),而不是简单地创建一个查找表(以Id,代码和名称作为列)他们每个人(特别是当每个表中的行数很少时)?我发现一个article,建议为所有枚举创建一个查找表,这种方法在评论中被一些人批评说它违反了参考数据完整性。如果只有一个表使用枚举,那么使用一些预定义的代码然后为它们添加一个约束(可能使用扩展属性)是一个好习惯吗?在SQL Server数据库中枚举

+1

“所有枚举的一个查找表”,又名“The One True Lookup Table”,又名“OTLT”,是一个众所周知的SQL反模式。你可以谷歌。我认为枚举本身是一个数据库反模式,因为它们不容易扩展(附加属性)。 – 2012-01-09 18:01:06

回答

18
  1. 就我个人而言,我喜欢为每个枚举定义一个查找表,因为它也是一种文档。如果有人想知道身份证是什么,他会很容易找到一张桌子。在列约束中查找此信息并不明显。

  2. 在表中添加新值比在约束中更容易。

  3. 如果您创建数据库关系图,则单个查找表显得更符合逻辑。

  4. 如果需要(如评论,排序列,某种标志等),您可以将其他信息添加到各个查找表中。

  5. 正如你所说的,它是参照完整性

但是更好;如果您使用的是带有代码优先方法的o/r-mapper,那么使用编程语言提供的枚举会感觉很自然。这是因为你没有设计数据库,而是一个对象模型。 o/r-mapper为你自动创建数据库。

0

由于更改代码中的枚举也需要发布一个新版本的应用程序,所以我会根本没有查找表,但只对所讨论的列添加检查约束。

如果您需要将枚举的本地化名称存储在数据库中,那么我会为每个枚举查找一个查找表。

“一个真正的查找表”不会给你任何好处。

编辑:如果您需要动态检索枚举值(例如下拉菜单)或需要找出哪些值是允许的,那么使用查找表可能会更好。

+0

我没有任何本地化的要求。检查约束的唯一问题是仅当查询数据仅用于一个表中时才可以使用,而且表的用户必须查看表的模式定义才能查看该列允许的代码和说明 – RKP 2012-01-09 17:40:18

+0

如果你需要使用'SELECT'语句来查看允许的值,那么查找表可能对你更好。关于“只能在一个表中使用”:从我使用SQL Server开始已经有一段时间了。在PostgreSQL中,我将定义一个新的“域”来封装检查约束并使其可重用。也许在SQL Server中也可能有类似的东西。 – 2012-01-09 17:42:44

+0

即使显示的名称是在代码中生成的,将它们放在表中也是有用的,因为它们可以在某些报告工具中使用。即使你只是在sql服务器管理器中执行查询以检查某些内容,这些名称也可能很有用。 – 2012-01-09 17:52:12

0

使用同一张表进行多次查找可能会困扰您。一个例子是创建索引视图。如果你有几个字段需要显示查找值,这可以帮助提高性能,但SQL Server(至少2005)不允许你多次引用同一个表(如果这个问题已经解决,我真的会喜欢知道如何去做,因为我可以真正在一个查找表中使用它在当前的应用程序中)。

其中一个查找可能需要一个额外的字段,并通过使用一个表,你会有很多不必要的空值。使用单独的表格索引可以更灵活。如果某个特定类型的查找需要新字段,那该怎么办? SQL Server可以很好地处理一个约束,但是当抛出在同一个表中时,需要更多的复杂性。

您现在可能没有任何这些问题。我只是没有看到单个表的优势,但有些应用程序喜欢用动态方式生成查找列表,并且不会为每个表创建一个新表。