2012-03-21 32 views
0

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

所以每个项目都有一个表格(~7个表格)加上表格。我想创建一个BoxContents表。我试图制作一个多列关系的中间表,两列:一列用于BoxID,一列用于ItemBarcode,其中BoxID是表中PK的FK,而ItemBarcode是FK给每个PK上的PK项目表(即我试图链接多个表到同一列)。毫不奇怪,这没有奏效。我尝试插入一个项目,并且除了其中一个ItemBarcode关系外,FK约束被违反。

如何构建我的关系以将多种类型的项目链接到一个表格中的一个表格?这是否合乎逻辑?你需要更多信息?

回答

1

我的第一选择,如果ItemBarcode的值是真正独特的,将是:

编辑:添加了所需触发器的描述。

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

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

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

不要害怕触发器。有一些问题可以很有效地解决。

+0

由于我之前没有使用过触发器,我怎么知道要检查哪张表来验证插入的条形码是否出现在正确的表格中?每个条目的条形码都有自己的前缀我想我有一些switch语句可以解析一部分条形码然后重定向到另一个存储过程? – Brad 2012-03-21 14:07:30

+0

哦!我想我明白了!当我想在插入单个项目表的同时插入到汇总表中时,我不会添加到“汇总项目”中(即填充boxcontents表格) !然后这些条目总是正确的。 – Brad 2012-03-21 14:10:18

+0

@Brad - 当您将一个项目添加到一个框中时,您只关心该项目的条形码在所有项目条形码的“联合”中。制作一个提供'union'的'view'可以简化事情。触发器可以强制执行_deferential_ integrity,也就是您自己的奇数版本的参照完整性,这样数据就不会被破坏。 (* - 挑战感兴趣的读者。) – HABO 2012-03-21 15:19:40

0

关系数据库对这类问题不好。你的基本设计是正确的 - 一个协会表格之间的FKs表。

你的选择是:

  1. 有多个列中的关联表 - 一个用于每个项目表
  2. 合并项目数据到一个项目表

我会去选择2

+0

我觉得像任何一种方式,我会最终与空白字段的行。如果我选择1,那么不是每个盒子都会有所有类型的物品。如果我选择选项2.并非每个项目都需要相同的列才能获得信息。空白的领域似乎不是一个好主意。特别是很多设计,对吧? – Brad 2012-03-21 00:55:56

+0

你可能更好的是在项目表中有稀疏的数据 - 它更容易管理,并且是有限的和小的行大小 – Bohemian 2012-03-21 00:58:42

+0

是的,不幸的是,但我可以经理将所有这些表合并为一个。我想我需要在应用程序级别强制执行必需的/ N/A字段。 – Brad 2012-03-21 01:22:15

6

你需要一个类别层次结构(也称为类层次结构,层次亚型,继承层次...。):

enter image description here

3 main strategies用于实现类层次结构。如果您选择“一张桌子上的所有课程”或“每张桌子的课程”,那么无论您拥有多少项目,您只需要一个“链接”表即可实现多对多关系。