这是从Hibernate official tutorial:

还有一种可选的<composite-id>声明,它允许使用组合键访问遗留数据.强烈反对将其用于任何其他用途.

为什么不鼓励使用组合键?我正在考虑使用一个包含3列的表,其中所有列都是外键,并且在我的模型中一起形成一个主键,这在我的模型中是一个有意义的关系.我不明白为什么这是个坏主意,特别是我将对它们使用索引.

还有什么 Select ?创建一个额外的自动生成列并将其用作主键?我仍然需要查询我的3个专栏!?

简而言之,为什么这句话是正确的?还有什么更好的 Select 呢?

推荐答案

他们出于几个原因不鼓励他们:

  • 它们使用起来很笨拙.每次您需要引用一个对象(或行)时,例如在您的Web应用程序中,您需要传递3个参数,而不是只传递一个参数.
  • 他们效率很低.数据库需要对3列的组合进行散列,而不是简单地对整数进行散列.
  • 它们会导致错误:开发人员不可避免地错误地实现主键类的equals和hashCode方法.或者将其设置为可变的,并在存储到HashSet或HashMap中后修改它们的值
  • 它们污染了模式.如果另一个表需要引用这个3列表,那么它需要有一个3列,而不是一个作为外键.现在,假设您遵循相同的设计,将这个3列外键作为这个新表的主键的一部分,那么很快就会有一个4列主键,然后在下一个表中有一个5列主键,等等,这会导致数据重复,以及一个脏模式.

另一种 Select 是,除了其他三列之外,还有一列自动生成的主键.如果要使三列的元组唯一,请使用唯一约束.

Database相关问答推荐

为Postgres数据库字段创建复合索引

数据库设计:文件路径的首选字段长度

MongoDB是面向对象的吗?

从 DbDataReader 读取数据的最快方法是什么?

寻找基于磁盘的类 redis 数据库

为什么数据库索引使用平衡树,而不是哈希表?

Django中的Atomic原子操作?

在服务器上排序还是在客户端排序?

对于 Postgres (Windows),有没有像 TOAD 一样好的东西?

日期范围重叠判断约束

当另一个进程修改数据库时Hibernate二级缓存失效

我是否需要为关系数据库表的主键创建单独的索引

在 SQL Server 2008 中区分两个表架构的最简单方法是什么?

如何使用 Entity Framework CF 在父级之前删除子实体?

Phonegap 离线数据库

为什么 DBMS 不支持 ASSERTION

xampp phpmyadmin,格式参数不正确

将 NULL 插入 MySQL 时间戳

使用 Sinatra 时与数据库对话的最佳方式是什么?

如何在 Java 中检测 SQL 表的存在?