我目前有一个表,其中大部分(如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
我是在正确的轨道上还是有更好的数据库设计来处理这个问题?任何帮助或链接将不胜感激。我无法为谷歌解决这个问题。
答案 0 :(得分:1)
您需要规范化数据库表
在以下三个表中打破它:
<强>产品强>
id | product
<强>颜色强>
id | color
<强> product_cost 强>
id | Product_id | color_id | Cost
答案 1 :(得分: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
增加的复杂性是否值得,取决于你......
答案 2 :(得分: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;