能否在父表games中使用子表teams主键?求最佳实践建议
游戏获胜方标记的数据库设计方案分析
方案一是否有效?
方案一完全有效。每个游戏结束后只会产生一个获胜队伍,在games表新增winner字段存储teams表的主键值,能直接建立游戏与获胜队伍的关联,逻辑清晰,完全能满足查询和数据记录的需求。
哪种是数据库设计的最佳实践?
方案一是更符合最佳实践的选择,原因如下:
- 从业务逻辑看,“获胜方”是游戏的属性,而非队伍的属性——一个队伍可能参与多场游戏,有的赢有的输,把获胜标记放在
games表才更贴合业务本质。 - 方案二存在数据歧义问题:
teams表的is_winner字段无法对应到具体游戏,比如某队伍赢了游戏A、输了游戏B,这个字段根本无法同时准确记录这两种状态,会导致数据混乱。 - 方案一更符合数据库设计范式:每个表只存储与自身核心属性相关的数据,
games表记录游戏的关键信息(包括获胜方),teams表专注记录队伍本身的信息,职责划分清晰,数据一致性更容易维护。 - 查询效率更高:要获取某场游戏的获胜队伍,直接通过
games.winner关联teams表即可,无需额外过滤is_winner字段,避免不必要的逻辑判断。
内容的提问来源于stack exchange,提问作者Rushabh Joshi
相关产品推荐
相关产品推荐

