如何在 rails 中实现复合主键

How to implement composite primary keys in rails

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

class User < ApplicationRecord
  belongs_to :organization
  belongs_to :department
end

数据库中的userstable有两个外键organization_iddepartment_id。如何使这两列成为复合主键?到目前为止,我在网上看到了两种方法:

选项 1

使用 composite_primary_keys gem

选项 2

使用如下方式为两列中的每一列添加索引:

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

我的问题

users table 中唯一标识行的最佳方法是什么,其中行必须具有 department_idorganization_id 才能唯一确定?索引两列和简单地使每一列成为 table 的主键有什么区别?

谢谢!

添加索引。

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

可能破坏系统...但最好不要,除非你真的知道你在做什么 - 如果您要问索引和键之间的区别是什么,那么您不会...这很酷,顺便说一句,您不需要知道这一点就可以很好地使用 Rails ......但如果你要改变一些根本性的东西,它真的很有帮助。因为使用 id 以外的任何东西作为主键都比较困难。东西坏了更多。您将不得不在不了解它们为什么会损坏以及为什么您首先需要它们的情况下修复它...

id 作为主键并且 具有确保您拥有唯一的约束 organisation_id+[= 并没有错14=]...

注意:我假设您不知道 index/primary-key 之间的区别 - 这个假设可能不成立,但它是您提出问题的方式的产物...如果是的话,我的道歉。 :) 在那种情况下......不同之处在于,如果你只是使用它期望的东西,Rails 会为你做各种美妙的魔法......如果你不这样做,它就是一个 PITA。

否则... primary-key 是 uniquely-identifying 位信息。您可能认为 org_id/dept_id 永远不会改变......但您会惊讶于 real-world 数据在现实生活中的变化频率......以及更新整个数据库的价值会带来多大的痛苦关系的时候...

唯一索引 (OTOH) 以您想要的方式很好地限制数据...如果有人决定部门 42 现在必须是部门 23,则无需更新内容的麻烦。 此外,索引使您可以 column-pair 比对整个数据库执行 row-scan 更快地查找数据。