2

Grails 文档不鼓励使用复合主键,但在此视频中(26:00 - 29:00) @BurtBeckwith使用复合主键,因为他谈到了将连接表映射到域类而不是使用集合的性能优势. 这提出了几个问题:

  1. 为什么 Grails 文档不鼓励使用复合主键?
  2. 为什么 Burt 甚至使用复合键?我试过没有,一切似乎都很好。我也没有覆盖hashcodeor equals
  3. 制作该视频时,Burt 使用的是 Grails 1.3,他对集合的性能问题是否仍然有效?我可以通过打开 SQL 日志记录自己测试这个,但我还没有这样做。
4

2 回答 2

3

Hibernate 更喜欢简单的主键,即使有一个自然的唯一键(例如 User 表中的用户名),因为自动递增长值更容易用作外键。它当然支持其他方法,GORM 也是如此。

我在 UserRole 表中使用复合 PK 的原因是使其与在 GORM 中使用多对多时获得的隐式创建的连接表相同。我提出的方法旨在就数据库而言是相同的,但性能更高,并且您还可以更好地控制自定义连接表。但是可以随意将复合 PK 更改为简单的两个外键(理想情况下具有唯一索引)并添加一个常规的单列主键。只要您不打算将其用作 GORM 多对多连接表,这很好。

于 2013-07-29T21:04:27.063 回答
2

我想我可以回答这些问题,但是如果我错了,请有人纠正我。

  1. 复合键并不是 Grails 不鼓励的东西。在整个表格设计中通常不鼓励这样做。这样做的最大缺点是它使与其他表的关系更加复杂。它实际上与 Grails 并没有太大关系,而是与一般的数据库设计有关。

  2. 我的猜测是,因为没有引用 UserRole 表,所以它不会受到伤害。他本可以使用主键,然后在用户和角色之间创建唯一键,但是由于没有其他域引用 UserRole,为什么要添加不必要的字段。如果您不覆盖hashCodeor equals,您将无法比较域。

  3. 是的,相同的规则适用于 Grails 2,但是 Grails 现在支持 Bags。这将提供与他在那次演讲中概述的相同的好处,而不会失去当前 Grails 语法的 Groovyness。这不是默认值,因此您必须指定。

将集合设置为 Bag 的代码:

   Collection books

   static hasMany = [books: Book]
于 2013-07-29T20:45:04.920 回答