使用master id的数据结构

时间:2013-12-31 07:19:20

标签: sql-server database ms-access relational-database

我有一个数据库,表A和B是一对多的关系。因此,A中的一个实体可以分配给B中的多个不同实体.A和B每个都有自己的特定字段,但也有与A或B相关的字段和工作流,它们基本上是相同的数据,但只与A或B.

作为一个例子,A中的实体可以出于不同的原因而有多个注释,因此B中的实体也可以。由于单个记录可以有多个注释,我必须在表A和B之外有一个相关的注释表。我不想有两个注释表,一个用于A,另一个用于B,因此我设置了一个与A和B相关的MasterID表,并强制执行参照完整性。这意味着当我想在A或B中添加记录时,我必须确保MasterID表中已存在MasterID。还有其他表具有相同类型的功能,注释只是一个示例,但如果我没有使用MasterID,我必须为A和B创建多个表。

所以我的问题是,这是正确的方法吗?还有另外一种方法吗?前端将在Access中,所以我遇到了一些麻烦,确保在创建A或B中的新记录之前创建MasterID。

MasterID(MasterID)

TableA(TableAID, FK_MasterID)

TableB(TableBID, FK_MasterID, FK_TableAID)

Comments(CommentID, MasterID, Comment)

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

根据我对这个问题的理解,我认为这太复杂了,没什么价值。如果我理解正确的话,你会遇到类似图片的情况,并且你想让评论的关键字独一无二。

创建第四个表可能会起作用,但会增加不必要的复杂性。

您可以做的是将“注释”表的键作为两列的复合键,一列是序列号,另一列是表示父表的字符字段。所以你得到像(A,1),(A,2),(B,3),(A,4),(B,5)......等关键字。

这样您就不需要主表,也不需要表A或B中的FK。

enter image description here

答案 1 :(得分:0)

从纯粹的数据设计角度来看,你是在正确的轨道上,但并不完全。您可以使用实体 - 子类型方法,其中AB是另一个实体(MasterID)的子类型。正是这种超类型实体吸引了评论。但是,为了实现真正的子类型化,A的PK和B的PK将是MasterID的FK。

您设计表格的方式有两个候选键。如果您消除了冗余候选键,那么您将拥有一个标准的实体子类型模式,这是一种合法且常用的设计方法。