次のようなUser
モデルがあります。
class User < ApplicationRecord
belongs_to :organization
belongs_to :department
end
データベースのusers
テーブルには、2つの外部キーorganization_id
とdepartment_id
があります。これらの2つの列を複合主キーにするにはどうすればよいですか?これまでにオンラインで2つのアプローチを見てきました。
composite_primary_keys
gemを使用してください
次のようなものを使用して、2つの列のそれぞれにインデックスを追加します。
add_index :users, [:organization_id, :department_id], unique: true
users
テーブル内の行を一意に識別するための最良の方法は何ですか?行を一意に識別するためには、行にdepartment_id
とorganization_id
が必要です。両方の列にインデックスを付けることと、各列をテーブルの主キーにすることの違いは何ですか?
ありがとう!
インデックスを追加します。
Railsでは、主キーとしてid
を使用すると、すべてがうまく機能します。
それは可能でシステムを落とすことです...しかし、あなたが本当にあなたが何をしているかを知っている-そしてあなたが違いを尋ねているなら、あなたはそうしない方がいいですインデックスとキーの間にある場合、それはできません...これはクールです。Railsでうまく機能するために、そのことを知る必要はありません...しかし、変更する場合は本当に役立ちます基本的なもの。 id
以外のものを主キーとして使用するのは難しいためです。物事はもっと壊れます。彼らがなぜ壊れているのか、なぜそもそもそれらを必要としていたのか理解せずに修正する必要があります...
id
を主キーとして使用し、alsoが一意のorganisation_id
+ department_id
...であることを確認する制約を設定しても問題はありません。
注:私は、インデックスと主キーの違いがわからないという仮定を立てました。この仮定は成り立たないかもしれませんが、質問した方法の結果かもしれません...申し訳ありませんが。 :)その場合...違いは、Railsは、期待するものを使用するだけであらゆる種類の素晴らしい魔法を実行します...使用しない場合はPITAであることです。
それ以外の場合...主キーは、一意に識別される情報のビットです。 org_id/dept_idは決して変わらないと思うかもしれませんが、実際のデータが実際の生活の中でどれほど頻繁に変更されるかには驚かれるでしょう。する...
一意のインデックス(OTOH)は、データを思い通りに制約します。誰かが部門42を部門23にする必要があると判断した場合に、データを更新する手間をかける必要はありません。さらに、インデックスを使用すると、データベース全体の行スキャンを実行するよりもはるかに迅速に、その列ペアでデータを検索できます。