2010-11-27 15 views
1

私は現在、ユーザがタスクを完了してポイントを獲得する小さなアプリを開発中です。私が望むのは、データベーステーブルを設計する最良の方法に関するアドバイスです。いくつかの点で、システムはSOに似ています。ユーザーはタスクを完了し(SO答えの質問で)、そのポイントで残高が更新されます。ユーザポイントシステムをデータベースに保存する最良の方法

私は現在、通常のユーザー情報を格納しているユーザーテーブルを持っていますが、それを引き継ぐ方法はわかりません。

私はポイントテーブル(ユーザは多くのポイントを持っている)を持っていることをお勧めします。ユーザーポイントを照会するときに、与えられたuser_idですべてのポイントを取り出して合計しますか?

これを行うより効率的な方法はありますか? pointsは、ユーザーせずに任意の意味を持っており、それとの1対1の関係ですしていない場合

おかげで、

ジャック

答えて

1

追加ポイントテーブルは、獲得ポイントの理由を追跡することができるので、公正なアプローチです。ユーザー数、ポイント・トランザクション、使用されているサーバーによって、一般的に必要な集約をいくつか保持することを検討します。最も一般的には、ユーザーの合計数です。

ポイントテーブルに新しいポイントレコードを挿入するには、ポイントテーブルのポイントを記録するだけでなく、各ユーザーのポイント集計を増やすストアドプロシージャを使用できます。この集約は、Odedによって提案されたように、users表の別の列に保持されます。

あなたのデザインが進歩するにつれて、事前に計算できる新しい有用な集計が現れるかもしれません。

しかし、物事を単純にするためには、ユーザーの合計ポイントを計算するのに時間がかかりすぎるなど、絶対に必要な場合にのみ、これらの集計を使用してください。小さなシステムでは、実際にこれらの合計を計算するのは問題ではありません。

1

は、私がuserテーブルの上に直接フィールドを置きます。

場合は、しかし、あなたはユーザごとのポイントの種類を記録している、私はpoints_type検索とuserpoints_type IDにキーpointsテーブルを作成します。

+0

返信いただきありがとうございます - 私はポイントテーブルのポイントを獲得するたびに新しいエントリを追加します。したがって、それは1対多の関係になります。私は、これらの2つのアプローチを組み合わせて、集約をusersテーブルに格納することが賢明かもしれないと思います。 – Jack

3

あなたがポイント合計に関心がある場合は、Odedが示唆しているように、フィールドを直接Userテーブルに含めてください。ただし、ポイントが取得されたかどうかを知る必要がある場合は、ポイント取引のテーブルを用意することができます。この取引テーブルは、Userテーブルのuser_idフィールドとActionPointsDateのようなさまざまなフィールドへの外部キーを持つことができます。

アムI最良のポイントテーブルを持っているのはなぜユーザーは多くのポイントを持っているでしょう

(ユーザー は、多くのポイントを持っていますか)?のように、さまざまなカテゴリに関連付けられているポイント? Odedもまた言及しているように、これはこれらの点の意味になり、どのような情報をあなたが知りたいのですか(それを取得した人やそれに影響を与えた人ユーザーのポイントを掲示する)。

関連する問題