如何在rails中实现复合主键

时间:2017-01-27 07:07:35

标签: ruby-on-rails ruby database ruby-on-rails-5 database-indexes

我有一个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以便唯一标识的行的最佳方法是什么?索引两列并简单地将每列作为表的主键之间的区别是什么?

谢谢!

1 个答案:

答案 0 :(得分:13)

添加索引。

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

可能让你破坏系统......但除非你真正知道你正在做什么,否则最好不要 - 如果你问一个索引和一个密钥之间有什么区别,那么你就不要......这很酷BTW,你不需要知道为了搞定Rails ......但如果你要改变一些基本的东西,它确实会有所帮助。因为使用id以外的任何东西作为主键更难。事情破裂了。你必须修理它而不理解为什么它们会破坏以及你为什么一开始就需要它们......

id作为主键并且具有约束条件以确保您拥有唯一的organisation_id + department_id,这没有任何问题。

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

...否则 主键是唯一标识的信息位。你可能会认为org_id / dept_id永远不会改变......但你会惊讶于现实世界中现实世界数据的变化......以及更新你的整个数据库会带来多大的痛苦。它确实值得关系...

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