这是我的数据库的基本架构
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
}
这是我打算做的......
我的问题是考虑200名玩家和10000名用户,这种方法会有效吗? 我将使用mysql。
答案 0 :(得分:6)
人们似乎常常担心小型数据库的性能。 让DBMS按照自己的意图行事。如果您在实践中 - 或者最好在负载测试中 - 发现您遇到了性能问题,那么请采取措施来解决它。否则不预先优化!
不是使用临时表来存储一批玩家得分,而是将所有玩家得分存储在一个交易表中。
删除user.count
列并将temp
表替换为以下内容:
Table player_points{
pid number primary key,
match_date datetime primary key,
points number
}
通过这个,您可以轻松计算任何用户的分数。您甚至可以重新计算任何用户在给定日期的分数。这更加强大,维护起来也更简单。只保留当前快照,如果出现任何问题或者您的某个用户是否会挑战他们的分数,则无法进行管理。
此查询为您提供所有用户的分数。您可以为其添加过滤器以执行其他操作,例如查找单个用户的分数或显示排行榜。
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
此查询会为您提供一个排行榜:
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
此查询将为您提供按日期分配给用户的分数,例如,您可以按原样或累积分析。
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