【问题标题】:Data referencing to both tables in m:n relation在 m:n 关系中引用两个表的数据
【发布时间】:2010-12-06 14:09:25
【问题描述】:

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

【问题讨论】:

  • 我假设的批次有某种形式的层次结构,至少没有循环,所以父母不能是自己的后代?批次是否也曾被拆分,因此它们是多个批次的后代?
  • 是的,不会有循环;一批不能从自身下降。我们有大约 3-4 层由其他产品制成的产品,它们以直接的层次结构组织。 A的加工导致产品B和C,产品B的加工导致D,E和F。批次可以由其他几个批次组成,是的;一个批次可能会进入多个其他批次。我需要做的是确保我们可以将批次追溯到它们的来源,同时确保重量转换等不在项目范围内。

标签: mysql database recursive-datastructures


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      相关资源
      最近更新 更多