如何设计具有类似条目的数据库表

时间:2012-07-15 13:31:19

标签: database database-design

我目前有一个表,其中大部分(如99%)的字段数据依赖于单个字段,但另外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

我是在正确的轨道上还是有更好的数据库设计来处理这个问题?任何帮助或链接将不胜感激。我无法为谷歌解决这个问题。

3 个答案:

答案 0 :(得分:1)

您需要规范化数据库表

在以下三个表中打破它:

<强>产品

id | product

<强>颜色

id | color

<强> product_cost

id |  Product_id | color_id | Cost

答案 1 :(得分:0)

您可以将颜色组合在一起,然后插入整个组的价格:

enter image description here

您的示例可以与此类似地表示......

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

增加的复杂性是否值得,取决于你......

答案 2 :(得分:0)

  • BaseProduct包含所有产品名称及其价格
  • Product拥有所有可用的有效产品颜色组合
  • ColorPrice是与基本价格的差异(抵消)。
  • ColorCharge只有只有异常定价的行(ColorPrice没有行= 0)

enter image description here

获取特定基本产品的信息(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;