在SQL数据库中存储动态字段

时间:2018-05-14 09:30:42

标签: mysql sql database-schema

我有一个'产品'数据库,用于存储产品详细信息。对于每种产品,它可以选择性地包含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。

备件是按产品创建的。它的名称是从表格中接受的,两个产品可能有也可能没有相同的备件。

这会有用吗?有没有更好的方法来实现它?

2 个答案:

答案 0 :(得分:0)

 __________________________________
|products                          |
|*********                         |
|id, name, address                 |
|__________________________________|
 __________________________________
|spareparts                        |
|*********                         |
|id, name, productid               |
|__________________________________|

参考David的回答,我最终使用了上述架构。 productid只是相关产品的外键。对于每个备件,将使用相应的产品ID将新行添加到spareparts数据库中。在这种情况下不需要第三个表。

答案 1 :(得分:0)

关系数据库可以轻松限制0/1关系的关系。它们不容易限制任意数字的数量。

基本上,合理的解决方案需要使用触发器。触发器将计算给定产品的当前备件数量。如果它超过某个阈值(在你的情况下是10),那么你会在额外插入时出错。

我实际上是通过两种方式中的一种来计算备件。如果我只是坚持使用传统的数据库结构,我会在products中计算一些备件,并在值上使用check约束。触发器将用于使值保持最新。

更有可能的是,我会将所有DML操作包装到存储过程中并在那里进行检查。这要求DML操作都通过存储过程处理。

“不合理”的方法是将ID列表作为单独的列 - spareparts1spareparts2等。这允许您维护外键关系并限制数字。但是,它使后续的备件查询变得更加复杂。