使用枚举而不是外键

时间:2013-02-06 20:30:07

标签: database hibernate enums foreign-keys

今天再次使用Hibernate枚举映射后,我想知道将它拉伸一点是否是个好主意。
为了解释我的想法来自哪里:当然我们的目标是为我们的应用程序建立一个规范化的数据模型,这通常会导致我们得到很多包含类别,状态或类似数据的表格。通常这些表只有很少的列(通常只有PK和1或2个内容列)和行。而且,这些表格的内容很少变化,有时甚至从未变化 如果我们使用枚举并将它映射到Ordinal或Integer(都使用Hibernate,但我会说任何ORM都可以这样做),那么两种性能都不会更好(连接次数少) )和处理(Java中的枚举可以非常优雅地使用)?

稍微澄清一下:

表格人士
ID:号码
名称:Varchar
RELATIONSHIP_STATUS_ID:数字

表格RELATIONSHIP_STATUS
ID:号码
状态:Varchar

内容人士:
1 | John Doe 1
2 | Mary Poppins | 2

内容关系_STATUS
1 |单
2 |已婚

现在我要转储状态表,将这两个状态放在枚举中并按顺序将其映射到列。
这会是一件有意义的事吗? 如果这种设计在性能方面更好,我特别感兴趣。

1 个答案:

答案 0 :(得分:1)

我在表格和枚举之间进行选择的因素如下:

  • 可能的值列表将来可能会发生变化,我们不希望在应用发生时重新编译,重新测试和重新部署:我们使用表格
  • 可能的值列表将来可能会发生变化,但是表中的每个值都会在代码本身中用来实现一些业务逻辑(比如如果status ==结婚然后再做其他事情):我们需要如果可能值列表发生变化,无论如何都要改变逻辑,所以我们使用枚举
  • 列表永远不会改变:我们使用枚举

但您仍然可以保留表格,并在代码中使用枚举。当您不知道枚举的实现方式时,只需查看数据库中的数据就可以更清楚了。 0表示已婚,1表示单身并不明显。如果您保留该表仅供参考,您至少可以确定值的含义,并确保无法在数据中插入2或任何其他数字。

另一种方法是使用枚举的名称而不是其序数。它占用的空间更多,效率稍低,但它使数据更清晰,分析更简单。但是,除非添加已检查的约束,否则会失去安全性。