1

現在、フィールドのデータの大部分(99%など)が1つのフィールドに依存しているテーブルがありますが、他の1%は他のフィールドに依存しています。

たとえば、次の価格表があります

product PK
color PK
cost

以下は、そのテーブルのいくつかのエントリです

product|color|cost
pen|red|$1.00
pen|blue|$1.00
pen|green|$1.00
etc....
pen|black|$0.90
pen|white|$0.85
pencil|red|$0.50
pencil|blue|$0.50
pencil|green|$0.50
etc...
pencil|black|$0.35
pencil|gray|$0.40

このテーブルで私が抱えている問題は、単一の製品または色を追加する必要があるときはいつでも、このテーブルに何百もの同様のエントリを追加する必要があるということです。

現在、次のようにデータを保存することを考えています。

pen|all_other_colors|$1.00
pen|black|$0.90
pen|white|$0.85
pencil|all_other_colors|$0.50
pencil|black|$0.35
pencil|gray|$0.40

私は正しい方向に進んでいますか、それともこの問題を処理するより良いデータベース設計がありますか?ヘルプやリンクをいただければ幸いです。私はこの問題のためにグーグルに正しい言葉遣いを得ることができません。

4

3 に答える 3

1

データベーステーブルを正規化する必要があります

以下のように3つのテーブルに分けてください。

製品

id | product

id | color

product_cost

id |  Product_id | color_id | Cost
于 2012-07-15T13:36:09.987 に答える
0

色をグループ化してから、グループ全体の価格を挿入できます。

ここに画像の説明を入力してください

そして、あなたの例はこれと同じように表すことができます...

PRICE:

    PRODUCT_ID  GROUP_ID    PRICE
    pen         1           $1.00
    pen         2           $0.90
    pen         3           $0.85    
    pencil      1           $0.50
    pencil      2           $0.35
    pencil      4           $0.40

GROUP:

    GROUP_ID
    1
    2
    3
    4

COLOR_GROUP:

    GROUP_ID    COLOR_ID
    1           red
    1           blue
    1           green
    2           black
    3           white
    4           gray

COLOR:

    COLOR_ID
    red
    blue
    green
    black
    white
    gray

複雑さを増す価値があるかどうかはあなた次第です...

于 2012-07-15T16:58:01.677 に答える
0
  • BaseProductすべての製品名とその価格があります
  • Product利用可能なすべての有効な製品と色の組み合わせがあります
  • ColorPrice基本価格との差(オフセット)です。
  • ColorCharge例外価格の行のみがあります(ColorPrice = 0の行はありません)

ここに画像の説明を入力してください

特定の基本製品の情報を取得するには(specific_prodict_id

select
      b.ProductName
    , c.ColorName
    , b.ProductPrice + coalesce(x.ColorPrice, 0.0) as ProductPrice
from      Product     as p
join      BaseProduct as b on b.BaseProductID = p.BaseProductID
join      Color       as c on c.ColorId       = p.ColorId
left join ColorCharge as x on x.BaseProductID = p.BaseProductID and x.ColorID = p.ColorID
where p.BaseProductID = specific_prodict_id;
于 2012-07-15T18:13:20.970 に答える