我即将编写锦标赛软件。因此我在mysql数据库中有两个db-table:
players
和matches
。
在matches
我保存了锦标赛中的每场比赛:
ID_player1, ID_player2, Goals_player1, Goals_player2
我想总结每个球员所有比赛的所有进球,所以我可以显示一个排名,赢得数据,目标和计数器显示。现在的问题是,如何在数据库中实现这一点:我看到了几个选项:
players
表中保存目标和计数器。每次将匹配输入数据库时,目标和计数器都会添加到相关的播放器中。 (但冗余怎么样??)players
表中保存目标和计数器。但每次在数据库中输入匹配项时,都会在matches
数据库上运行查询,并每次一次又一次地总结所有目标。这样我至少可以避免可能的不一致。players
表格中保存目标和计数器。但是每次我想显示所有目标的玩家等级时,每个玩家都会在整个matches
表上运行一个人类数据库查询。在性能方面,这可能不是很聪明,是吗?那么存储这些信息的最佳方式是什么? 我感谢每一个帮助或提示。 提前致以问候!
答案 0 :(得分:1)
事情是目标不属于球员或比赛。它们属于两者之间的关系。你需要一个将玩家与匹配相关联的表,称之为PlayerPlayedInMatch。该表将具有player_id和match_id,用于标识特定玩家在该匹配中玩牌。该玩家参与该比赛的部分数据将是他们制定的目标。
总结一下:
PLAYER TABLE
id (this is primary key)
first_name
last_name
current_ranking
....
MATCH TABLE
id (this is primary key)
Start (date and time match starts)
Location
....
PLAYER_PLAYED_IN_MATCH
player_id (foreign key to player.id)
match_id (foreign key to match.id)
(player_id and match_id, together, make the primary key of this table)
goals_made
....
要查询每个玩家的总目标,您可以这样查询:
select player.id, player.name, sum(player_played_in_match.goals_made)
from player
join player_played_in_match on player_played_in_match.player_id = player.id
要查询每位玩家的目标,请列出匹配项:
select player.id, player.name, match.location, player_played_in_match.goals_made
from player
join player_played_in_match on player_played_in_match.player_id = player.id
join match on player_played_in_match.match_id = match.id
您可能还会有一个表格来识别每个团队。同样需要在你的球员,球队和比赛之间建立正确的关系,如果你考虑到一个球员可能会从一个球队转移到另一个球队,那么你的数据库可能必须考虑到这一点,这可能会有点复杂。但这一切都是可行的。
答案 1 :(得分:0)
您将始终在性能和冗余之间进行权衡。
如果您的数据库非常大,您需要向每个玩家展示统计数据(目标和反制品)经常(每次都在他的名字旁边)看来你应该使用选项1.此外,如果不经常播放比赛,你可以使用matches
表重新计算统计数据,以避免不一致。如果他们经常玩,你将不得不添加新的目标和反对象。这可能导致不一致,但同样会在某处进行权衡。
如果数据库不是那么大,或者你真的不经常显示统计数据,你应该坚持使用最简单的选项3,它不会导致不一致或冗余。
所以,为了决定走哪条路问自己:
通过这些答案,您需要选择优先考虑性能或冗余的位置。