如何在rails中实现复合主键

我有一个User模型,如下所示:

 class User < ApplicationRecord belongs_to :organization belongs_to :department end 

数据库中的users表具有两个外键organization_iddepartment_id 。 如何将这两列作为复合主键? 到目前为止,我在网上看过两种方法:

选项1

使用composite_primary_keys gem

选项2

使用以下内容为这两列中的每一列添加索引:

 add_index :users, [:organization_id, :department_id], unique: true 

我的问题

唯一标识users表中行必须具有department_idorganization_id以便唯一标识的行的最佳方法是什么? 索引两列并简单地将每列作为表的主键之间的区别是什么?

谢谢!

添加索引。

在rails中,如果您拥有主键的id ,一切都会更好。

可能会破坏系统…但最好不要除非你真的知道你在做什么 – 如果你问的是索引和密钥之间有什么区别那么你就不会……这很酷BTW,你不需要知道为了与Rails做得好…但是如果你要改变一些基本的东西它真的有帮助。 因为使用除id之外的任何东西作为主键更难。 事情破裂更多。 你必须解决它而不理解为什么它们会破碎以及你为什么首先需要它们……

id作为主键并且具有约束以确保您具有唯一的organisation_id + department_id

注意:我假设你不知道索引/主键之间的区别 – 这个假设可能不成立,但是你提出问题的方式是神器……如果是的话我很抱歉。 :)在这种情况下……不同之处在于,如果你只是使用它所期望的东西,Rails会为你做各种各样的神奇魔法……如果不这样做,它就是PITA。

否则……主键是唯一识别的信息位。 您可能会认为org_id / dept_id永远不会改变……但是您会惊讶于现实世界中现实世界数据的变化…以及更新整个数据库的关系价值时会有多大的痛苦不…

一个独特的索引(OTOH)很好地以你想要的方式约束数据……如果有人决定部门42现在必须是部门23,那么就没有必要更新东西的麻烦。 另外,索引允许您通过该列对查找数据比对整个数据库进行行扫描更快。