是否有人使用某个流程或方法来确定如何在关系数据库中恢复多对多关系?这是我的情景。我有一组联系人和一组电话号码。每个联系人都可以与多个电话号码相关联,每个电话号码可以与多个联系人关联。
这种情况的一个简单例子是具有两个雇员(e1& e2),一个主要语音线路(v1),一个私人语音线路(v2)的办公室。 e1是首席执行官,因此他们拥有自己的私人语音线路v1,但也可以通过拨打主线v2和要求首席执行官来联系他们。 e2只是一名员工,只能通过拨打v2来联系。
因此,e1应该与v1& V2。 e2应与v2相关。相反,v1应与e1相关,而v2应与e1& E2。
这里的目标是能够运行诸如“可以在哪里获得数字”以及“在v2可以达到什么样的员工”等查询等等。我知道答案将涉及一个或多个中间表但我似乎无法确定具体的架构。
答案 0 :(得分:7)
查询不需要任何临时表。有一个用于映射的中间表。
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'
答案 1 :(得分:6)
雇员:
eID, eName
1, e1
2, e2
PHONENUMBERS:
pID, pNumber
1, v1
2, v2
EmployeePhones:
eID, pID
1, 1
1, 2
2, 2
然后你内心加入。如果你需要找出(t-sql)可以达到的数量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'
我相信这应该有效(现在正在测试......)
编辑:我花了几分钟打字,抱歉复制......
答案 2 :(得分:4)
其他人已经解释了架构,但我将解释这个概念。他们正在为您构建的名为EmployeePhones和employee_to_phone_tbl的表称为Associative Entity,其类型为Weak Entity。
弱实体没有自己的自然键,必须根据其外键定义。存在关联实体的唯一目的是在不支持该概念的数据库中映射多对多关系。它的主键是它映射的表的分组外键。
有关关系理论的更多信息,请参阅this link
答案 3 :(得分:1)
答案 4 :(得分:0)
经过多一点思考,这就是我想出来的。它可能与AviewAnew所考虑的方法一致。
员工
id(索引)
姓名
数
id(索引)
数字
关系
employees.id(索引)
numbers.id(index)
员工
1:e1
2:e2
数
1:v1
2:v2
关系
1:1
1:2
2:1
这是最佳/唯一的方法吗?