2008-12-03 61 views
22

例如,我有一个“用户”表,其中有一个枚举列“type”,其中有两个可能的值:“individual”和“organization”。它们是相互排斥的并且是强制性的(每一行必须只有一个值可能是两个值,这是否是一个使用枚举的好例子?为什么这么做/不是?数据库枚举 - 优缺点

使用ENUM(set)有什么优点和缺点? ?类型数据库字段

+1

MySQL以外的其他RDBMS支持ENUM数据类型吗? (这不是一个修辞问题。) – Tomalak 2008-12-03 11:26:46

+0

@Tomalak:我知道postgresql的确如此。 – 2008-12-03 11:29:43

回答

17

是的,这似乎是一个很好的候选人枚举

优点:

  • 小(磁盘空间)
  • 快速(整数比较)
  • 易于理解的(主要)

缺点:

  • 不能在不改变表结构
  • 必须小心的地方大小写增加值
  • 可以是非常混乱,如果使用不好......不要使用active = enum('1','0'),因为我必须忍受!
  • 所有数据库
9

我个人一直喜欢有这个标准INT列不支持,有一个外键链接到一个描述表。这使您可以限制类型标识列的值。

当然,这可能会导致表膨胀,但它确实允许您在描述表中使用“本地化”表,以便您的应用程序可以在需要时在下拉菜单/报告等中显示本地化内容。

User.UserTypeID -> UserType.UserTypeID -> UserTypeLocalised.UserTypeID where locality = ?? 

这也是更多的数据库不可知的因此更容易移植到不同的平台。

此外,用户无论是个人还是组织都不太合适。我希望用户成为组织的一部分,这需要一个组织表,并且用户需要有一个OrganisationID列。用户类型通常更可能是“人员/系统”区别(假设您的系统使用环境登录来执行操作并且您想要进行审计)。

6

将引用数据放入带有外键的表中意味着数据库可以强制执行数据完整性规则。您还可以添加其他类型(例如“内部”或“非盈利”),而无需扩展数据库模式。最后,您可以使用标志或其他编码注释参考表,以便在需要时实施数据驱动的业务逻辑。