2011-01-23 6 views
4

私は、他の複数のテーブルに関連するテーブルを持つデータベースの設計について洞察しています。特定の例は、さまざまな種類のものにコメントを付けるサイトです。人々が記事にコメントしたり、写真にコメントしたり、コメントを投稿したりできます。結合テーブルと型フィールドのトレードオフ

この表現するための二つの方法があるようです:お互いのテーブル TABLESのテーブル結合)

1:

  • 記事
  • articles_comments
  • コメント
  • comments_peopleを
  • comments_photos
  • 写真

または 2)

  • 記事
  • コメント
  • 写真

であり、コメントテーブルには、「タイプ」フィールドと、もう一方のテーブルにリンクするitem_idがあります。

第1のアプローチはより適切であると思われますが、第2のアプローチでは表が少なく、ある点ではよりシンプルになるかもしれませんが、FK拘束を使用することができます。item_id複数のFKに関連する可能性があります(AFAIK - mysql innodbを使用)。私たちのアプリケーションでは、複数の関係(コメント、写真など)を持つ2-3個の表と、関係を必要とする5〜10個の表が存在する可能性はありません。

私はアドバイスを探していますが、より良いアプローチです。

+0

アプローチ2は、手動で管理するのが非常に厄介です。 "ソース"と関係キーを追跡し、関係を設定する良い方法はありません。差別化されたテーブルを介してサブクラスをサポートするHibernateのようなフレームワークを使用している場合、それは "実行可能"(例えば、決して直接扱うことはできません)かもしれません。しかし、SQL DDLが分散キーをうまくエンコードできない場合でも、実際には「SQLモデルに適合」するので#1が好きです。([厄介な人には、制約と複合参照を使用できます] –

+1

メモ - もう少し暮らして学んだ後、私はYzmir Ramirezの回答に変更しました。異なるコメント表を扱うことは、私の意見でははるかに悪いことです。 (複数のメディアオブジェクトを追加するなど)は複雑になる 私はcomment_peopleなどのビューを使用して簡単なアクティブレコードを作成しますORMSの使い方が簡単です - テーブルには単一のタイプしかありません – Yehosef

答えて

1

typeカラム(enum btw)を持つテーブルは、将来「コメント」が何であるかを進化させたい場合があるので、より良いアプローチのようです。

説明したような4つのテーブルを持つことで、Modelクラスのフィールドとその関係が簡単になります。

コメントテーブルに 'LEFT JOIN'を使用する場合は、0から多への関係です。それ以外の場合は 'INNER JOIN'です。

お楽しみください。

+0

ありがとうございます - FKの問題はどうですか?コードやトリガーでそれを避けてください。また、FWIW - アクティブレコードタイプのORMでは、最初のアプローチを使用して2番目のアプローチがより洗練されたormを必要とすることをほとんどまたは全く意識せずに関係を直接理解できると思う(または手動で処理する) – Yehosef

2

私は個人的にオプション#2が嫌いです。これは、議論の的題とは何かを表す、一つの大きなルックアップテーブル概念。

1つは、私はYzmir - ickyに同意します。また、リンゴやオレンジを混ぜるような、リレーショナルデータベースの設計におけるOOの偽装を表しています。 OOプログラミングのバックグラウンドを持つ人(ME ...を含む)が「COmment Object」とそのプロパティを想像するのは簡単ですが、DB Designについて少し考えてみてください。例1のTablenamesは、それらが表すエンティティとそれらの間の関係(多対多の参照表)の両方で実際に起こっていることを明確に示しています。彼らはまた、 "正常な"フォームへのはるかに良い順守を表しています。

RBDMSは、エンティティとその関係を表現するものであり、必ずしもOOの原則と必ずしも一致しません。さらに、正規化のルールはオプション#1に有利である。

オプション1は、より強力なRDBデザインを表し、管理が容易で、拡張が容易で、おそらくより高速に動作します。

関連する問題