グラフのデータを保存するための、等しく実行可能な 3 つの異なる方法を思いつきました。
問題のグラフは「時間の経過に伴うさまざまなカテゴリでのプレーヤーのスコア」です。カテゴリには、「建物」、「アイテム」、「クエストの完了」、「実績」などがあります。
方法 1:
CREATE TABLE `graphdata` (
`userid` INT UNSIGNED NOT NULL,
`date` DATE NOT NULL,
`category` ENUM('buildings','items',...) NOT NULL,
`score` FLOAT UNSIGNED NOT NULL,
PRIMARY KEY (`userid`, `date`, `category`),
INDEX `userid` (`userid`),
INDEX `date` (`date`)
) ENGINE=InnoDB
このテーブルには、ユーザー/日付/カテゴリの組み合わせごとに 1 行が含まれます。ユーザーのデータを表示するには、 by を選択しuserid
ます。古いエントリは次の方法で消去されます。
DELETE FROM `graphdata` WHERE `date` < DATE_ADD(NOW(),INTERVAL -1 WEEK)
方法 2:
CREATE TABLE `graphdata` (
`userid` INT UNSIGNED NOT NULL,
`buildings-1day` FLOAT UNSIGNED NOT NULL,
`buildings-2day` FLOAT UNSIGNED NOT NULL,
... (and so on for each category up to `-7day`
PRIMARY KEY (`userid`)
)
ユーザー ID による選択は、主キーであるため高速です。次のように、毎日のスコアがフィールドの下にシフトされます。
... SET `buildings-3day`=`buildings-2day`, `buildings-2day`=`buildings-1day`...
エントリは削除されません (ユーザーがアカウントを削除しない限り)。行はクエリで追加/更新できINSERT...ON DUPLICATE KEY UPDATE
ます。
方法 3:
JSON でエンコードされたスコア データの配列を含む、ユーザーごとに 1 つのファイルを使用します。いずれにせよデータは AJAX JSON 呼び出しによって取得されるため、サーバーにストレスを与えることなく、ファイルを静的に取得することができます (次の深夜までキャッシュすることもできます)。サーバーは毎日各ファイルを実行し、shift()
各アレイの最も古いスコアからpush()
最後に新しいスコアへと進みます。
個人的には方法 3 が群を抜いて優れていると思いますが、データベースの代わりにファイルを使用することについて悪いことを聞いたことがあります。
2 つのデータベース ソリューションのうち、以前のプロジェクトの 1 つに方法 2 を実装しましたが、これは非常にうまく機能しているようです。方法 1 は、リレーショナル データベースなどをより有効に利用できるという点で「優れている」ように見えますが、(number of users) * (number of categories) * 7
行が含まれるため、大きな数になる可能性があるという点で少し心配です。
どの方法を使用するかについて最終的な決定を下すのに役立つ可能性がある、私が見逃しているものはありますか? 1、2、3、または上記のどれでもない?