2009-08-13 6 views
6

私は現在、記事とタグという2つのテーブルを持つデータベースを持っています。記事を複数のカテゴリに入れることを可能にするために、私は多対多の関係を持っています。パフォーマンスの面でそのようなデザインを持つのは間違いでしょうか?またはこれらの2つのテーブルの関係を削除し、ブリッジ(articlesTags)として3番目のテーブルを追加する必要がありますか?データベース設計の多対多の関係

+8

articlesTagsテーブルを使用せずに多対多リレーションシップを作成しましたか? – flayto

+2

多対多リレーションシップを使用する場合は、3番目の表を表す必要があります。これは賢明な選択肢ではありません。あなたのDBMSがそれをサポートしているならば、あなたの最も近いアプローチは各テーブルのSET構造であるかもしれません。しかし、通常、そのようなタイプのテーブル間チェックはあまりありません。別のテーブルが必要です。 –

答えて

15

多対多の関係が本質的に間違っていることはありません。その関係を容易にするために、Junction Table(これはarticlesTagsを参照しているようです)を作成するだけです。

+3

交差点テーブルとも呼ばれます。 – APC

+0

私はこれに賢明な抽象化が欲しいです。この自己作成および自己管理のジャンクション・テーブルmalarkeyは、あまりにも長く進んでいます。 – Brandon

+0

@APCまたはJoinテーブル(少なくともJPA) –

1

データに必要なものが多対多の関係にある場合は問題ありませんが、3番目の表にそれを表すことが必要です。

+2

私は「あなたは3番目のテーブルが必要です」と言うでしょう。 – Dave

2

多くを使用しても問題はありません:あなたはそれはあなたが持っているでしょうarticles_to_tagsテーブルがあるだろう実装します 多くの関係。それはしばしば必要です。

はい、3番目のテーブルを使用せずに多対多のリレーションを作成することはできません。

6

概念的なデータベース設計(N:N関係)と物理的な実現の違いがわかります。どのようにN:Nの関係をモデル化しても、前述のジャンクションテーブルが必要になります。

実際の世界の関係を一般的なステートメントのようにモデル化することには何も問題はありません。クラリティは王様です。

任意のシステムでパフォーマンスに関する質問が出るとき、答えは通常「それは依存している」ということになります。

パフォーマンスの問題がWRITESに関連する場合は、高度にNORMALIZED構造が最適です.Junctionテーブルが必要になります。データを大幅に少なくすることができます(ただし、インサートを作成する前にルックアップを行う必要があります)。個々の正規化されたテーブルからの読み取りも非常に高速になります。

問題が分析READSに関連する場合は、DENORMALISED構造が最適です。テーブルが大きく、インデックスが広がっている場合、ジョインは非常にパフォーマンスが高くなります。あなたは多くの時間を得るために多くのスペースを犠牲にします。

一般的に、ソリューションの決定前に、状況の詳細を見て、各アプローチの長所と短所を比較したいと考えています。個人的には、後で問題が発見された場合、初期段階ではClarity、パフォーマンスではリファクタリングに焦点を当てる方が良いということが常にわかっています。