たまにデータに時系列の履歴を持って問い合わせの時に合わせてデータが変わってほしい時がある。
- 有効期限を持ったデータモデルが欲しい
- 変更履歴も欲しい
登録日と更新日を持たせたモデル
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しか私は知らない。
- 名前やら時間がくさいのはたぶん私が今疲れているから