有没有人有流程或方法可以用来确定如何在关系数据库中恢复多对多关系?这是我的场景。我有一组联系人和一组电话号码。每个联系人可以与多个电话号码关联,每个电话号码可以与多个联系人关联。
这种情况的一个简单示例是具有两名员工(e1和e2)、一条主语音线路(v1)和一条专用语音线路(v2)的办公室。e1是首席执行官,所以他们有自己的私人语音线路v1,但也可以通过呼叫主线v2来联系到他们,并要求首席执行官。e2只是一名员工,只能通过调用v2来访问。
因此,e1应该与v1 & v2相关。e2应该与v2相关。通常,v1应该与e1相关,v2应该与e1 & e2相关。
这里的目标是让ge能够运行诸如“e1可以联系到哪些号码”和“v2可以联系到哪些员工”等查询。我知道答案将涉及一个或多个中间表,但我似乎无法确定确切的体系结构。
发布于 2009-01-30 22:01:52
员工:
eID, eName
1, e1
2, e2PhoneNumbers:
pID, pNumber
1, v1
2, v2EmployeePhones:
eID, pID
1, 1
1, 2
2, 2然后你进行内部连接。如果您需要找出可以通过(t- e1 )联系到的号码:
SELECT E.eName, P.pNumber
FROM dbo.Employees E
INNER JOIN dbo.EmployeePhones EP ON E.eID = EP.eID
INNER JOIN dbo.PhoneNumbers P ON EP.pID = P.eID
WHERE E.eName = 'e1'我相信这应该是可行的(现在就测试它...)
编辑:我花了几分钟打字,很抱歉有重复的地方...
发布于 2009-01-30 21:54:52
查询不需要任何临时表。有一个用于映射的中间表。
numbers_tbl - nid int number varchar employees_tbl - eid int name varchar employee_to_phone_tbl - eid int nid int
我怎么打电话给鲍勃?
select * from employees_tbl e inner join employee_to_phone_tbl m on e.eid = m.eid inner join numbers_tbl n on m.nid = n.nid where e.name = 'Bob‘
如果我打这个号码,谁会接电话?
select * from numbers_tbl n inner join employee_to_phone_tbl m on m.nid = n.nid inner join employees_tbl e on e.eid = m.eid where n.number = '555-5555'
发布于 2009-01-30 22:36:39
其他人已经解释了模式,但我将解释这个概念。他们为您构建的名为EmployeePhones和employee_to_phone_tbl的表称为Associative Entity,这是Weak Entity的一种类型。
弱实体没有自己的自然键,必须根据其外键进行定义。存在关联实体的唯一目的是在不支持该概念的数据库中映射多对多关系。它的主键是它映射的表的分组外键。
有关关系理论的更多信息,请参阅this link
https://stackoverflow.com/questions/497395
复制相似问题