infoMore 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 |
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 |
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しか私は知らない。
- 名前やら時間がくさいのはたぶん私が今疲れているから
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme
What you can do with signing up