小規模なデータベースのパフォーマンスについて心配する人が多いようです。 DBMS に設計どおりの処理をさせます。 実際に (できれば負荷テストで) パフォーマンスの問題が見つかった場合は、それに対処するための手順を実行してください。それ以外の場合は、事前に最適化しないでください。
プレーヤー スコアの 1 つのバッチを格納するために一時テーブルを使用する代わりに、すべてのプレーヤー スコアをトランザクション テーブルに格納します。
列を削除し、テーブルを次のようuser.count
に置き換えます。temp
Table player_points{
pid number primary key,
match_date datetime primary key,
points number
}
これにより、任意のユーザーのスコアを簡単に計算できます。特定の日付のユーザーのスコアを再計算することもできます。これははるかに強力で、保守がはるかに簡単です。現在のスナップショットを保持しても、何か問題が発生したり、ユーザーの 1 人が自分のスコアに異議を唱えたりした場合に管理が不可能になるだけです。
このクエリは、すべてのユーザーのスコアを提供します。フィルターを追加して、1 人のユーザーのスコアを検索したり、リーダー ボードを表示したりするなど、他のことを行うことができます。
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