如何在rails中实现复合主键

Mar*_*ark 9 ruby database ruby-on-rails database-indexes ruby-on-rails-5

我有一个User看起来像这样的模型:

class User < ApplicationRecord
  belongs_to :organization
  belongs_to :department
end
Run Code Online (Sandbox Code Playgroud)

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

选项1

使用composite_primary_keys宝石

选项2

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

add_index :users, [:organization_id, :department_id], unique: true
Run Code Online (Sandbox Code Playgroud)

我的问题

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

谢谢!

Tar*_*ast 20

添加索引.

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

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

id作为主键并且还有一个限制,确保你有一个独特的organisation_id+ department_id... 没有任何问题.

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

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

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