我有一个‘产品’数据库,用于存储产品详细信息。对于每个产品,它可以有0- 10个备用件,通过动态表单接受它们的名称。
我不确定数据库模式应该是怎样的。从this thread那里,我得到了一些想法,这就是我想出来的。
__________________________________
|products |
|********* |
|id, name, address |
|__________________________________|
__________________________________
|spareparts |
|********* |
|id, name |
|__________________________________|
__________________________________
|products_spareparts |
|********* |
|id, product_id, sparepartid |
|__________________________________|
所以我的想法是在“备用件”表中有10行,因为一个产品的备用件不会超过10个。每一行都将有一个ID和name字段,其中将存储从表单接受的名称。
当创建产品时,如果有备用件,对于每个备用件,它的名称将被添加到“备用件”表中,product_id和sparepart_id将分别保存产品和备用件的id。
备件是以每个产品为基础创建的。它的名称是从表单中接受的,并且两个产品可能具有或不具有相同的备件。
这样行得通吗?有没有更好的方法来实现它?
发布于 2018-05-14 18:21:42
__________________________________
|products |
|********* |
|id, name, address |
|__________________________________|
__________________________________
|spareparts |
|********* |
|id, name, productid |
|__________________________________|
参考David的回答,我最终使用了上面的模式。productid只是关联产品的外键。对于每个备品备件,会向备品备件数据库中添加一个具有相应产品id的新行。在这种情况下,不需要第三个表。
发布于 2018-05-14 19:02:24
关系数据库使得限制0/1关系的关系变得很容易。它们使限制任意数字的数量变得不容易。
基本上,合理的解决方案需要使用触发器。触发器将计算给定产品的当前备件数量。如果它超过了某个阈值(在您的例子中是10),那么您将在另一次插入时得到一个错误。
实际上,我会通过以下两种方式之一计算备件数量来处理此问题。如果我只是坚持使用传统的数据库结构,我会在products
中对备用件进行计数,并对该值使用check
约束。触发器将用于保持值最新。
更有可能的是,我会将所有DML操作包装到存储过程中,并在那里进行检查。这要求所有的DML操作都通过存储过程来处理。
“不合理”的方法是将is列表作为单独的列-- spareparts1
、spareparts2
等等。这允许您维护外键关系并限制数量。然而,这使得对备件的后续查询变得更加复杂。
https://stackoverflow.com/questions/50327123
复制相似问题