gpt4 book ai didi

sql - sql中如何设计M-M表之间的关系

转载 作者:行者123 更新时间:2023-12-02 00:16:28 24 4
gpt4 key购买 nike

如果我有一个比赛表(id,详细信息)球队表(id,name),我想获得给定两支球队进行的所有比赛。

我的解决方案是:

创建第三个表包含 (match_id,team1_id,team2_id)

这是这种情况下的最佳做法吗?

最佳答案

您不需要第三个表 - 直接从 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 的索引,如 I1 所示和 I2在上图中。

此外,出于性能原因,请考虑使这些索引更宽。例如,如果您只获取有限的字段子集...

SELECT team1_id, team2_id FROM ...

...并将索引扩展到 cover这些字段(I1: {team1_id, team2_id}I2: {team2_id, team1_id}),DBMS 根本不需要触及您的表堆来满足查询。


或者,您可以考虑使用自然键,例如:

enter image description here

这将允许您消除其中一个索引(代理 PK 下的索引:{match_id}),但当然会使任何下游 FK“更胖”,即 may or may not成为一件好事取决于你想要完成什么。

根据您的查询需要,您可以调整 PK 字段的顺序:

  • 例如,如果您的大部分查询询问:“请提供最近 X 天的比赛”,请考虑移动 match_date到前面。
  • 如果您的大部分查询都要求随时进行比赛,请将其放在后面。
  • 如果两者都有,那么您需要一个额外的索引。

顺便说一句,有第三个表 {match_id, team_id}适用于可由两支以上队伍进行的比赛(如帆船)。它还有一个只允许一个甚至零个团队的不幸特性 - 这是您可能需要以非声明方式防范的事情。

上面的设计确保了恰好有两个团队。

关于sql - sql中如何设计M-M表之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12852226/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com