LoginSignup
7
3

More than 5 years have passed since last update.

履歴をもったデータモデルの考え方

Last updated at Posted at 2018-08-10

たまにデータに時系列の履歴を持って問い合わせの時に合わせてデータが変わってほしい時がある。

  • 有効期限を持ったデータモデルが欲しい
  • 変更履歴も欲しい

登録日と更新日を持たせたモデル

id 名前 登録日 更新日
00001 田所 2018-08-10T00:00:00 2018-08-10T00:00:00
  • 名前を鈴木に変更
id 名前 登録日 更新日
00001 鈴木 2018-08-10T00:00:00 2018-08-10T09:31:00

いつ変更されたかはわかるが有効期限を持てない

  • 削除は物理削除 or isDeletedを持たせて論理削除するしかない

有効期限を持たせたモデル

id 名前 START END
00001 田所 2018-08-10T00:00:00 9999-12-31T23:59:59
  • 09:31で名前が変わるようにする
id 名前 START END
00001 田所 2018-08-10T00:00:00 2018-08-10T09:31:00
00002 鈴木 2018-08-10T09:31:00 9999-12-31T23:59:59
  • 実は09:31で変わる名前は西寺が正しかった
id 名前 START END
00001 田所 2018-08-10T00:00:00 2018-08-10T09:31:00
00002 西寺 2018-08-10T09:31:00 9999-12-31T23:59:59
  • Where start < 任意の日付 <= ENDで検索すれば有効期限のデータがとれる
  • 削除はENDに削除日付を入れればいい

しかしこれでもいつデータが変更されたのかはわからない

BiTemporalデータモデル

  • 前日に(8/9)8/10から有効なデータを登録する
id 名前 validStart validEnd systemStart systemEnd
00001 田所 2018-08-10T00:00:00 9999-12-31T23:59:59 2018-08-09T00:36:40 9999-12-31T23:59:59
  • 08/10 11:45:14に鈴木に変更する。なお同日09:31から有効にする
  • 最初のレコードを無効にし、新しく2つのレコードを登録する
id 名前 validStart validEnd systemStart systemEnd
00001 田所 2018-08-10T00:00:00 9999-12-31T23:59:59 2018-08-09T00:36:40 2018-08-10T11:51:40
00002 田所 2018-08-10T00:00:00 2018-08-10T09:31:00 2018-08-10T11:45:14 9999-12-31T23:59:59
00003 鈴木 2018-08-10T09:31:00 9999-12-31T23:59:59 2018-08-10T11:45:14 9999-12-31T23:59:59
  • 実は09:31で変わる名前は西寺が正しかったので同日19:19に修正した
  • id=00003のデータを無効化し、正しい名前のデータ登録する
id 名前 validStart validEnd systemStart systemEnd
00001 田所 2018-08-10T00:00:00 9999-12-31T23:59:59 2018-08-09T00:36:40 2018-08-10T11:45:14
00002 田所 2018-08-10T00:00:00 2018-08-10T09:31:00 2018-08-10T11:45:14 9999-12-31T23:59:59
00003 鈴木 2018-08-10T09:31:00 9999-12-31T23:59:59 2018-08-10T11:45:14 2018-08-10T19:19:00
00004 西寺 2018-08-10T09:31:00 9999-12-31T23:59:59 2018-08-10T19:19:00 9999-12-31T23:59:59
  • validStart < 任意の日付 <= validEnd & systemStart < 現在日付 <= systemEndで検索すれば有効なデータがとれる
  • valid~は有効にしたい期間、system~データとして有効だった期間となる(検索に引っかかる可能性のある期間)

これで変更履歴も事実としての履歴ももったテーブルができる

  • このデータモデルを標準でサポートしているDBはDB2とMarkLogicしか私は知らない。
  • 名前やら時間がくさいのはたぶん私が今疲れているから
7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3