幻想联盟的数据库设计

Pdk*_*ock 3 mysql database-design

这是我的数据库的基本架构

Table user{  
      userid numeber primary key,  
      count number  
}

Table player{  
      pid number primary key,  
}

Table user-player{  
      userid number primary key foreign key(user),  
      pid number primary key foreign key(player)  
}

Table temp{  
      pid number primary key,  
      points number  
}
Run Code Online (Sandbox Code Playgroud)

这是我打算做的......

  • 每次比赛结束后,临时表都会更新,其中包含参加最后一场比赛的球员的ID以及他们获得的积分.
  • 接下来运行一个过程,该过程将匹配临时表中的pid与具有相同pid的每个用户 - 播放器表的uid.
  • 将临时表中的点添加到每个匹配的uid的用户表计数中.
  • 空临时表.

我的问题是考虑200名玩家和10000名用户,这种方法会有效吗?我将使用mysql.

Joe*_*own 6

人们似乎常常担心小型数据库的性能. 让DBMS完成它的设计目标. 如果您在实践中 - 或者最好在负载测试中 - 发现您遇到性能问题,那么请采取措施来处理它.否则不要预先优化!

不是使用临时表来存储一批玩家得分,而是将所有玩家得分存储在一个交易表中.

删除user.count列并用以下内容替换temp表:

Table player_points{  
      pid number primary key,  
      match_date datetime primary key, 
      points number
}
Run Code Online (Sandbox Code Playgroud)

有了它,您可以轻松计算任何用户的分数.您甚至可以重新计算任何用户在给定日期的分数.这更加强大,维护起来也更简单.只保留当前快照,如果出现任何问题或者您的某个用户应该挑战他们的分数,则无法进行管理.

此查询为您提供所有用户的分数.您可以为其添加过滤器以执行其他操作,例如查找单个用户的分数或显示排行榜.

select 
  U.userid as UserID
, sum(S.points) as TotalScore
from user S 
  inner join user-player J
    on S.userid = J.userid
  inner join player_points S
    on J.pid = S.pid
group by
  U.userid
Run Code Online (Sandbox Code Playgroud)

这个查询会给你一个排行榜:

select 
  U.userid as UserID
, sum(S.points) as TotalScore
from user S 
  inner join user-player J
    on S.userid = J.userid
  inner join player_points S
    on J.pid = S.pid
group by
  U.userid
order by TotalScore desc
limit 10
Run Code Online (Sandbox Code Playgroud)

此查询将为您提供按日期分配给用户的积分,例如,您可以按原样或累计绘制图表.

select 
  S.match_date as MatchDate
, sum(S.points) as TotalScore
from user-player J
  inner join player_points S
    on J.pid = S.pid
where J.userid = 123 -- The user ID you want.
group by
  S.match_date 
order by S.match_date 
Run Code Online (Sandbox Code Playgroud)