我正在建立一个供我公司内部使用的库存跟踪系统。我正在研究数据库结构,希望得到一些关于哪种设计更好的反馈*。
我需要一个递归(我可能会使用这个术语错误...)系统,其中一个部分可以由零个或多个部分组成。我有两种方法可以做到这一点,但我不确定使用哪种方法。我不是数据库设计方面的专家,所以也许我有一个他没有想过的选择。
选项1:
两个表格part_id
,另一个表格part_id
,sub_part_id
(表示另一个part_id
)和quantity
。因此,一个表part_id
将是唯一的,而另一个表可以是零行或多行,显示构成某个部分的所有部分。
选项2:
一个表有part_id和汇编。程序集将是一个看起来像这样的文本字段part_id,quantity;part_id,quanity;
....然后我会使用PHP explode()
函数用分号分隔,再用逗号分隔得到子数组份。
我希望这一切都有道理。我使用的是PHP / MySQL。
*社区维基,因为这可能是主观的。
答案 0 :(得分:2)
通常,选项1优于选项2,这不仅仅是因为程序集中的某些部件ID本身就是程序集。
您必须处理递归或树状结构查询。在SQL的任何方言中,这都不是特别容易。有些系统比其他系统更好地支持它们。 Oracle有它的CONNECT BY PRIOR系统(很奇怪,但它有点工作),DB2有递归的WITH子句,而且......
答案 1 :(得分:1)
从来没有使用像PHP或C#这样的过程语言来处理数据结构时使用数据库引擎。关系数据结构比存储文本更快更灵活,更安全。忘掉选项2。
您可以使用递归UDF来检索整个树,而不用担心它。
答案 2 :(得分:0)
同一个表上可以为空的外键怎么样?类似的东西:
CREATE TABLE part (
part_id int not null auto_increment primary key,
parent_part_id int null,
constraint fk_parent_part foreign key (parent_part_id) references part (part_id)
)
答案 3 :(得分:0)
绝对不是选项2.这是一个麻烦的方法。正确的答案取决于可能的装配级数,以及您对装配的看法。你是否认为一个装配(一个由2个或更多原子部分组成的复合物)作为它自身的一部分,它本身可以作为一个副部分使用?或者组件是原子组件中的一种有趣的不同类型的东西吗?
如果前者是这种情况,那么将所有组件和零件放在一个带有PartID的表中,并添加第二个表,其中只包含由多个其他零件组成的零件的构造细节(这些零件可能是更多原子部件的组件)。第二个表格如下:
ConstructionDetails
PartId, SubPartId, QuantityRequired
如果您认为事情更像第二种方式,那么只将原子部分放在第一个表中,然后将程序集放在第二个表中
Assemblies
AssemblyId, PartId, QuantityRequired