2012-04-19 14 views
4

これはデータベース設計上の疑問であり、プロのデータベース管理者が2つしかない値 - 以下の2つの設計シナリオの例を取っ​​ておきます。なぜ?データベース設計 - 2つの値のみを持つテーブルを作成するか、その2つの値のいずれかを持つカラムにする

シナリオ1

table INVOICES 
------------------------------- 
id | royalty_fee | royalty_type 
------------------------------- 
1 | 15   | percentage 
2 | 10.00  | fixed 
1 | 25   | percentage 
1 | 25.00  | fixed 

または....

シナリオ2

table INVOICES 
---------------------------------- 
id | royalty_fee | royalty_type_id 
---------------------------------- 
1 | 15   | 1 
2 | 10.00  | 2 
1 | 25   | 1 
1 | 25.00  | 2 


table ROYALTY_TYPES 
------------------------------- 
id | label 
------------------------------- 
1 | percentage 
2 | fixed 

答えて

7

アプローチ2は良好です。新しいタイプを追加したり、ROYALTY_TYPESのラベルを編集/更新したりする場合は、ROYALTY_TYPESという2番目のテーブルを参照することもできます。 あなたがROYALTY_TYPESでラベルを変更/編集する場合、それが唯一の場所の変更が必要になりますし、テーブルの請求書には影響を受けません
EDIT次のようになります。それがどのように簡単に
:私は通常、データベース設計に関して三つを探し
追加:
最初の方法では、請求書の記録がない場合に新しいロイヤリティタイプを追加することはできません。あなたが新しいタイプを追加したいのであれば、将来の請求書にHalfFixedと言うことができます。 HalfFixedタイプの請求書を受け取らないと、あなたはそれを行うことができません
更新するのがどれくらい簡単かロイヤリティタイプを「固定」に更新するといいでしょうか?最初のアプローチに従っている場合は、複数行で更新する必要があります。
を簡単に削除できます。ロイヤリティタイプからタイプを削除したい場合は、最初の方法でテーブルの更新ステートメントを実行し、特定のロイヤリティタイプをNULLに設定する必要があります。

+1

また、挿入された値が使用可能な値のセットに一致することを確認するために、外部キー制約の利点があります。 – Shlomo

+0

@Sholmo、はい、まあまあです。 – Habib

+0

説明に時間を割いてくれてありがとう、@ Habib.OSU。 – chadwtaylor

1

トランザクションdbでは、2が優れています。 1はデータウェアハウスシステムに使用できます。

2

私は後者を使用しますが、質問はありません。

  1. 別のロイヤリティタイプは絶対にありませんか?いいえ、あなたがすることはできません。
  2. royalty_type_id列を外部キー関係で検証することはできますが、royalty_typeではそうではありません。ハードコードされたテキスト値でチェック制約を使用する必要があります。
  3. royalty_typesテーブルでは、ロイヤリティタイプエンティティ自体に必要に応じて新しいフィーチャを追加できます。
+0

は感謝します@ JeffSahol、たくさんのことを行います。 – chadwtaylor

関連する問題