2012-10-12 139 views
3

如果我有一個match table (id , details)team table (id,name),並且我想獲得給定兩個團隊玩的所有匹配。如何在sql中設計M-M表格之間的關係

我的解決辦法是:

創建第三個表包含(match_id,team1_id,team2_id)

這是在這種情況下,最好的做法是什麼?

+0

創建第三個表將是一個好主意。問題,你的意思是「得到一個特定團隊的所有比賽」?你的意思是你只想要match_ID,哪裏是兩隊踢球還是兩隊踢球? –

+0

他們兩個玩的玩的比賽ID – Adham

回答

1

假設一個匹配只能由兩個表發揮,team1_id和team2_id應該作爲屬性的match表本身的一部分。不需要單獨的表格。您還可以在team1_id和team表的id之間定義FOREIGN KEY關係,並且也爲team2_id定義相同的關係。

將需要第三個表可以由多個團隊並且在這種情況下,要播放的匹配表的結構將是(match_idteam_id)那裏將多個記錄用相同match_id,即一對多的關係比賽表和match_teams表之間。

2

你並不需要第三個表 - 直接從match表引用隊:

enter image description here

只是爲了澄清,該{team1_id, team2_id}應該是一個關鍵的,允許同一對的團隊參與不止一場比賽。當然,不言而喻,你需要合適的FK和CHECK(team1_id <> team2_id)

要獲取由給定隊出場比賽,你需要..

SELECT ... WHERE team1_id = :given_team_id OR team2_id = :given_team_id 

...所以你需要在兩個團隊的ID指標,如I1I2圖中表示以上。

另外,考慮爲了性能原因使這些索引更寬。例如,如果你只取字段的有限的子集...

SELECT team1_id, team2_id FROM ... 

...拓寬索引cover這些字段(I1: {team1_id, team2_id}I2: {team2_id, team1_id}),數據庫管理系統將不必碰你的桌子堆完全滿足查詢。


或者,你可以考慮使用一個自然鍵,例如:

enter image description here

這將允許你消除的指標之一(替代PK下一個:{match_id})但當然會使任何下游的FKs「更胖」,根據你正在努力完成的事情,may or may not是一件好事。

  • 例如,如果您的大多數疑問的問:「給我匹配的最後X天打出了」,考慮將

    根據您的查詢的需求,你可以用PK字段的順序撥弄match_date前面。

  • 如果大部分查詢要求隨時播放比賽,請將其保留在後面。
  • 如果兩者都有,那麼您需要額外的索引。

順便說一句,具有第三表{match_id, team_id}適合於可以由兩個以上的小組(例如,帆船)播放的匹配。它也有一個不幸的功能,那就是隻允許一個甚至是零隊 - 這是你可能需要以非聲明方式防範的問題。

上面的設計確保有兩個團隊。