Ruby on rails 如何在rails中实现复合主键

Ruby on rails 如何在rails中实现复合主键,ruby-on-rails,ruby,database,ruby-on-rails-5,database-indexes,Ruby On Rails,Ruby,Database,Ruby On Rails 5,Database Indexes,我有一个用户模型,看起来像这样: class User < ApplicationRecord belongs_to :organization belongs_to :department end add_index :users, [:organization_id, :department_id], unique: true 我的问题 在用户表中唯一标识行的最佳方法是什么?行必须具有部门id和组织id,才能唯一标识?为两列编制索引和简单地将每列作为表的主键之间有什么区别

我有一个
用户
模型,看起来像这样:

class User < ApplicationRecord
  belongs_to :organization
  belongs_to :department
end
add_index :users, [:organization_id, :department_id], unique: true
我的问题 在
用户
表中唯一标识行的最佳方法是什么?行必须具有
部门id
组织id
,才能唯一标识?为两列编制索引和简单地将每列作为表的主键之间有什么区别

谢谢

添加索引

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

你有可能违背这个制度。。。但最好不要这样做,除非你真的知道你在做什么-如果你问索引和键之间的区别是什么,那么你不。。。顺便说一句,这很酷,你不需要知道为了更好地使用Rails。。。但如果你要改变一些基本的东西,这真的很有帮助。因为使用
id
以外的任何东西作为主键都比较困难。事情更糟了。你必须在不理解为什么它们会断裂以及为什么你首先需要它们的情况下修复它

id
作为主键,并设置一个约束以确保您拥有唯一的
组织id
+
部门id

注意:我假设您不知道索引/主键之间的区别-这个假设可能不成立,但可能是您提问方式的产物。。。如果是的话,我深表歉意 那样的话。。。不同的是,Rails为您提供了各种各样的神奇功能,如果您只是使用它所期望的。。。如果你不这样做的话,这就是皮塔

否则。。。 主键是唯一标识信息的位。你可能认为组织id/部门id永远不会改变。。。但你会惊讶于现实生活中真实世界的数据变化如此频繁。。。当它真的发生时,更新你整个数据库的关系价值会是多么痛苦

唯一索引(OTOH)以您想要的方式很好地约束数据。。。如果有人决定42部门现在必须是23部门,那么就不必麻烦地更新资料。
另外,索引可以让您通过该列对查找数据,这比对整个数据库进行行扫描要快得多。

首先,为什么您要使用复合主键而不是遵循Rails惯例,只使用
id
列和
属于组织和部门的关联?复合主键对应用程序的许多其他部分都有影响:Rails link helper可能无法使用复合键,finder的工作方式不同,外键更难使用……选项2是这里的最佳选择。选项1是当你别无选择时你会做的事情,就像你背负着一个无法更改的遗留数据库。好吧,是的,我只是在学习数据库的东西。但我知道rails在偏离其惯例时会变得很糟糕。那我就用索引法吧,谢谢!另外,你可能会发现现实决定了这种关系很快就会变成m2m……很好的答案——我正在为我正在从事的一个项目决定这件事。不确定是否有任何缺点,但现在将采取这一路线。谢谢。我想知道部门号码和身份证有什么关系。。。