0

私はデータベースの設計に不慣れで、データベースを設計しようとしているときに問題に直面しました。これが私のシステムです。3 つの異なるソフトウェア (SW_A、SW_B、SW_C) と 500 ~ 600 人のユーザーがいます。各ユーザーは、任意のソフトウェアを使用して、何らかの作業を行うことができます。各作品はデータベースに約送信されます。1分間に6回。(ユーザーとソフトウェアに対してランダムに) データベースに、ソフトウェアに関連するすべてのユーザー アクションをアーカイブ用に保持し、これらのソフトウェアに関連するすべてのユーザーのインスタント アクションを追跡したいと考えています。(ソフトウェアごとに異なるユーザーの最新のアクションのみ)

だから私はsthを設計しました。そのように:

表: SW_X_DATA_ARCHIVE

列 :

  • ユーザーID
  • データ_日付
  • SW_A_ActionID

表: SW_X_INSTANT_DATA

列:

  • ユーザーID
  • データ_日付
  • SW_X_ActionID

新しいデータが来ると、その UserID が存在する場合は INSTANT_DATA テーブルの関連行を更新し、存在しない場合は UserID とデータを含む新しい行を挿入します。次に、同じデータを DATA_ARCHIVE テーブルに挿入します。

問題は次のとおりです。この種の作業のためのより良い方法はありますか? おそらくビュー? (具体化されたビューについて読んだことがありますが、ここでの使用方法がわかりません。) ありがとう

4

1 に答える 1

0

Only the latest action for distinct users for each software

INSTANT テーブルには、(USERID,SOFTWAREID) に固有の複合キーが必要です。これにより、ユーザーによるソフトウェアの使用に関連する複数の行を保持することができなくなります。

ARCHIVE テーブルには、そのような一意のキーや制約は必要ありません。

insert(USERID, SOFTWARE) の行が存在しない場合は INSTANT に入り、既にupdate存在する場合はその行になります。

通常、INSTANT テーブルに挿入/更新トリガーを配置して、INSTANT に変更が発生するたびに ARCHIVE に行を挿入します。

EDIT:代わりに、単一のテーブルを維持し、ソフトウェアごとにユーザーごとに最新のアクションのみを選択したビューを持つことができます。すべてのアクションにタイムスタンプを付け、複合インデックス (一意ではない) を (USERID,SOFTWAREID) に配置する必要があります。どのアプローチを採用するかは、相対的なパフォーマンスに基づいて決定される場合があります。最新のアクション情報が頻繁に必要な場合は、トリガーを好む傾向があります。

于 2013-02-21T11:21:21.413 に答える