PostreSQL でデータのバージョン管理を実装する方法
-
10-10-2019 - |
質問
PostgreSQL でデータのバージョン管理を実装するにはどうすればよいか、ご意見を共有できますか。(同様の質問をしました カサンドラ そして モンゴDB. 。どのデータベースがそれに適しているか考えがある場合は、共有してください)
単純なアドレス帳のレコードをバージョン管理する必要があるとします。簡単にするために、アドレス帳レコードはリレーションなしで 1 つのテーブルに保存されます。履歴は次のとおりであると予想されます。
- 使用頻度は低いでしょう
- すべてを一度に使用して「タイムマシン」形式で表示します
- 1 つのレコードに数百以上のバージョンが存在することはありません。
- 履歴は期限切れになりません。
次のようなアプローチを検討しています。
アドレス帳テーブルのスキーマのコピーを使用してレコードの履歴を保存する新しいオブジェクト テーブルを作成し、アドレス帳テーブルにタイムスタンプと外部キーを追加します。
アドレス帳レコードへの変更を保存するための、スキーマのないテーブルのようなものを作成します。このようなテーブルは次のもので構成されます。AddressBookId、タイムスタンプ、フィールド名、値。この方法では、レコードへの変更のみを保存するため、履歴テーブルとアドレス帳テーブルの同期を維持する必要がなくなります。
シリアル化された (JSON) アドレス帳レコードまたはアドレス帳レコードへの変更を保存するテーブルを作成します。このようなテーブルは次のようになります。AddressBookId、TimeStamp、オブジェクト (varchar)。繰り返しになりますが、これはスキーマが少ないため、履歴テーブルとアドレス帳テーブルの同期を保つ必要がありません。(これは、CouchDB を使用したシンプルなドキュメントのバージョン管理をモデルにしています。)
解決
私はあなたの2番目のアプローチのようなことをします:実際の作業セットと変更のある履歴を備えたテーブルを持っています(Timestamp、Record_id、Property_id、Property_Value)。これには、レコードの作成が含まれます。 3番目の表は、プロパティ(ID、Property_Name、Property_Type)について説明しています。これは、アプリケーションのデータ変換に役立ちます。そのため、単一のプロパティの変更を非常に簡単に追跡することもできます。
タイムスタンプの代わりに、intlikeを使用することもできます。レコードごとの変更ごとに増分することもできます。 バージョン.
他のヒント
あなたは持っているかもしれません start_date
と end_date
.
いつ end_date
nullです、それは実際の記録です。
私は用語集データをバージョン管理していますが、私のアプローチは私のニーズに対して非常にうまくいきました。基本的に、バージョン管理が必要なレコードの場合、フィールドセットを永続フィールドとバージョン依存フィールドに分割し、2 つのテーブルを作成します。最初のセットの一部は、最初のテーブルの一意のキーでもある必要があります。
住所
ID [パック]
フルネーム [イギリス]
誕生日[イギリス]
バージョン
ID [パック]
address_id [英国]
タイムスタンプ [英国]
住所
この方法で、フルネームと誕生日によって決定される住所の件名 (バージョン管理によって変更されるべきではありません) と、住所を含むバージョン管理されたレコードを取得します。address_id は、外部キーを介して Address:id に関連付けられる必要があります。バージョン テーブルの各エントリにより、特定のタイムスタンプを持つサブジェクト Address:id=address_id の新しいバージョンが取得され、これにより履歴参照が可能になります。