我应该发送一个包含可变内容的盒子并在数据库中跟踪它。我的所有项目(框的内容)都是不同的类型,并且需要不同的表来跟踪它们各自的信息,尽管每个项目类型具有相同的长度序列号(即PK是相同的数据类型)。我有一张Boxes表。
所以每个项目都有一个表(~7个表)和盒子表。我想创建一个BoxContents
表。我尝试创建一个包含两列的多对多关系中间表:一列用于BoxID
,另一列用于ItemBarcode
,其中BoxID
是{{1}上PK的FK表Boxes
是项目表中每个PK的FK(即我试图将多个表链接到同一列)。不出所料,这不起作用。我尝试插入一个项目,但除了ItemBarcode
个关系之外的所有关系都违反了FK约束。
如何构建我的关系以将多种类型的项链接到一个表中的一个框?这是合乎逻辑的方法吗?您需要更多信息吗?
答案 0 :(得分:7)
您需要一个类别层次结构(也就是。类层次结构,子类型层次结构,继承层次结构......):
有3 main strategies用于实现类别层次结构。如果您选择“一个表中的所有类”或“每个表的类”,那么无论您拥有多少个种项,您只需要一个“链接”表来实现多个 - 很多关系。
答案 1 :(得分:1)
如果ItemBarcode
值真正唯一,我的第一选择是:
编辑:添加了所需触发器的说明。
BoxId
/ ItemBarcode
表,但使用触发器确保它仍然有效。
(关联表上的插入/更新触发器需要验证条目表中是否存在条形码。每个项目表上的删除触发器需要阻止或级联删除关联表中的项目。更新触发器项目表需要更新和更改关联表中的条形码。最后一个可以集成到前一个项目符号中的插入/更新触发器中。)ItemBarcode
访问公共数据。我的第二个选择是 n 项目类型的 n BoxId
/ ItemBarcode
表。直截了当,但有点忙。它使得添加新项目类型比它需要的更加混乱。
我不会使用BoxId
/ ItemTypeId
/ ItemBarcode
表格。它通过再次关联ItemTypeId
和ItemBarcode
来对数据进行非规范化,它不允许在条形码一侧使用FK,并且仍然需要触发器来确保完整性。
不要害怕触发器。他们可以非常有效地解决一些问题。
答案 2 :(得分:0)
关系数据库对这类问题并不好。您的基本设计是正确的 - 表之间的FK的关联表。
您的选择是:
我会选择2。