我有一个'产品'数据库,用于存储产品详细信息。对于每种产品,它可以选择性地包含0-10个备件,并通过动态表单接受其名称。
我不确定数据库架构应该如何。来自this thread, 我得到了一些想法,这就是我想出来的。
__________________________________
|products |
|********* |
|id, name, address |
|__________________________________|
__________________________________
|spareparts |
|********* |
|id, name |
|__________________________________|
__________________________________
|products_spareparts |
|********* |
|id, product_id, sparepartid |
|__________________________________|
所以我的想法是在'spareparts'表中有10行,因为产品的备件不会超过10个。每行都有一个ID,并且将存储从表单接受名称的名称字段。
创建产品时,如果有备件,每个备件的名称将被添加到'spareparts'表中,product_id和sparepart_id将分别保存产品和备件的ID。
备件是按产品创建的。它的名称是从表格中接受的,两个产品可能有也可能没有相同的备件。
这会有用吗?有没有更好的方法来实现它?
答案 0 :(得分:0)
__________________________________
|products |
|********* |
|id, name, address |
|__________________________________|
__________________________________
|spareparts |
|********* |
|id, name, productid |
|__________________________________|
参考David的回答,我最终使用了上述架构。 productid只是相关产品的外键。对于每个备件,将使用相应的产品ID将新行添加到spareparts数据库中。在这种情况下不需要第三个表。
答案 1 :(得分:0)
关系数据库可以轻松限制0/1关系的关系。它们不容易限制任意数字的数量。
基本上,合理的解决方案需要使用触发器。触发器将计算给定产品的当前备件数量。如果它超过某个阈值(在你的情况下是10),那么你会在额外插入时出错。
我实际上是通过两种方式中的一种来计算备件。如果我只是坚持使用传统的数据库结构,我会在products
中计算一些备件,并在值上使用check
约束。触发器将用于使值保持最新。
更有可能的是,我会将所有DML操作包装到存储过程中并在那里进行检查。这要求DML操作都通过存储过程处理。
“不合理”的方法是将ID列表作为单独的列 - spareparts1
,spareparts2
等。这允许您维护外键关系并限制数字。但是,它使后续的备件查询变得更加复杂。