不可否认,这可能是一个简单的问题,但我想确保我做对了:
我有3张桌子。奶昔和人之间有一对多的关系(一个人有很多奶昔)。人与冠心病护理人员之间也存在一对多的关系(一个人可以多次去冠心病。
这让我有很多对一对多的关系。几个链接告诉我,这基本上是一个多对多的关系,我需要一个链接表,但我假设Person表是这个链接?这又如何导致查询问题?
答案 0 :(得分:1)
实际上,如果你严格遵循Peter Chen最初描述的实体关系模型,那么你将有5个表--3个实体关系和2个关系关系。
Milkshake
和Coronary Care
之间通过两个一对多关系存在传递的多对多关系。在这种情况下,无需参与Person
表格 - 您可以将Owns
加入Attends
关于他们共同的Person
密钥:
SELECT milkshake_id, coronary_care_id
FROM Owns
INNER JOIN Attends ON Owns.person_id = Attends.person_id
现在,如果使用相同的行列式对表进行非规范化,则可以在问题中获得3个表:
在这种情况下,Milkshake
和Person
之间的关系记录在Milkshake
表格中,Person
和CoronaryCare
之间的关系记录在CoronaryCare
表。 (请记住,外键约束不是关系。)
您仍然可以获得多对多关系:
SELECT milkshake_id, coronary_care_id
FROM Milkshake
INNER JOIN CoronaryCare ON Milkshake.person_id = CoronaryCare.person_id
如您所见,Person
表不是链接。即使非规范化,您仍然有两个一对多的关系,除了它们现在记录在Milkshake
和CoronaryCare
表中。
您引用的推荐链接表的来源指的是直接的多对多关系,而不是传递的多对多关系。我们不需要记录传递关系,因为我们可以通过组合两个或多个直接关系来生成传递关系。
多对多关系是关系和实体关系数据建模的自然组成部分,只要您理解它们,就不会在查询中引起任何问题。