我有一个数据库,表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)
感谢您的帮助。
答案 0 :(得分:0)
根据我对这个问题的理解,我认为这太复杂了,没什么价值。如果我理解正确的话,你会遇到类似图片的情况,并且你想让评论的关键字独一无二。
创建第四个表可能会起作用,但会增加不必要的复杂性。
您可以做的是将“注释”表的键作为两列的复合键,一列是序列号,另一列是表示父表的字符字段。所以你得到像(A,1),(A,2),(B,3),(A,4),(B,5)......等关键字。
这样您就不需要主表,也不需要表A或B中的FK。
答案 1 :(得分:0)
从纯粹的数据设计角度来看,你是在正确的轨道上,但并不完全。您可以使用实体 - 子类型方法,其中A
和B
是另一个实体(MasterID
)的子类型。正是这种超类型实体吸引了评论。但是,为了实现真正的子类型化,A
的PK和B
的PK将是MasterID
的FK。
您设计表格的方式有两个候选键。如果您消除了冗余候选键,那么您将拥有一个标准的实体子类型模式,这是一种合法且常用的设计方法。