0

我目前有 3 个简单的表:products(prodid、name 和 prodmatid)、materials(matid、name)和 prodmat(prodmatid、prodid 和 matid)。

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

4

3 回答 3

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)
于 2013-01-27T18:45:02.170 回答
0

这被称为third normal form并且是设计关系数据库的公认方法。

http://en.wikipedia.org/wiki/Third_normal_form

编辑

有些人(包括我自己)会prodmatid从材料表中删除,因为prodid并且matid可以用作主键。其他人喜欢为每个表拥有 1 个唯一的主键。

于 2013-01-27T18:41:19.820 回答
0

假设这不是家庭作业......我会做这样的事情:

表:产品 Prodid (PK)、名称(我想一些额外的列会派上用场……比如……保质期?需要特殊存储?)

表:材料 Matid (PK)、名称、计量单位(以克、公斤、米、物品为单位...)(再次,价格?保质期?)

表:ProdMat PK:Prodit+MAtid、Prodit (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

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

于 2013-01-27T19:06:43.617 回答