避免锦标赛软件的数据库冗余?

时间:2015-12-04 15:55:17

标签: mysql

我即将编写锦标赛软件。因此我在mysql数据库中有两个db-table: playersmatches。 在matches我保存了锦标赛中的每场比赛:

ID_player1, ID_player2, Goals_player1, Goals_player2

我想总结每个球员所有比赛的所有进球,所以我可以显示一个排名,赢得数据,目标和计数器显示。现在的问题是,如何在数据库中实现这一点:我看到了几个选项:

  • players表中保存目标和计数器。每次将匹配输入数据库时​​,目标和计数器都会添加到相关的播放器中。 (但冗余怎么样??)
  • players表中保存目标和计数器。但每次在数据库中输入匹配项时,都会在matches数据库上运行查询,并每次一次又一次地总结所有目标。这样我至少可以避免可能的不一致。
  • 不要在players表格中保存目标和计数器。但是每次我想显示所有目标的玩家等级时,每个玩家都会在整个matches表上运行一个人类数据库查询。在性能方面,这可能不是很聪明,是吗?

那么存储这些信息的最佳方式是什么? 我感谢每一个帮助或提示。 提前致以问候!

2 个答案:

答案 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,它不会导致不一致或冗余。

所以,为了决定走哪条路问自己:

  1. 数据库会变得非常庞大吗?
  2. 我是否需要经常显示统计数据?
  3. 比赛是否经常进行?
  4. 通过这些答案,您需要选择优先考虑性能或冗余的位置。