如何避免多对多的关系

时间:2016-06-09 04:32:53

标签: database-design

不可否认,这可能是一个简单的问题,但我想确保我做对了:

我有3张桌子。奶昔和人之间有一对多的关系(一个人有很多奶昔)。人与冠心病护理人员之间也存在一对多的关系(一个人可以多次去冠心病。

这让我有很多对一对多的关系。几个链接告诉我,这基本上是一个多对多的关系,我需要一个链接表,但我假设Person表是这个链接?这又如何导致查询问题?

1 个答案:

答案 0 :(得分:1)

实际上,如果你严格遵循Peter Chen最初描述的实体关系模型,那么你将有5个表--3个实体关系和2个关系关系。

Many-to-one-to-many ER

Many-to-one-to-many tables

MilkshakeCoronary Care之间通过两个一对多关系存在传递的多对多关系。在这种情况下,无需参与Person表格 - 您可以将Owns加入Attends关于他们共同的Person密钥:

SELECT milkshake_id, coronary_care_id
FROM Owns
INNER JOIN Attends ON Owns.person_id = Attends.person_id

现在,如果使用相同的行列式对表进行非规范化,则可以在问题中获得3个表:

Denormalized tables

在这种情况下,MilkshakePerson之间的关系记录在Milkshake表格中,PersonCoronaryCare之间的关系记录在CoronaryCare表。 (请记住,外键约束不是关系。)

您仍然可以获得多对多关系:

SELECT milkshake_id, coronary_care_id
FROM Milkshake
INNER JOIN CoronaryCare ON Milkshake.person_id = CoronaryCare.person_id

如您所见,Person表不是链接。即使非规范化,您仍然有两个一对多的关系,除了它们现在记录在MilkshakeCoronaryCare表中。

您引用的推荐链接表的来源指的是直接的多对多关系,而不是传递的多对多关系。我们不需要记录传递关系,因为我们可以通过组合两个或多个直接关系来生成传递关系。

多对多关系是关系和实体关系数据建模的自然组成部分,只要您理解它们,就不会在查询中引起任何问题。