2013-07-29 50 views
2

Grails docs鼓励使用复合主键,但在this video(26:00 - 29:00)@BurtBeckwith使用复合主键,因为他谈到加入表,而不是使用收藏领域类的映射的性能优势。这就提出了几个问题:我应该在Grails中使用复合主键吗?

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

回答

3

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

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

+0

是否将UserRole表与隐式创建的连接表保持一致?如果你没有在连接表上使用复合PK,那么该表中的每个条目都会有'id'和'version'。我不认为这是一个巨大的退步,所以我很难理解为什么我们会付出额外的努力来创建一个组合键。比较两种方法生成的SQL时,我也感到困惑(将连接表映射为组合键或将连接表映射为没有组合键)。复合PK方法的SQL似乎更复杂。我可以发布它,如果你想。 – ubiquibacon

+0

这不是很重要,但工作已完成,现在封装在生成域类的脚本中。但重要的是不要太担心默认实现 - 插件和Spring Security不关心用户和角色数据来自哪里,只是在某些时候它的格式正确。随意使用任何你想要的方法,使用自定义的'UserDetailsS​​ervice'等。 –

2

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

  1. 复合键不仅仅是Grails的阻碍。作为一个整体来说,表面设计通常是不鼓励的。这样做的最大缺点是与其他表格的关系更加复杂。对于Grails而言,它确实没有那么多,而是一般的数据库设计。

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

  3. 是的,在Grails 2中适用相同的规则,但Grails现在支持Bags。这将提供他在该演讲中概述的相同好处,而不会损失当前Grails语法的Groovyness。这不是默认,所以你必须指定。

代码来设置的集合为一个包:

Collection books 

    static hasMany = [books: Book] 
+3

包包似乎是一个不错的主意,但一般情况下它们会变得更糟糕,请参阅http://burtbeckwith.com/blog/?p=1029 –

+0

哇 - 我自己从来没有使用过包包,但我认为它们固定了所有包包根据用户指南中的描述,这是无意义的。 –

相关问题