我目前有 3 个简单的表:products(prodid、name 和 prodmatid)、materials(matid、name)和 prodmat(prodmatid、prodid 和 matid)。
我不确定以上是否是一个好的设计。产品可以由不同的材料组成,prodmat 表一次只允许一种材料用于产品 - 所以如果 productA 有 5 种材料,那么它需要 prodmat 中的 5 行。这是一种愚蠢的做法,我应该如何设计?
我目前有 3 个简单的表:products(prodid、name 和 prodmatid)、materials(matid、name)和 prodmat(prodmatid、prodid 和 matid)。
我不确定以上是否是一个好的设计。产品可以由不同的材料组成,prodmat 表一次只允许一种材料用于产品 - 所以如果 productA 有 5 种材料,那么它需要 prodmat 中的 5 行。这是一种愚蠢的做法,我应该如何设计?
在您的设计中,您似乎有一个表格中不需要的额外列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)
这被称为third normal form
并且是设计关系数据库的公认方法。
见http://en.wikipedia.org/wiki/Third_normal_form
编辑
有些人(包括我自己)会prodmatid
从材料表中删除,因为prodid
并且matid
可以用作主键。其他人喜欢为每个表拥有 1 个唯一的主键。
假设这不是家庭作业......我会做这样的事情:
表:产品 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
现在,如果您的问题包括子组件,或者作为原材料进入并可以进行内部加工以精炼、机加工或无论如何转化为一种或多种半加工材料/产品的材料/产品,而这些材料/产品可能反过来成为另一个产品......然后事情开始变得有趣。