3

私は MySQL データベースを作成しており、それを正規化する方法を知っていると確信しています。しかし、どう対処すればよいか分からない問題があります。

私はテーブルを持っていると言う

users
----------
user_id primary key
some_field
some_field2
start_date
user_level

ここで、user_level はユーザーのレベルを示します。これは、1、2、3、4、5 と言うことができます。しかし、時間が経つにつれて、ユーザーはレベルを変更する可能性があります。明らかに、レベルが変更された場合は、users テーブルに対して単純に UPDATE を実行できます。しかし、ユーザーの過去のレベルの履歴を記録しておきたい

このため、user_level_history という新しいテーブルを検討しています。

user_level_history
--------------
id autoincrement primary key
user_id
level_start_date

次に、users テーブルを変更します。

users
----------
user_id primary key
some_field
some_field2
start_date
user_level_history_id

次に、ユーザーの現在のレベルを取得するために、

user_level_history_id = user_level_history.id

そして、ユーザーの履歴を取得するために、user_level_history からすべての行を user_id で選択し、時系列順に並べることができます。

これはこれを行う標準的な方法ですか?私がこの問題に遭遇した最初の人だとは想像できません。

もう 1 点: 私は 5000 人未満のユーザーを想定しています。さらに多くのユーザーがいる場合、別のソリューションが必要になるでしょうか?

前もって感謝します。

4

2 に答える 2

3

次のように設計できると思います: value(1,2,3,4,5) 、 description など
のレベル情報用のテーブルを用意してください ... user_id、level_id、level_start_date を含むuser_level_history
の関連付けテーブルを用意してください ...
ロール user-active-level を持つ level テーブルから user テーブルへの外部キー

ユーザーレベルが変化したときに履歴テーブルへの挿入が発生するメカニズムを開発する必要があります。 ここに画像の説明を入力

于 2013-11-09T05:34:42.127 に答える
3

いいえ、あなたが初めてではありません。時系列データのクエリは、特にデータ ウェアハウス/データ マイニングでは一般的な要件です。

リレーショナル データ モデルには、"時間データ" の格納またはクエリに対するネイティブの組み込みサポートがありません。

多くの作業が行われました。私はCJDateらの本を持っています。「時間データとリレーショナル モデル」というトピックを適切にカバーしています。また、いくつかのホワイト ペーパーも見つけました。


「履歴」を格納するための典型的で合理的に単純化されたアプローチの 1 つは、「現在の」テーブル (既にあるものと同様) を用意し、次に「履歴」テーブルを追加することです。行が変更 (挿入、更新、削除) されるたびに「現在の」テーブルの場合、行が変更された日付とともに「履歴」テーブルに行を追加します (変更前の行のコピー、または変更後の行のコピー、または両方。)

このアプローチでは、「現在の」テーブルに列を追加する必要はありません。

于 2013-11-09T05:35:40.713 に答える