以前、RDBでなく、正規化しないでKVSで入れるって、結局実データそのままってことだよね!ってところで、
このやり方の場合、ロングトランザクションを解決したときのように、時間+サーバー名とか時間+更新者の適当な組み合わせを使うと、競合が起こらないでデータ追記だけで最新データが取ってこれる(って、この仕組みを結局まだ説明していないね。いつか説明する)。
って書いた。このデータ追記だけで、最新データが取ってこれたり、ロングトランザクションにおける競合問題が解決する手法は、「大福帳システム」として知られている。この大福帳システムはNoSQL、非正規化して実現でき(XMLDBなどで実現する)、KVSとも相性いいと思うんだけど、今回は、その大福帳システムについて説明する。
■追記型データベースの「大福帳システム」
大福帳システムっていうのは、いつだったっけかなあ?10年くらい前?に、データウエアハウスの関係で一時はやった手法で、極端に言うと、以下のようにする。
・データを追記しかしない
・削除する場合は、削除フラグON!のデータを追記する(論理削除)
・修正する場合も、追記する
・データを取ってくるときは、最新のデータを取ってくるようにする。
たとえば、
10時20分 受注データNo1234作成 10時21分 受注データNo1234を修正 10時22分 受注データNo1235作成 10時25分 受注データNo1234削除 10時30分 受注データNo1235修正 |
とすると、受注データの主キー+時刻(ほか、サーバーとか担当者とかも必要かもしれないけど)で、一意にして、データを以下のように
主キー:10時20分-No1234の受注データ作成 主キー:10時21分-No1234の受注データ作成 →10時20分-No1234と修正箇所だけ違うデータ 主キー:10時22分-No1235の受注データ作成 主キー:10時21分-No1234の受注データ作成 →10時21分-No1234の受注データに削除フラグが上がっている 主キー:10時30分-No1235の受注データ作成 →10時22分-No1235と修正箇所だけ違うデータ |
ということになる。上記に示したように、受注データ「作成」しかしていない。
データを取ってくる場合は、
・受注番号ごとにまとめて、最新の値(時刻が最大のもの)が、削除フラグOFFだったら、とってくる
とする。上記の例だと、
主キー:10時21分-No1234の受注データ作成 →10時21分-No1234の受注データに削除フラグが上がっている 主キー:10時30分-No1235の受注データ作成 →10時22分-No1235と修正箇所だけ違うデータ |
が受注番号ごとにグループ化したときの最新データ、このうち1234は削除フラグが上がっているので、対象外となり、「10時30分-No1235の受注データ」が対象となる。これは、
※ちなみに、RDBで行う場合は、あらかじめ、(論理削除についてはさておき)最新データのViewを作っておいて、それに対して検索するようにしないと、たぶん、大変なことに(^^;)
■そして・・・画面、帳票全体を保存する
そして、大福帳といわれるゆえんでもあるのだが、
・データはすべて、丸ごと保存する。
画面丸ごと、帳票丸ごと保存する。
RDBのように、正規化したデータがほしい場合は、上記に書いた最新データから、
JOINして作ることができる。
つまり、「画面見たまま、帳票出力したまま」を保存する。
いままでのRDBは、これらをもとに、正規化したデータだから、
大福帳データの「一部」のデータ=RDBの正規化されたデータ
(RDBのデータは、大福帳データの部分集合)なので、
大福帳データから、RDBの正規化されたデータは、適当な集合操作によって、
得ることができる。
■現状
この方式だと、昔書いた、ロングトランザクション問題を解決することができるんだけど、その方法については、また今度書くとして、
現状、大福帳システムっていうのは、使われてるの?っていうと、
商品として、出されていて、たとえば、
XML大福帳による新世代ERPのメリット、データ活用・未来予測・使いやすさ
http://jp.fujitsu.com/about/journal/erp/solutions/200811/02.shtml
なんかが、書かれている。で、これを実装する方法として、富士通は
企業総活動記録ソフトウェア Interstage XML Business Activity Recorderを用意していて、
Interstage XML Business Activity Recorder 機能
http://interstage.fujitsu.com/jp/xmlbar/function/
に「追記型インターフェース」と書いてあるように、基本的に、追記型になっている。
たぶん、ライフログなんかも、そうだよね。
でも、富士通は、いま、それどころじゃないんだろうなあ・・・(^^;)