4

ユーザーが特定の目標またはタスクを完了するとバッジを獲得する Web サイトを実装しています。
バッジにもレベル/色があります。たとえば、ユーザーはレベル 0 のブロンズ バッジから始めて、レベル 1 のブロンズ バッジを取得し、さらに数レベル後にレベル 0 のシルバー バッジを取得します。

私はデータベースを構築していましたが、バッジをユーザーに接続する方法がわかりませんでした。

私が思いついたアイデアは、ユーザー用に 1 つのテーブル、バッジ用に 1 つのテーブル、および UserID を BadgeID に接続する 3 番目のテーブルを作成することでした。

ここでの私の関心は最適化です。サイトに参加してバッジを獲得するユーザーが増えると、テーブルへのアクセスとレコードの検索が遅くなるのではないでしょうか?

そして、Java でシングルトンを使用してサーバー上でスクリプトを定期的に実行し、ユーザーの状態をルールに照らしてチェックして、上限の目標を満たすバッジをアップグレードする方法についてここで読みました。この方法は本当にスケーラブルですか? または、代わりにこの投稿をフォローする必要がありますか?

ティア

4

2 に答える 2

5

より多くのユーザーがサイトに参加してバッジを獲得するにつれて、テーブルへのアクセスとレコードの検索が遅くなるのではないでしょうか?

テーブルが適切にインデックス化されていれば、それほど重要ではありません。

次のように考えてみてください...百科事典に 5 倍の記事があった場合、その百科事典で記事を見つけるのに非常に長い時間がかかりますか?

あまり; 百科事典はアルファベット順に索引付けされているため、記事の数が大幅に増加しても、何かを見つけるのにそれほど時間はかかりません。ただし、インデックスが作成されていないと、百科事典のサイズが大きくなるにつれて、物事を見つけるのにかかる時間が指数関数的に増加します。


あなたの質問とあなたがリンクしたリソースを考えると、あなたは「バッジ」に焦点を絞っているように感じます.

たとえば、バッジが常に順番に配布される場合、誰かが最後に取得したバッジを記録するだけで済みます。その場合、最後のバッジまでのすべてのバッジを取得している必要があります。それらが増分的でない場合は、説明したようにリンクテーブルを使用するとうまくいくかもしれません。

問題のドメインに特に関連する用語 (「バッジ」) ではなく、データベースまたはデータ モデリングに関連する用語で問題を説明するようにしてください。これは、どのような種類の情報を探すべきかを理解し、最終的に正しい行動方針に導くのに役立ちます。

于 2012-02-20T00:02:25.857 に答える
1

今のところ、説明したとおりに実装できます(1つのバッジテーブル、1つのユーザーテーブル、1つのリレーションシップテーブル)。

ユーザーが1つのバッジしか持てず、バッジが順番に配布される限り、最後のバッジのみを保存するというGGGのアプローチは非常に優れています。ただし、関係テーブルは必要ありません。

リレーションシップテーブルを使用すると、Foursquareバッジなど、複数のバッジをユーザーに同時に配布することができます(1:nリレーションシップ)。

MySQLを使用している場合は、InnoDBを使用する必要があります。

パフォーマンスの問題が発生した場合は、ストレージの前にある種のキャッシュレイヤーを検討できます。たとえば、memcachedや、バッジ情報のためだけにNoSQLDBを使用するなどです。しかし、あなたがそれらに直面しなければならないとき、私はそれらの問題について心配するでしょう。

于 2012-02-22T16:34:45.183 に答える