web-dev-qa-db-ja.com

railsで複合主キーを実装する方法

次のようなUserモデルがあります。

class User < ApplicationRecord
  belongs_to :organization
  belongs_to :department
end

データベースのusersテーブルには、2つの外部キーorganization_iddepartment_idがあります。これらの2つの列を複合主キーにするにはどうすればよいですか?これまでにオンラインで2つのアプローチを見てきました。

オプション1

composite_primary_keys gemを使用してください

オプション2

次のようなものを使用して、2つの列のそれぞれにインデックスを追加します。

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

私の質問

usersテーブル内の行を一意に識別するための最良の方法は何ですか?行を一意に識別するためには、行にdepartment_idorganization_idが必要です。両方の列にインデックスを付けることと、各列をテーブルの主キーにすることの違いは何ですか?

ありがとう!

11
Mark

インデックスを追加します。

Railsでは、主キーとしてidを使用すると、すべてがうまく機能します。

それは可能でシステムを落とすことです...しかし、あなたが本当にあなたが何をしているかを知っている-そしてあなたが違いを尋ねているなら、あなたはそうしない方がいいですインデックスとキーの間にある場合、それはできません...これはクールです。Railsでうまく機能するために、そのことを知る必要はありません...しかし、変更する場合は本当に役立ちます基本的なもの。 id以外のものを主キーとして使用するのは難しいためです。物事はもっと壊れます。彼らがなぜ壊れているのか、なぜそもそもそれらを必要としていたのか理解せずに修正する必要があります...

idを主キーとして使用し、alsoが一意のorganisation_id + department_id...であることを確認する制約を設定しても問題はありません。

注:私は、インデックスと主キーの違いがわからないという仮定を立てました。この仮定は成り立たないかもしれませんが、質問した方法の結果かもしれません...申し訳ありませんが。 :)その場合...違いは、Railsは、期待するものを使用するだけであらゆる種類の素晴らしい魔法を実行します...使用しない場合はPITAであることです。

それ以外の場合...主キーは、一意に識別される情報のビットです。 org_id/dept_idは決して変わらないと思うかもしれませんが、実際のデータが実際の生活の中でどれほど頻繁に変更されるかには驚かれるでしょう。する...

一意のインデックス(OTOH)は、データを思い通りに制約します。誰かが部門42を部門23にする必要があると判断した場合に、データを更新する手間をかける必要はありません。さらに、インデックスを使用すると、データベース全体の行スキャンを実行するよりもはるかに迅速に、その列ペアでデータを検索できます。

19
Taryn East