web-dev-qa-db-ja.com

ユーザーのステータスを処理し、その履歴を保持するための最良のアプローチ

いくつかの異なるモジュールを持つSpringアプリケーションを開発しています。データベースにはたくさんのユーザーが追加されます。

自分で設定するユーザーの可用性を追跡できる機能を追加したいと思います。利用可能と利用不可の間の単純な切り替えになります。

  • 各ユーザーは、DBに現在のステータスを設定する必要があります
  • ステータス変更の履歴は、各ユーザーが利用できる必要があります

私の目標は、すべてのユーザーの現在のステータスを確認して、履歴データを取得できるようにすることです。可用性の統計を作成するための履歴が必要です。たとえば、先週、1か月間のJohn Doeの可用性を確認します。

私のアイデアは、2つのテーブル、たとえばuser_statususer_status_historyを作成することです。ユーザーがステータスを変更すると、user_statusテーブルのエントリがuser_status_historyテーブルにコピーされ、ステータスとuser_statusのタイムスタンプが後で変更されます。

タイムスタンプに基づいて、ユーザーが利用可能/利用不可であった時間を計算できます。履歴データテーブルで十分か、それともtimestamp_enddurationなどの列を追加する必要があるのか​​と思います。

enter image description here

その問題の最善の解決策は何ですか?データベースとアプリ自体に関して、最善のアプローチを求めています。

1
Kamil

通常、完全な履歴追跡では、別のテーブルの現在のステータスは必要ありません。

代わりに、指定されたタイムスライスの開始と指定されたタイムスライスの終了を表す2つのタイムスタンプをテーブルに追加します。更新の場合は、終了タイムスタンプを設定し、新しい行を挿入します。

このようなもの:

userid | status    | validFrom           | validBefore
-------+-----------+---------------------+---------------------
joe    | available | 2020-01-01 01:12:12 | null

OK、ジョーがいます。 "validBefore"がnullであるため、彼はまだ利用可能です。

現在のステータスは常にwhere validBefore is null

1時間後にそれを変更します。

update status_table set validBefore = <now> where user = 'joe' and validBefore is null

insert into ...

userid | status    | validFrom           | validBefore
-------+-----------+---------------------+---------------------
joe    | available | 2020-01-01 01:12:12 | 2020-01-01 02:22:00
joe    | n/a       | 2020-01-01 02:22:00 | null

1月2日にオンラインに戻ります。

userid | status    | validFrom           | validBefore
-------+-----------+---------------------+---------------------
joe    | available | 2020-01-01 01:12:12 | 2020-01-01 02:22:00
joe    | n/a       | 2020-01-01 02:22:00 | 2020-01-02 12:20:21
joe    | available | 2020-01-02 12:20:21 | null

もう1つの方法は、nullを将来のタイムスタンプ(2999-12-31程度)に置き換えることです。これにより、常にBETWEENクエリを使用して、特定の時間のジョーのステータスを確認できます。

3
mtj