2017-04-05 7 views
1

私は、テーブルに複数の外部キーをいつ含めるべきか、関連テーブルを使用するかを理解しようとしています。1つのテーブルで複数の外部キーを使用する場合と、関連テーブルを使用する場合はどちらですか?

編集:理解しやすくするためにa diagramを追加しました。

多くの設定が部門や分類に固有の設定システムがあります。したがって、たとえば、「1チームあたりの数」という設定は、部門1、クラスAが部門3、クラスAで異なる場合があります。また、「最小スコア」は部門1、クラスAが部門1よりも異なる場合がありますC.明らかに、私が同じテーブル内になければならないと感じる部門や分類とは関係のない設定もあります。

私がこれを行う方法の1つは、div/class IDをFKとして設定テーブルに入れることです。次に、どちらか一方(またはどちらか)に依存しない設定は、それらのIDに対してnullになります。

divisions 
---------- 
id (int) 
label (varchar) 
description (varchar) 

classification 
-------------- 
id (int) 
label (varchar) 
description (varchar) 

settings 
--------- 
id (int) 
division_id (int) (FK) 
class_id (int) (FK) 
key (varchar) 
value (varchar) 

分割、分類、および設定キーの組み合わせが1つしかないので、正しく動作するはずです。しかし、それは何らかの形で間違っていると感じます。競合他社のテーブルで競合するさまざまなイベントを置くのとほとんど同じです。後で設定を適用したいと思ういくつかの追加のカテゴリ/タイプが出てこないことも保証できません。私は、彼らはいくつかの新しいカテゴリ(単に「カテゴリ」と「settings_to_categories」テーブルの作成)を思い付くとき、これは容易な成長を可能にするであろうと思います

divisions 
---------- 
id (int) 
label (varchar) 
description (varchar) 

classifications 
-------------- 
id (int) 
label (varchar) 
description (varchar) 

settings 
--------- 
id (int) 
key (varchar) 
value (varchar) 

settings_to_divisions 
------------------------- 
setting_id (int) 
division_id (int) 

settings_to_classifications 
------------------------------ 
setting_id (int) 
class_id (int) 

:だからそれはように私が何かをしたくなります。しかし、私はおそらく、設定テーブル([id]、 "min_score"、5)と複数のほぼ同じテーブル(ID、ラベル、説明)のレコードを、固有の設定レコードを1つ作成します。

次に、男性と女性の設定が異なるとしたらどうなりますか?私は設定テーブルに余分なフィールドを追加し、レコードに「Male」と「Female」の文字列をハードコードしますか?性別に固有の設定を除いてどこでもnullですか?または、物事の反対側では、2つのレコードだけを持つ別の「ジェンダー」テーブルを作成し、それをユーザーテーブルにも使用しますか?それはほとんど... 過度正規化された感じを開始します

divisions 
--------- 
id (int) 
label (varchar) 
description (varchar) 

classifications 
--------------- 
id (int) 
label (varchar) 
description (varchar) 

categories 
---------- 
id (int) 
label (varchar) 
description (varchar) 

type 
---- 
id (int) 
label (varchar) 
description (varchar) 

gender 
------ 
id (int) 
label (varchar) 
description (varchar) 

settings 
--------- 
id (int) 
key (varchar) 
value (varchar) 

settings_to_divisions 
--------------------- 
setting_id (int) 
division_id (int) 

settings_to_classifications 
--------------------------- 
setting_id (int) 
class_id (int) 

settings_to_categories 
---------------------- 
setting_id (int) 
category_id (int) 

settings_to_type 
---------------- 
setting_id (int) 
type_id (int) 

settings_to_gender 
------------------ 
setting_id (int) 
gender_id (int) 

:突然、私は時です。多分それは私だけです。

私はこの設定をインテリジェントに設計しようとしているため、一部の設定がすべてのディビジョン3プレーヤーに適用されていても、追加のカテゴリが必要であり、アプリケーションがディビジョン3、クラスA、カテゴリグリーン、ローグ、男性のプレイヤー対女性のプレイヤー、私は自分のデータベースやアプリケーションをあまりにも多く設計する必要がないので、異なる設定が必要なものを簡単に取得/設定できます。

これは新しい概念ではないと確信しています。これはどこかで認識されている設計パターンでなければなりませんが、単一のデータベースエンティティを3つ(または5つまたは8つ)異なる方法で処理する方法やアプローチを検索しようとするのは難しいです。

私は現在、アソシエーション・テーブル・アプローチ(重要な正規化)に傾いていますが、実際にはDBAではありません。だから、私は愚かな意思決定をしていますか?そのアプローチの否定的/挑戦は何でしょうか?まだまだ違うアプローチが良いでしょうか?

答えて

0

この投稿は少し古いですが、私はまだ将来の読者のためにお答えします:

単純な答え:使用のアプローチ1

あなたは部門/分類間のテーブルを必要とする唯一の理由は関連付けることです複数の部門/分類レコードを持つ単一の設定。

私は経験からあなたがそれを望んでいないことを伝えることができます。時間と空間の節約の仕組みのように、同じ設定を何度も繰り返し使用していますが、将来は後悔します。次に、単一の設定に関連するサブセットレコードの新しい設定を作成する必要があります。さらに、設定テーブルを変更して、大部分のレコードが単一の部門/分類レコードを単一のレコードに関連付けるようにする必要があります設定 - あなたはあなたの人生を嫌うでしょう。

第2に、設定がテキスト文字列である設定テーブルを作成することは非常に柔軟ですが、効率的ではありません。 1つの部門/分類に複数の設定がある場合、アプリケーションは各レコードのifステートメントを実行する結果をループする必要があります。

もちろん、代わりに各設定の列を作成することもできます。新しい設定では展開が必要になるため、これも苦労する可能性があります。ただし、適切な数の設定がブール値の場合は、BIT値を使用してパフォーマンスを大幅に向上させることができます。

例:

あなたは6ビットフィールドを持っている場合は、データベースエンジンのみが必要な値を見つけるために、データ/レコードの1バイト を比較する必要がある - 複数のレコードを介して複数のバイトを比較しなければならないテキストを検索対を。

最後に、設定の数が将来大きく増加すると、テキスト文字列を使用してパフォーマンスに影響を与える可能性があります。

関連する問題