4

私たちのソフトウェア (.NET 3.5 / SQL Server 2008)の「オブジェクト バージョニング」機能を作成するプロジェクトを開始しています。基本的にこれを行う必要があります。

  • ユーザーは顧客を見ています:
    • 姓は「スミス・ジョンソン
    • 2 つのアドレス(別のテーブルに保存)
    • 1 個の製品を購入しました
    • 1 従業員の連絡先(別のテーブルに保存)
    • 200通(別テーブルに保存)
  • ユーザーが[過去の状態を表示] ボタンをクリックし、[ 2009 年 9 月 25 日 15:00 ] を選択すると、同じ顧客を示す別のビューが表示されます。
    • 姓は「スミス」です(名前はその後変更されました)
    • 1アドレス(アドレスが追加されたため)
    • 1個購入(但し、こちらを購入後、返品して新しいものを購入したため、上記とは異なります)
    • 従業員の連絡先 2 件(1 件はその後削除されたため)
    • 10通

この問題について一般的に考えると、いくつかの問題が浮かび上がります。

  • どのレベルで変更をログに記録する必要があるか。たとえば、データベース レベル(すべてのテーブルのすべてのプロパティのすべての変更をログに記録する) またはオブジェクト レベル(変更後にすべてのオブジェクトとその依存関係をシリアル化して保存する)。
  • テーブルの構造の変更は どのように処理されますか。たとえば、列「LastName」が「Surname」に変更された場合、列内のデータをすべて同じ列に属するものとして追跡する方法 (したがって、バージョン管理サービスは「これを報告しません」顧客は 9 月 25 日に姓を持っていませんでした」が、代わりに姓を見ることを知っています。
  • .NET / SQL Server 2008 領域で、これをサポートする可能性のあるサポート テクノロジが存在します。たとえば、SQL Server 2008 の変更追跡機能を調べています。
  • バージョン管理にどのようなパターンが存在するか。たとえば、アプリケーションで元に戻す機能を作成するために使用できるコマンド パターンについて考えています。
  • このバージョン サービスでは、ロールバックを実行する必要はありません。オブジェクトの依存関係の状態を表示できる必要があるだけです。

バージョニング機能をソフトウェアに実装した経験は何ですか? どんなアドバイスがありますか?

4

3 に答える 3

2

これと同様の機能を持つソフトウェアに取り組んできました。

データベースでデータが更新される代わりに、すべての変更が新しいレコードとして挿入されました。データベースの各行には、開始日と終了日があります。

最新のレコードは、終了日のないものです。そこから、その時点でアクティブだったレコードを検索するだけで、任意の日付のデータの状態を照会できます。

明らかな欠点はストレージであり、データ層の特定の側面を抽象化して、履歴追跡を呼び出し元に透過的にする必要があるという事実です.

于 2009-11-06T14:12:50.047 に答える
2

Martin Fowler は、次のバージョンの Patterns of Enterprise Application Architecture を開発しているため、いくつかの興味深いパターンを文書化しました。

于 2009-11-06T14:15:15.357 に答える
1

数年前、異なる環境 (開発、ステージング、QA、本番) のデータベース間でオブジェクトをコピーできるように、オブジェクトをバージョン管理するシステムを設計しました。

当時は手巻きの AOP アプローチを使用していました。AOP をサポートする Spring.NET やその他の IoC フレームワークは、現在の方が優れているでしょう。オブジェクトのプロパティに対する各変更は、中央データベースに変更として保存されました。各変更にはバージョン番号がありました。変更を使用して、1 つのデータベース内のオブジェクトに対して実行されたアクションを記録し、それらをターゲットで再生して、変更を効果的にコピーしました。

ORM を使用している場合、この種のソリューションを使用すれば、プロパティ名を気にせずにデータベースの列名を変更できるはずです。プロパティ名を変更した場合は、変更レコードを新しい名前で更新できます。

多くのアプローチの中の 1 つですが、私たちにとってはうまくいきました。

于 2009-11-06T14:10:01.440 に答える