Database 使用枚举而不是外键

Database 使用枚举而不是外键,database,hibernate,enums,foreign-keys,Database,Hibernate,Enums,Foreign Keys,在今天再次使用Hibernate枚举映射之后,我想知道是否应该将其再扩展一点。 为了解释我的想法来自何处:当然,我们的目标是为我们的应用程序建立一个规范化的数据模型,这通常会导致这样一个事实,即我们得到许多表,其中包含类似于类别、状态或类似数据的内容。通常这些表只有很少的列(通常只有PK和1或2个内容列)和行。此外,这些表格的内容很少更改,有时甚至从未更改过。 如果我们使用一个枚举,并将其按序号或整数映射到表中(两者都使用Hibernate,但我认为任何ORM都可以做到这一点),那么这在性能(更

在今天再次使用Hibernate枚举映射之后,我想知道是否应该将其再扩展一点。
为了解释我的想法来自何处:当然,我们的目标是为我们的应用程序建立一个规范化的数据模型,这通常会导致这样一个事实,即我们得到许多表,其中包含类似于类别、状态或类似数据的内容。通常这些表只有很少的列(通常只有PK和1或2个内容列)和行。此外,这些表格的内容很少更改,有时甚至从未更改过。
如果我们使用一个枚举,并将其按序号或整数映射到表中(两者都使用Hibernate,但我认为任何ORM都可以做到这一点),那么这在性能(更少的连接)和处理(Java中的枚举可以非常优雅地使用)方面不是更好吗

要澄清一点:

餐桌上的人
ID:编号
名称:Varchar
关系\状态\ ID:编号

表关系\u状态
ID:编号
状态:Varchar

内容人:
1 |约翰·多伊| 1
2 |玛丽·波平斯| 2

内容关系\u状态
1 |单个
2 |已婚

现在,我将转储状态表,将这两个状态放在一个枚举中,并按顺序将其映射到列。
这样做是否明智?
我特别感兴趣的是,这种设计是否在性能方面更好。

我选择表和枚举的因素如下:

  • 未来可能的值列表可能会发生变化,我们不希望重新编译、重新测试和重新部署应用程序:我们使用一个表
  • 可能值的列表将来可能会更改,但是表中的每个值都在代码本身中用于实现一些业务逻辑(例如,如果status==married,那么做一些其他事情):如果可能值的列表更改,我们仍然需要更改逻辑,因此我们使用枚举
  • 列表永远不会改变:我们使用枚举
不过,您仍然可以保留该表,并在代码中使用枚举。当您不知道如何实现枚举时,仅查看数据库中的数据就可以更清楚地看到这一点。0表示已婚,1表示单身根本不明显。如果保留该表仅供参考,则至少可以了解这些值的含义,并确保无法在数据中插入2或任何其他数字


另一种方法是使用枚举的名称,而不是其序号。它占用更多的空间,效率更低,但它使数据更清晰,更易于分析。但是,除非添加选中的约束,否则将失去安全性。

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

  • 未来可能的值列表可能会发生变化,我们不希望重新编译、重新测试和重新部署应用程序:我们使用一个表
  • 可能值的列表将来可能会更改,但是表中的每个值都在代码本身中用于实现一些业务逻辑(例如,如果status==married,那么做一些其他事情):如果可能值的列表更改,我们仍然需要更改逻辑,因此我们使用枚举
  • 列表永远不会改变:我们使用枚举
不过,您仍然可以保留该表,并在代码中使用枚举。当您不知道如何实现枚举时,仅查看数据库中的数据就可以更清楚地看到这一点。0表示已婚,1表示单身根本不明显。如果保留该表仅供参考,则至少可以了解这些值的含义,并确保无法在数据中插入2或任何其他数字


另一种方法是使用枚举的名称,而不是其序号。它占用更多的空间,效率更低,但它使数据更清晰,更易于分析。但是,除非您添加一个选中的约束,否则您将失去安全性。

感谢您的输入,您的因素对我来说意义重大。目前,我们使用将枚举名称放入数据库的方法。你是对的,这一点更清楚了,尽管这并不是为了避免重构(Ordinal也不是,但它展示了一种很好的修复方法)。我只是想知道效率。可能需要建立一些基准并尝试:)谢谢你的投入,你的因素对我来说很有意义。目前,我们使用将枚举名称放入数据库的方法。你是对的,这一点更清楚了,尽管这并不是为了避免重构(Ordinal也不是,但它展示了一种很好的修复方法)。我只是想知道效率。可能需要设置一些基准并尝试:)