1

私は昨年かそこらの間、この問題に取り組み、やっていることを変えたり、別のことを試したりしてきました. 問題はスキーマに関係しているため、プレイヤー/クランのはしごでうまく注文できますが、後で統計を追加したい場合、列ごとに 1 つの統計があるため、すべての行を変更するテーブルがロックされません。

これを行う方法には 2 つのオプションがありますが、どちらも正しくないようです。1 つは列ごとに 1 つの統計です。user_stat_summary (はしごに表示される基本的な統計用)、user_stat_beast (チームは人間と獣)、user_stat_human および user_stat_overall の 4 つのテーブルがあります。過去 30 日間の統計がどこにでも表示されます。cron ジョブは、30 日後に発生した一致に関するクエリを取得し、それらの統計を 3 つのメイン テーブルから取り出して全体のテーブルに配置することにより、日付付きの統計を取得します。試合には、各プレイヤーがその試合で得た統計のブロブがあります。ここで私が目にする問題は、ゲームが少し変化したときに統計を簡単に追加できない行がたくさんある場合です。私が考えていたのは、各テーブルの extra_stats BLOB 列であり、新しい統計を追加すると、はしごでソートできなくなります。

もう 1 つのオプションは EAV モデルです。これは私がいろいろ試してきましたが、うまくいかないようです。クエリごとにさらに多くの行を取得し、それらをユーザーにグループ化すると、ほとんどの場合順序は機能しますが、一般に選択された行数が不明であるため、ページネーションの制限を適切に取得できませんでした。

私が考えていたのは、順序付けに使用できる統計ごとのランクを格納するテーブルを備えた EAV モデルです。したがって、EAVテーブルは現在次のとおりです...

CREATE TABLE `user_stat` (
    `user_id` int(10) unsigned NOT NULL,
    `stat_id` varchar(50) NOT NULL,
    `value` int(10) unsigned NOT NULL,
    PRIMARY KEY (`user_id`,`stat_id`),
    CONSTRAINT `user` FOREIGN KEY (`user_id`) REFERENCES `xf_user` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `user_human_stat` (
     `user_id` int(10) unsigned NOT NULL,
     `stat_id` varchar(50) NOT NULL,
     `value` int(10) unsigned NOT NULL,
     PRIMARY KEY (`user_id`,`stat_id`),
     CONSTRAINT `human_user` FOREIGN KEY (`user_id`) REFERENCES `xf_user` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `user_beast_stat` (
     `user_id` int(10) unsigned NOT NULL,
     `stat_id` varchar(50) NOT NULL,
     `value` int(10) unsigned NOT NULL,
     PRIMARY KEY (`user_id`,`stat_id`),
     CONSTRAINT `beast_user` FOREIGN KEY (`user_id`) REFERENCES `xf_user` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `user_stat_overall` (
     `user_id` int(10) unsigned NOT NULL,
     `human` blob NOT NULL,
     `beast` blob NOT NULL,
     `total` blob NOT NULL,
     PRIMARY KEY (`user_id`),
     CONSTRAINT `user_overall` FOREIGN KEY (`user_id`) REFERENCES `xf_user` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

したがって、user_id、stat_id、rank になる user_stat_rank テーブルを追加できると考えていました。次に、「kills」統計で並べ替えられたはしごの最初のページを取得したいとします。すべての user_ids をランク順に取得できます。stat_id は kills です。次に、2 番目のクエリを作成して、すべてのユーザーの統計情報を入力します。

これをすべて書いた後、うまくいくように見えますが、何かが見えないかもしれません。また、この質問がいたるところにあることも理解しています。そのため、場所の詳細を編集してほしい場合は、そのように言ってください。

4

1 に答える 1

1

管理しやすくするために、すべての統計に列を追加することに固執します。長い目で見れば、これは、例えば EAV モデルが課す制限のために、窮地に陥ることなく管理するためのおそらく最も簡単な方法です。

統計テーブルが大きくなりすぎることを心配している場合は、4 週間以上前のデータを履歴テーブルに定期的に移動する何らかの形式のテーブル パーティション分割を実装することを検討できます。履歴テーブルは、常に更新する必要がないため、極限までインデックスを作成できます。

于 2012-11-08T06:30:20.680 に答える