エンティティのすべてのバージョンを簡単にインデックス付けされた方法で保存する必要があり、使用するシステムについて誰かが入力したかどうか疑問に思っていました。
バージョン管理を行わない場合、システムは、たとえば1人あたりの行を持つ単なるリレーショナルデータベースになります。人の状態が変化すると、その行はこれを反映するように変更されます。バージョン管理では、常に前のバージョンに戻ることができるように、エントリを更新する必要があります。時制データベースを使用できれば、これは無料で、「ダブリンに住んでいて30歳の昨日の午後2時の時点でのすべての人々の状態はどうなっているのか」を尋ねることができます。残念ながら、一時的に実行できる成熟したオープンソースプロジェクトはないようです。
これを行うための本当に厄介な方法は、状態の変化ごとに新しい行を挿入することです。人は多くのフィールドを持つことができますが、更新ごとに1つしか変更されないため、これは重複につながります。また、タイムスタンプが与えられたすべての人に正しいバージョンを選択するのは非常に時間がかかります。
理論的には、リレーショナルデータベースとバージョン管理システムを使用して時制データベースを模倣することは可能であるはずですが、これはかなり恐ろしいことのように聞こえます。
それで、誰かが以前に似たようなものに出くわしたことがあり、彼らがそれにどのようにアプローチしたのか疑問に思いましたか?
更新 Aaronによって提案されたように、これが現在使用しているクエリです(mysqlで)。20万行を超えるテーブルでは、間違いなく低速です。(id =テーブルキー、person_id = 1人あたりのID、その人に多くのリビジョンがある場合は複製)
p.id =の人pから名前を選択します(person_id = p.person_idおよびtimestamp<=:timestampの人からmax(id)を選択します)
更新 これを行うための最良の方法は時制データベースを使用することのように見えますが、オープンソースのものがないことを考えると、次善の方法は更新ごとに新しい行を格納することです。唯一の問題は、変更されていない列の重複と遅いクエリです。