如果我有一個match table (id , details)
和team table (id,name)
,並且我想獲得給定兩個團隊玩的所有匹配。如何在sql中設計M-M表格之間的關係
我的解決辦法是:
創建第三個表包含(match_id,team1_id,team2_id)
這是在這種情況下,最好的做法是什麼?
如果我有一個match table (id , details)
和team table (id,name)
,並且我想獲得給定兩個團隊玩的所有匹配。如何在sql中設計M-M表格之間的關係
我的解決辦法是:
創建第三個表包含(match_id,team1_id,team2_id)
這是在這種情況下,最好的做法是什麼?
假設一個匹配只能由兩個表發揮,team1_id和team2_id應該作爲屬性的match
表本身的一部分。不需要單獨的表格。您還可以在team1_id和team表的id之間定義FOREIGN KEY關係,並且也爲team2_id定義相同的關係。
將需要第三個表可以由多個團隊並且在這種情況下,要播放的匹配表的結構將是(match_id
,team_id
)那裏將多個記錄用相同match_id,即一對多的關係比賽表和match_teams表之間。
你並不需要第三個表 - 直接從match
表引用隊:
只是爲了澄清,該{team1_id, team2_id}
應該不是一個關鍵的,允許同一對的團隊參與不止一場比賽。當然,不言而喻,你需要合適的FK和CHECK(team1_id <> team2_id)
。
要獲取由給定隊出場比賽,你需要..
SELECT ... WHERE team1_id = :given_team_id OR team2_id = :given_team_id
...所以你需要在兩個團隊的ID指標,如I1
和I2
圖中表示以上。
另外,考慮爲了性能原因使這些索引更寬。例如,如果你只取字段的有限的子集...
SELECT team1_id, team2_id FROM ...
...拓寬索引cover這些字段(I1: {team1_id, team2_id}
和I2: {team2_id, team1_id}
),數據庫管理系統將不必碰你的桌子堆完全滿足查詢。
或者,你可以考慮使用一個自然鍵,例如:
這將允許你消除的指標之一(替代PK下一個:{match_id}
)但當然會使任何下游的FKs「更胖」,根據你正在努力完成的事情,may or may not是一件好事。
根據您的查詢的需求,你可以用PK字段的順序撥弄match_date
前面。
順便說一句,具有第三表{match_id, team_id}
適合於可以由兩個以上的小組(例如,帆船)播放的匹配。它也有一個不幸的功能,那就是隻允許一個甚至是零隊 - 這是你可能需要以非聲明方式防範的問題。
上面的設計確保有兩個團隊。
創建第三個表將是一個好主意。問題,你的意思是「得到一個特定團隊的所有比賽」?你的意思是你只想要match_ID,哪裏是兩隊踢球還是兩隊踢球? –
他們兩個玩的玩的比賽ID – Adham