Web APIのユーザーのデータベースがありますが、各ユーザーの使用履歴(ページ要求数、データ量など)も保存したいと思います。データベース構造の観点から、これを実装するための最良の方法は何ですか。私の最初の考えは、メインテーブルを保持することでしたが、その後、ユーザーごとに履歴テーブルを作成しました。ただし、これはひどく非現実的です。私の直感では、使用履歴用に1つの個別のテーブルが必要になる可能性がありますが、それをどのように構成するかはわかりません。
私はSQLiteを使用しています。
Web APIのユーザーのデータベースがありますが、各ユーザーの使用履歴(ページ要求数、データ量など)も保存したいと思います。データベース構造の観点から、これを実装するための最良の方法は何ですか。私の最初の考えは、メインテーブルを保持することでしたが、その後、ユーザーごとに履歴テーブルを作成しました。ただし、これはひどく非現実的です。私の直感では、使用履歴用に1つの個別のテーブルが必要になる可能性がありますが、それをどのように構成するかはわかりません。
私はSQLiteを使用しています。
私のプログラムの1つでは、ユーザーごとのモジュール使用量のテーブルを維持しています。テーブルの構造は次のとおりです。
table id
user id
prog id
date/time
history flag (0=current, 1=history)
runs (number of time user has run program on date)
週に1回程度、テーブルのデータを集計します。ユーザー1が特定の日にプログラム1を2回実行した場合、最初はテーブルに2つのエントリがあります。
1;1;1;04/10/12 08:56;0;1
2;1;1;04/10/12 09:33;0;1
集計後、テーブルは次のようになります
3;1;1;04/10/12 00:00;1;2
集計によって時間部分が失われますが、他のデータが失われることはなく、テーブルに対するクエリが高速になります。
イベントロギングモデル(これはあなたが望むものです)の場合、2つのオプションをお勧めします
1つのテーブル、それを呼び出しましょうactivity_log
。
`activity_log`{
id INTEGER PRIMARY KEY,
user_id MEDIUM INT NOT NULL,
event_type VARCHAR(10),
event_time TIMESTAMP
}
ユーザーに影響を与えるシステム内のイベントごとに、このロールにレコードを挿入します(列名は一目瞭然だと思います)。SQLiteはネイティブTIMESTAMP
型を提供していないので、アプリケーションコードでストレージを処理する必要があると思います。この設計により、非常に大きくなる可能性のあるテーブルが残りますが、詳細な統計が得られます。SQLiteはクラスター化インデックスをサポートしていませんが、パフォーマンスの調整に役立ついくつかのオプションがここにあります。
上記と同じテーブルですが、イベントごとに新しい行を挿入する代わりに、条件付き挿入を実行します。つまり、すでに存在するユーザーの既存の行を更新し、新しいユーザーの更新を行います。このオプションを使用すると、テーブルは上記の数分の1になりますが、アクセスできるのはAPIの最新の使用法のみです。
あなたがそれを買う余裕があれば、私は1番で行くと思います。