0

Web APIのユーザーのデータベースがありますが、各ユーザーの使用履歴(ページ要求数、データ量など)も保存したいと思います。データベース構造の観点から、これを実装するための最良の方法は何ですか。私の最初の考えは、メインテーブルを保持することでしたが、その後、ユーザーごとに履歴テーブルを作成しました。ただし、これはひどく非現実的です。私の直感では、使用履歴用に1つの個別のテーブルが必要になる可能性がありますが、それをどのように構成するかはわかりません。

私はSQLiteを使用しています。

4

2 に答える 2

1

私のプログラムの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

集計によって時間部分が失われますが、他のデータが失われることはなく、テーブルに対するクエリが高速になります。

于 2012-10-04T09:11:48.533 に答える
1

イベントロギングモデル(これはあなたが望むものです)の場合、2つのオプションをお勧めします

  1. 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はクラスター化インデックスをサポートしていませんが、パフォーマンスの調整に役立ついくつかのオプションがここにあります。

  2. 上記と同じテーブルですが、イベントごとに新しい行を挿入する代わりに、条件付き挿入を実行します。つまり、すでに存在するユーザーの既存の行を更新し、新しいユーザーの更新を行います。このオプションを使用すると、テーブルは上記の数分の1になりますが、アクセスできるのはAPIの最新の使用法のみです。

あなたがそれを買う余裕があれば、私は1番で行くと思います。

于 2012-10-04T10:02:51.207 に答える