いくつかの異なるモジュールを持つSpringアプリケーションを開発しています。データベースにはたくさんのユーザーが追加されます。
自分で設定するユーザーの可用性を追跡できる機能を追加したいと思います。利用可能と利用不可の間の単純な切り替えになります。
私の目標は、すべてのユーザーの現在のステータスを確認して、履歴データを取得できるようにすることです。可用性の統計を作成するための履歴が必要です。たとえば、先週、1か月間のJohn Doeの可用性を確認します。
私のアイデアは、2つのテーブル、たとえばuser_status
とuser_status_history
を作成することです。ユーザーがステータスを変更すると、user_status
テーブルのエントリがuser_status_history
テーブルにコピーされ、ステータスとuser_status
のタイムスタンプが後で変更されます。
タイムスタンプに基づいて、ユーザーが利用可能/利用不可であった時間を計算できます。履歴データテーブルで十分か、それともtimestamp_end
やduration
などの列を追加する必要があるのかと思います。
その問題の最善の解決策は何ですか?データベースとアプリ自体に関して、最善のアプローチを求めています。
通常、完全な履歴追跡では、別のテーブルの現在のステータスは必要ありません。
代わりに、指定されたタイムスライスの開始と指定されたタイムスライスの終了を表す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クエリを使用して、特定の時間のジョーのステータスを確認できます。