首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解决多对多关系

解决多对多关系
EN

Stack Overflow用户
提问于 2009-01-30 21:49:48
回答 5查看 9.6K关注 0票数 2

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

这种情况的一个简单示例是具有两名员工(e1和e2)、一条主语音线路(v1)和一条专用语音线路(v2)的办公室。e1是首席执行官,所以他们有自己的私人语音线路v1,但也可以通过呼叫主线v2来联系到他们,并要求首席执行官。e2只是一名员工,只能通过调用v2来访问。

因此,e1应该与v1 & v2相关。e2应该与v2相关。通常,v1应该与e1相关,v2应该与e1 & e2相关。

这里的目标是让ge能够运行诸如“e1可以联系到哪些号码”和“v2可以联系到哪些员工”等查询。我知道答案将涉及一个或多个中间表,但我似乎无法确定确切的体系结构。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-01-30 22:01:52

员工:

代码语言:javascript
复制
eID, eName
1, e1
2, e2

PhoneNumbers:

代码语言:javascript
复制
pID, pNumber
1, v1
2, v2

EmployeePhones:

代码语言:javascript
复制
eID, pID
1, 1
1, 2
2, 2

然后你进行内部连接。如果您需要找出可以通过(t- e1 )联系到的号码:

代码语言:javascript
复制
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'

我相信这应该是可行的(现在就测试它...)

编辑:我花了几分钟打字,很抱歉有重复的地方...

票数 6
EN

Stack Overflow用户

发布于 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'

票数 7
EN

Stack Overflow用户

发布于 2009-01-30 22:36:39

其他人已经解释了模式,但我将解释这个概念。他们为您构建的名为EmployeePhones和employee_to_phone_tbl的表称为Associative Entity,这是Weak Entity的一种类型。

弱实体没有自己的自然键,必须根据其外键进行定义。存在关联实体的唯一目的是在不支持该概念的数据库中映射多对多关系。它的主键是它映射的表的分组外键。

有关关系理论的更多信息,请参阅this link

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/497395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档