一对多的最佳数据库结构设计

时间:2010-09-08 15:16:48

标签: php mysql database-design optimization

我正在建立一个供我公司内部使用的库存跟踪系统。我正在研究数据库结构,希望得到一些关于哪种设计更好的反馈*。

我需要一个递归(我可能会使用这个术语错误...)系统,其中一个部分可以由零个或多个部分组成。我有两种方法可以做到这一点,但我不确定使用哪种方法。我不是数据库设计方面的专家,所以也许我有一个他没有想过的选择。

  • 选项1: 两个表格part_id,另一个表格part_idsub_part_id(表示另一个part_id)和quantity。因此,一个表part_id将是唯一的,而另一个表可以是零行或多行,显示构成某个部分的所有部分。

  • 选项2: 一个表有part_id和汇编。程序集将是一个看起来像这样的文本字段part_id,quantity;part_id,quanity; ....然后我会使用PHP explode()函数用分号分隔,再用逗号分隔得到子数组份。

我希望这一切都有道理。我使用的是PHP / MySQL。

*社区维基,因为这可能是主观的。

4 个答案:

答案 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