我应该在Grails中使用复合主键吗



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

  1. 为什么Grails文档不鼓励使用复合主键
  2. 为什么Burt甚至使用复合密钥?我试着不用了,一切似乎都很好。我也没有覆盖hashcodeequals
  3. 当视频制作时,Burt正在使用Grails 1.3,他对收集的性能问题仍然有效吗?我可以通过打开SQL日志记录来测试这一点,但我还没有做到

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

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

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

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

  2. 我的猜测是,因为没有任何内容引用UserRole表,所以这不会有什么影响。他本可以使用主键,然后在用户和角色之间创建一个唯一的键,但由于没有其他域引用UserRole,为什么要添加不必要的字段。如果不覆盖hashCodeequals,则无法比较域。

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

将集合设置为Bag:的代码

   Collection books
   static hasMany = [books: Book]

最新更新