2 つのエンティティ間に親子関係があるスキーマがあります。これは一対多なので、当然次のように実装されます。
table Parents
id
table Children
id
parent_id
ただし、子の 1 つを特別なケースとして扱う必要もあります (「昇格した」子と呼びましょう)。これを行うには、次のようないくつかの方法が考えられます。
に属性を付けるだけですChildren
:
table Parents
id
table Children
id
parent_id
is_promoted
データベースが一貫性を保証できないという点で、明らかに欠陥があります(少なくとも通常の外部キー制約では)
Parents
テーブルに外部キーを作成します。
table Parents
id
promoted_child_id
table Children
id
parent_id
これは私の最初の傾向でしたが、循環依存という明らかな欠点があるため、おそらく最適ではありません。
Children
私が考えることができる別のオプションは、テーブルに2番目の外部キーを置くことです:
table Parents
id
table Children
id
parent_id
promoted_parent_id
これにより、一意のインデックスを配置できるため、データベースの一貫性が確保されます。これに関する 1 つの問題は、親 A の子が親 B の昇格としてリストされるという、無意味な関係を持つ可能性があることです。
私が考えることができる最後のオプションは、中間テーブルを作成することです。
table Parents
id
table Children
id
table ParentChildRelationship
parent_id
child_id
is_promoted
繰り返しになりますが、parent_id
+is_promoted
に対して一意の制約を宣言して、一貫性を確保できます。関係を完全なエンティティに昇格させるのはやり過ぎのように思えるので、私はこれについて少し曖昧ですis_promoted
.
この問題を処理する標準的な方法について、あなたがどう考えるか知りたいです。特に私はRailsを使っているので、何が最も現実的な解決策であるかに影響するかもしれません。