3

これが私のデータベースの基本的なスキーマです

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  
}

これが私がやろうとしていることです...

  • 試合が終わるたびに、最後の試合をプレイしたプレーヤーのIDと獲得したポイントを保持する一時テーブルが更新されます。
  • 次に、一時テーブルのpidを、同じpidを持つユーザープレーヤーテーブルのすべてのuidと一致させるプロシージャを実行します。
  • 一致するすべてのuidについて、一時テーブルのポイントをユーザーテーブルの数に追加します。
  • 空の一時テーブル。

私の質問は200人のプレイヤーと10000人のユーザーを考慮していますが、この方法は効率的ですか?これにはmysqlを使用します。

4

1 に答える 1

7

小規模なデータベースのパフォーマンスについて心配する人が多いようです。 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 
于 2012-12-19T12:55:47.033 に答える