2009-01-30 41 views
2

有沒有人有過程或方法來確定如何在關係數據庫中取消多對多關係?這是我的場景。我有一組聯繫人和一組電話號碼。每個聯繫人可以與多個電話號碼關聯,每個電話號碼可以與多個聯繫人關聯。解決多對多的關係

這種情況的一個簡單例子是兩個employess(e1 & e2),一個主話音線(v1),一個私人話音線(v2)的辦公室。 e1是首席執行官,所以他們擁有自己的私人語音線v1,但他們也可以通過呼叫主線v2和尋求首席執行官來達成。 e2只是一名員工,只能通過調用v2來訪問。

因此,e1應該與v1 & v2相關。 e2應與v2相關。換言之,v1應該與e1相關,並且v2應該與e1 & e2相關。

這裏的目標是能夠運行諸如「可以達到什麼數字」和「可以在v2能達到什麼樣的員工」等查詢。我知道答案將涉及一個或多箇中間表格,但是我似乎無法確定確切的架構。

回答

6

僱員:

eID, eName 
1, e1 
2, e2 

PHONENUMBERS:

pID, pNumber 
1, v1 
2, v2 

EmployeePhones:

eID, pID 
1, 1 
1, 2 
2, 2 

然後你內部加入。如果你需要找出什麼號碼E1可在(T-SQL)達到:

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' 

我認爲這應該工作(測試它現在...)

編輯:拿了我幾分鐘打字,對不起重複...

1
+0

我覺得我給的例子是標準化儘可能。兩個電話號碼和兩名員工。這仍然沒有解決如何解決多對多關係。 – JediPotPie 2009-01-30 22:02:24

+0

@JediPotPie - 我以爲你在問建築。我已閱讀您對@MK_Dev的評論。我可以看到你正在尋找合適的*查詢* - :-) – MarlonRibunal 2009-01-30 22:55:34

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' 
+0

看起來你需要一箇中間表給我。您在查詢中使用了三張表格; numbers_tbl,employees_tbl和employee_to_phone_tbl。 employee_to_phone_tbl就是我所說的中間表。 – JediPotPie 2009-01-30 22:01:10

+0

是的,AviewAnew的第一句話是誤導性的。任何多對多關係都應該使用映射表。 – 2009-01-30 22:03:15

0

經過多一點思考後,這裏是我想出了。它可能與AviewAnew正在考慮的方法一致。

員工
ID(指數)


ID(指數)

關係
employees.id(指數)
numbers.id(指數)


員工
1:E1
2:E2


1:V1
2:V2

關係
1:1
1:2
2:1

這是最好的/唯一的方法?

4

其他人已經解釋了模式,但我將解釋這個概念。他們正在爲您構建的名爲EmployeePhones和employee_to_phone_tbl的表稱爲Associative Entity,這是一種Weak Entity

弱實體沒有自己的自然鍵,而必須用其外鍵來定義。關聯實體存在的唯一目的是映射不支持該概念的數據庫中的多對多關係。它的主鍵是它映射到的表的分組外鍵。

有關關係理論的進一步信息,請參閱this link