RDBにてあるテーブルが複数のテーブルにまたがって関連を持つデータ構造の表現方法を考えていきます。
例えば、以下のようなデータ構造を想定しています。
ニュース記事と商品記事の2種類のテーブルが存在します。
それに対してコメントが関連付けられます。
記事とコメントの対応は1:Nです。
アンチパターン:メタ情報を持たせる
このデータを表現するために、テーブルのメタ情報を持たせてはいけません。
例えば、以下のようなコメントの設計は適切ではありません。
このデータ構造だと、記事idに外部参照制約を設定することができません。
なぜなら、どのテーブルに関連づいているのかがわからないからです。
関連が動的(記事種別の値によって変動する)なためです。
解決策
解決方法としては以下の3つが考えられます。
交差テーブルを作る
記事テーブルとコメントテーブルの間に、交差テーブルを作成します。
例えば、ItemArticleComment、NewsArticleCommentのようなテーブルです。
こうすることでコメントの関連に外部制約を設けることができます。
つまり、存在しない記事に紐づくコメントは存在しなくなります。
ただし、あるコメントがニュース記事、商品記事の両方に関連づいてしまうことは防げません。
基底クラスを作る
ニュース記事と商品記事の基底テーブルとして記事テーブルを作成します。
記事のidは記事テーブルで一意とします。
これにより、idがニュース記事、商品記事の間で一意になります。
それにより、先ほどの問題であったコメントが両方の記事に紐づいてしまう不整合を防げます。
ただし、同じidのニュース記事と商品記事が存在してしまう可能性があるという別の問題が発生し得ます。
コメントのテーブルを分割する
前提が覆りますが、コメントテーブルを共通にする必要が無いのであれば、それぞれの種別のコメントテーブルを用意するという方法もあります。
これであれば、構造をシンプルにできる上に、データの整合性も保つことができます。