多对多但源自多个表

时间:2012-03-21 00:29:27

标签: sql sql-server-2008 database-design

我应该发送一个包含可变内容的盒子并在数据库中跟踪它。我的所有项目(框的内容)都是不同的类型,并且需要不同的表来跟踪它们各自的信息,尽管每个项目类型具有相同的长度序列号(即PK是相同的数据类型)。我有一张Boxes表。

所以每个项目都有一个表(~7个表)和盒子表。我想创建一个BoxContents表。我尝试创建一个包含两列的多对多关系中间表:一列用于BoxID,另一列用于ItemBarcode,其中BoxID是{{1}上PK的FK表Boxes是项目表中每个PK的FK(即我试图将多个表链接到同一列)。不出所料,这不起作用。我尝试插入一个项目,但除了ItemBarcode个关系之外的所有关系都违反了FK约束。

如何构建我的关系以将多种类型的项链接到一个表中的一个框?这是合乎逻辑的方法吗?您需要更多信息吗?

3 个答案:

答案 0 :(得分:7)

您需要一个类别层次结构(也就是。类层次结构,子类型层次结构,继承层次结构......):

enter image description here

3 main strategies用于实现类别层次结构。如果您选择“一个表中的所有类”或“每个表的类”,那么无论您拥有多少个项,您只需要一个“链接”表来实现多个 - 很多关系。

答案 1 :(得分:1)

如果ItemBarcode值真正唯一,我的第一选择是:

编辑:添加了所需触发器的说明。

  • 添加触发器以强制执行条形码唯一性。 (每个项目表上的插入/更新触发器需要验证所有(新)分配的条形码不会出现在其他项目表中。)
  • 在条形码一侧使用一个没有FK关系的BoxId / ItemBarcode表,但使用触发器确保它仍然有效。 (关联表上的插入/更新触发器需要验证条目表中是否存在条形码。每个项目表上的删除触发器需要阻止或级联删除关联表中的项目。更新触发器项目表需要更新和更改关联表中的条形码。最后一个可以集成到前一个项目符号中的插入/更新触发器中。)
  • 考虑使用所有项目的视图ItemBarcode访问公共数据。

我的第二个选择是 n 项目类型的 n BoxId / ItemBarcode表。直截了当,但有点忙。它使得添加新项目类型比它需要的更加混乱。

我不会使用BoxId / ItemTypeId / ItemBarcode表格。它通过再次关联ItemTypeIdItemBarcode来对数据进行非规范化,它不允许在条形码一侧使用FK,并且仍然需要触发器来确保完整性。

不要害怕触发器。他们可以非常有效地解决一些问题。

答案 2 :(得分:0)

关系数据库对这类问题并不好。您的基本设计是正确的 - 表之间的FK的关联表。

您的选择是:

  1. 您的关联表中有多列 - 每个项目表一列
  2. 将商品数据合并到一个商品表
  3. 我会选择2。