我目前有3个简单的表:产品(prodid,名称和prodmatid),材料(matid,名称)和prodmat(prodmatid,prodid和matid)。
我不确定以上是否是一个好的设计。产品可以由不同的材料组成,产品表只允许产品一次使用一种材料 - 因此,如果productA有5种材料,那么它将需要5行产品。这是一种愚蠢的做法,我应该如何设计呢?
答案 0 :(得分:1)
在您的设计中,您似乎在products
表中有一个额外的列。您可以删除prodmatid
列,因为您可以在prodmat
表中找到该关系。
因此,您的结构将是:products (prodid, name)
,materials (matid, name)
和prodmat (prodmatid, prodid, matid)
这允许产品“我的产品”,材料“材料1”和“材料2”,结果将是:
product (1, 'My Product')
material (1, 'Material 1'), material (2, 'Material 2')
prodmat (1, 1, 1), prodmat (2, 1, 2)
答案 1 :(得分:0)
这称为third normal form
,是设计关系数据库的接受方式。
请参阅http://en.wikipedia.org/wiki/Third_normal_form
修改强>
有些人(包括我自己)会从材料表中删除prodmatid
,因为prodid
和matid
可以用作主键。其他人喜欢为每个表都有一个唯一的主键。
答案 2 :(得分:0)
假设这不是作业......我会做这样的事情:
表:产品 Prodid(PK),名字 (我想一些额外的专栏会派上用场......就像......保质期?需要特殊储存?)
表:材料 Matid(PK),名称,计量单位(以克,公斤,米,项目为单位......) (再次,价格?保质期?)
表:ProdMat PK:产品+ MAtid,产品(FK),Matid(FK),数量。
所以,回到你的例子,让我们看看产品Gizmo:
Products Table
Prodid | Name
00203 | Gizmo
它由5种不同的“材料”组成:
Table: ProdMat
Prodit | Matid | Qty
00203 | 0034 | 2
00203 | 0010 | 11
00203 | 0567 | 1
00203 | 0002 | 1
00203 | 0039 | 1.675
这些是:
Table: Materials
Matid | Name | u-o-m
0034 | Cogs, brass, diam.2" | Units
0010 | Spring, small | Units
0567 | Gizmo shell (lower) | Units
0002 | Gizmo shell (upper) | Units
0039 | Sand | Pounds
现在,如果您的问题包括子组件,或者作为原材料进入并且可以进行内部加工以进行精炼或加工,或者无论如何转化为一种或多种半加工材料/产品的材料/产品。转动另一个产品的一部分...然后事情开始变得有趣。