0

我正在开发一个基于 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 对所有数据进行深入查询会很好,但不是必须的。

4

2 回答 2

0

表示数据的最简单方法是将 Parent 指针添加到 Batch 表。层次结构的根在此字段中将具有空值。任何非根都将指向其父级,而父级可能又指向另一个父级,等等,您可能拥有的级别尽可能多。

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

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

于 2010-12-06T19:53:22.223 回答
0

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

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

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

于 2010-12-08T12:56:09.280 回答