首页 > 解决方案 > 是否需要索引具有唯一约束的列?

问题描述

我正在使用 Hibernate 在表中的某些列上添加唯一约束,如下所示uniqueConstraints = {@UniqueConstraint(columnNames = {"warehouseCode", "orderCode", "vendorId"})},。我还需要在这些确切的列上添加索引。我的问题是,我需要为这些列显式创建索引,还是唯一约束会自动为我创建索引?

标签: javaspringspring-boothibernatejpa

解决方案


从技术上讲,唯一约束实际上并不能保证会创建索引,但我不知道有任何数据库引擎不会。

请注意,数据库引擎仍然可以完全自由地以不同方式对待它们,许多数据库就是这样做的。但是,存在唯一索引之类的东西- 您需要将其中一个与唯一约束进行比较才能看到有意义的差异。可以禁用唯一索引,然后禁用唯一性检查(至少在大多数数据库引擎上)。唯一约束通常不能。

在 DB 领域,如果您真的打算将其用作索引,建议创建一个唯一索引,如果您只关心唯一性,则创建一个约束。正如我所说,在实践中,我知道的每个数据库引擎都通过创建索引来实现唯一约束,并且我知道的每个数据库引擎都会将该索引用于一般查询,因为它就在那里。

这一切如何转化为休眠?这就是hibernate的问题——你只是增加了学习曲线,什么都没有简化,因为通常你需要知道SQL端发生了什么。

在这种情况下,它的翻译很糟糕,hibernate 有点疏忽,似乎没有理解有“唯一索引”这样的概念。

编辑

再想一想,这真的很疯狂——特别是有充分的理由想要一个索引。例如,假设您想要一个关于 的索引a asc, b desc, c asc,它不能用 eg 以任何方式伪造a asc, b asc, c asc。而且您还希望一次性获得 a/b/c 的唯一性。几乎每个数据库引擎都可以通过创建索引来有效地做到这一点a asc, b desc, c asc,并在创建时添加 UNIQUE 关键字。

如果不能诱使 hibernate 做这样的事情,那听起来肯定是 hibernate 不适合目的。

我正在尝试查找有关如何制作它的文档,但我找不到它。这很奇怪。hibernate真的不能这样吗?

请注意,存在 JDBI 和 JOOQ 等工具,它们可以让您实际执行 SQL 操作。如果你已经熟悉 DB 引擎和 SQL 之类的,并且你在这个项目中足够早,你可能想寻找如何在 hibernate 中制作唯一索引,如果你不能,考虑切换。

结束编辑

所以,你有三个选择:

  1. 同时创建索引和唯一约束,使数据库加倍工作,减慢一切速度,并使事物的大小加倍。祈祷hibernate足够聪明,不会真正创建那个索引,但我怀疑它是如何工作的。鉴于它是一个 3 字段索引,它是一个昂贵的索引,这听起来不是一个好主意。

  2. 保持原样,并依赖于所有数据库引擎都将使用索引实现这一点,并将使用该索引进行查询这一事实,即使它不是完全正确的“风格”,尤其是在直接连接到数据库时。

  3. 使用 hibernate 提交功能请求或查看如何在 hibernate 的@Index功能中将索引标记为“需要唯一性”。


推荐阅读