我正在开发一个基于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对所有数据进行深入查询会很好,但不一定是必需的。
答案 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
使用外键确保维持关系;但我不知道数据库是否可以阻止你进入循环,你可能不得不依赖代码或存储过程。