DB设计有助于简化产品和材料的情况

时间:2013-01-27 18:37:05

标签: database-design

我目前有3个简单的表:产品(prodid,名称和prodmatid),材料(matid,名称)和prodmat(prodmatid,prodid和matid)。

我不确定以上是否是一个好的设计。产品可以由不同的材料组成,产品表只允许产品一次使用一种材料 - 因此,如果productA有5种材料,那么它将需要5行产品。这是一种愚蠢的做法,我应该如何设计呢?

3 个答案:

答案 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,因为prodidmatid可以用作主键。其他人喜欢为每个表都有一个唯一的主键。

答案 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

现在,如果您的问题包括子组件,或者作为原材料进入并且可以进行内部加工以进行精炼或加工,或者无论如何转化为一种或多种半加工材料/产品的材料/产品。转动另一个产品的一部分...然后事情开始变得有趣。