2016-08-29 5 views
0

私はデータベーステーブルUserを持っています。ユーザーのスコア履歴をトラッキングするためのデータベーステーブル

データベーステーブル内の各ユーザーには、フィールドscoreを持っています。

時間の経過とともにユーザーのスコアがどのように変化したかを示したいと思います。

このスコアはどのように保存しますか?私はフィールドuserIdscoretimestampと独立したデータベーステーブルScoreを作成する必要がありますか?

私はまだ、ユーザーテーブルに順位を保存すべきか、それがScoreテーブルで順位を格納するのに十分でしょうか?代わりに、フィールドcurrentScoreIdまたはスコアデータベーステーブルの行を指し示すものを用意する必要がありますか?

私はMongoDBのを使用していますので、それは、リレーショナルクエリを使用することは容易ではないのですが、私は別のデータベースのテーブルに、ユーザーテーブルの両方でランクを保存するために愚かなようだと思います。ここで

答えて

-1

私はあなたのテーブル(ユーザーが)のように見えることを想定しています:

ユーザー=列(userIdを、スコア) user_audit =列(identifierPKは、ユーザーID、スコア、タイムスタンプと呼ばれる別のテーブルを作成します。 ) ユーザ監査履歴を取り込むためにユーザテーブルにトリガーを書き込みます。

ここでは、ユーザーテーブルの別の列を追加し、その歴史の残業を追跡することができます。

別のオプションは次のとおり

UserScoreAudit =カラム(USER_ID、oldScore、newScore、タイムスタンプ)

汎用監査テーブル=カラム(アクターID、OLDVALUE、newValueに、tableNameの、フィールド名、タイムスタンプ)

2

各ユーザのスコアのリストは、その大きさでない場合は、このようなスキーマを持つ検討するかもしれない:

{ 
    userId: "String", 
    currentScore: { // this would be the copy of the most recent score 
     score: "Integer", 
     timeStamp: "Date" 
    }, 
    scores: [ // an array of all scores of this user 
     { 
      score: "Integer", 
      timestamp: "Date" 
     }, 
     ... 
    ] 
} 

MongoDBではデータベースモデリングが異なります。伝統的なリレーショナルデータベースのように簡単なテーブル結合はありません。ランキングのよう

、あなたは別のフィールドとして保存したいですか?私は、たとえ伝統的なデータベースであっても、データベース内のすべてのランキングを更新するのは難しいと思います。だから私はcurrentScoreフィールドを追加し、そのフィールドに基づいてソートし、その場でランキングを生成することができます。

0

ピーターによって与えられた答えは、多くの場合に適していますが、スコアの数に制限がある場合(つまり、16メガバイト/文書を超えてしまうが)

https://docs.mongodb.com/manual/tutorial/model-referenced-one-to-many-relationships-between-documents/


は、そうでなければ、これは次のリンクを考えます良い方法:
https://docs.mongodb.com/manual/tutorial/model-embedded-one-to-many-relationships-between-documents/

関連する問題