解决多对多的关系

时间:2009-01-30 21:49:48

标签: database

是否有人使用某个流程或方法来确定如何在关系数据库中恢复多对多关系?这是我的情景。我有一组联系人和一组电话号码。每个联系人都可以与多个电话号码相关联,每个电话号码可以与多个联系人关联。

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

因此,e1应该与v1& V2。 e2应与v2相关。相反,v1应与e1相关,而v2应与e1& E2。

这里的目标是能够运行诸如“可以在哪里获得数字”以及“在v2可以达到什么样的员工”等查询等等。我知道答案将涉及一个或多个中间表但我似乎无法确定具体的架构。

5 个答案:

答案 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

这是最佳/唯一的方法吗?