以m:n关系引用两个表的数据

时间:2010-12-06 14:09:26

标签: mysql database recursive-datastructures

我正在开发一个基于mysql的系统来管理食品加工过程中的数据。 在这一点上,我遇到了以下具体问题:

我有一张表A,其中有一些项目:

Farmer      Quantity  
Farmer A    1000 kg  
Farmer B    500 kg

然后我有一个表B,它是来自表A的数据的m:n聚合:

Batch       Quantity     Quality etc.  
LI1         200 kg        ....  
LI2         12000 kg      ....

为了表示m:n关系,我有一个连接两者的表AB:

FK_Farmer    FK_Batch 
FarmerA      LI1   
FarmerB      LI1  
FarmerA      LI2  

现在的问题是:表B中的一些批次实际上是由其他批次组成的...这意味着它们是递归组合的。我有兴趣知道在数据库设计方面实现这种情况的最佳方法是什么。

我应该在表AB中包含一个引用回批处理表的附加外键吗?我是否应该强制执行外键并通过同一列引用农民和批处理表(并添加一个标志来表示递归或其他内容)? 我有没有其他明显的解决方案?

能够通过直接MySQL对所有数据进行深入查询会很好,但不一定是必需的。

2 个答案:

答案 0 :(得分:0)

表示数据的最简单方法是向Batch表添加Parent指针。层次结构的根在此字段中将为null。任何非root用户都会指向其父级,而父级可能会指向另一个父级等,其级别与您的级别相同。

查询这样的结构很棘手,因为标准SQL无法处理树。 Oracle在他们的SQL方言中有一个专有扩展,但我不认为MySQL会这样做。这意味着要追逐整个树,您必须编写循环查询的代码,或者您必须编写一个查询,对任意数量的最大级别执行多个连接。

但我不知道有什么更简单的方法。基本上我打算用代码而不是单个查询来追逐树。

答案 1 :(得分:0)

如果父批次可以有多个子批次,而子批次可以有多个父批次,那么您需要一个新的映射表:

FK_ParentBatch  FK_ChildBatch 
LI1             LI5   
LI1             LI6  
LI2             LI5
LI2             LI3
LI3             LI4

使用外键确保维持关系;但我不知道数据库是否可以阻止你进入循环,你可能不得不依赖代码或存储过程。