解决多对多的关系

Jed*_*Pie 2 database

有没有人有一个过程或方法用于确定如何在关系数据库中恢复多对多关系?这是我的情景.我有一组联系人和一组电话号码.每个联系人可以与多个电话号码相关联,并且每个电话号码可以与多个联系人相关联.

这种情况的一个简单例子是具有两个雇员(e1和e2),一个主要语音线路(v1),一个私人语音线路(v2)的办公室.e1是首席执行官,因此他们拥有自己的私人语音线路v1,但也可以通过拨打主线v2和要求首席执行官来联系他们.e2只是一名员工,只能通过拨打v2来联系.

因此,e1应该与v1和v2相关.e2应与v2相关.相反,v1应与e1相关,v2应与e1和e2相关.

这里的目标是能够运行诸如"可以在哪里获得什么数字"和"在v2可以达到什么样的员工"等查询等等.我知道答案将涉及一个或多个中间表,但我只能'似乎确定了确切的架构.

Tom*_*ter 7

查询不需要任何临时表.有一个映射的中间表.

numbers_tbl
-----------
nid   int
number    varchar

employees_tbl
-----------
eid       int
name  varchar

employee_to_phone_tbl
-----------
eid       int
nid       int
Run Code Online (Sandbox Code Playgroud)

我该如何打电话给鲍勃?

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'
Run Code Online (Sandbox Code Playgroud)

如果我拨打这个号码,谁可能会接听?

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'
Run Code Online (Sandbox Code Playgroud)


MK_*_*Dev 6

雇员:

eID, eName
1, e1
2, e2
Run Code Online (Sandbox Code Playgroud)

电话号码:

pID, pNumber
1, v1
2, v2
Run Code Online (Sandbox Code Playgroud)

EmployeePhones:

eID, pID
1, 1
1, 2
2, 2
Run Code Online (Sandbox Code Playgroud)

然后你内心加入.如果你需要找出(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'
Run Code Online (Sandbox Code Playgroud)

我相信这应该工作(现在测试......)

编辑:我花了几分钟打字,抱歉重复...