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

时间:2013-07-29 19:32:32

标签: grails

Grails docs阻止使用复合主键,但在this video(26:00 - 29:00)@BurtBeckwith使用复合主键时,他会谈到性能优势将连接表映射到域类而不是使用集合。这提出了几个问题:

  1. 为什么Grails文档不鼓励使用复合主键?
  2. 为什么Burt甚至使用复合键?我试过没有一个,一切似乎都很好。我也没有覆盖hashcodeequals
  3. Burt在制作视频时使用的是Grails 1.3,他对收藏的表现问题仍然有效吗?我可以通过打开SQL日志来自己测试,但我还没有完成它。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

  1. 复合键不是Grails不鼓励的。整体来说,桌面设计通常不鼓励。这样做的最大缺点是它使与其他表的关系更加复杂。它实际上与Grails没什么关系,而是与数据库设计有关。

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

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

  4. 将集合设置为Bag的代码:

       Collection books
    
       static hasMany = [books: Book]