2012-03-06 17 views
1

こんにちはすべて私はデータベース設計に苦労しています。私の現在のデザインからわかるように、登録は、複数のClientRegistrationsを持つことができる複数のEmployerRegistrationsを持つことができます。ここからはかなり簡単です。新しい登録は毎年ユーザーによって作成される必要があります。変更を追跡するデータベース設計 - 休止状態で

残念ながら、私は変更や修正を追跡できる必要があります。登録情報(名前、住所など)またはクライアント登録情報(クライアントの削除/追加、または雇用者の削除/追加)を変更することができます。

私は束のデザインを試しましたが、今のところ「正しい」と感じることはありません。登録テーブル内のすべてのテーブルに影響を与えるので、登録テーブル内の修正を追跡するのは簡単です。すべてのIDが更新されます。これは、ClientRegistrationテーブルを変更してループを起こすことです。あなたが見ることができるように、私は試みていたバージョンの列を持っていますが、それは私をあまり助けていません。 Hibernateでは、修正された各クライアント登録には独自の登録オブジェクトが必要だと感じていますが、クライアント登録修正のために全く新しい登録を作成することは、正しく/効率的ではないようです。

私は約1週間これを戦ってきたので、どんな助けでも大歓迎です。ありがとう!あなたは今、休止状態、コアにバンドルされてEnversを、使用することができます

enter image description here

答えて

2

Hibernate Enversをチェックしましたか? Hibernate用の自動バージョニングプラグインです。オブジェクトの変更の追跡履歴を非常に簡単にします。

@Entity 
@Audited 
public class Person { 
    @Id 
    @GeneratedValue 
    private int id; 

    private String name; 

    private String surname; 

    @ManyToOne 
    private Address address; 
    ... 
} 
+0

私はそれが気になるクリスマスの時間のように感じる私はとても幸せです。 Hibernateは私の心を吹き飛ばし続けます。 –

+0

ええ、私はこのライブラリに出会ったときと同じように感じました。 –

0

あなたは一時的なデータモデリングの概念を越えてきた:あなたは単にあなたが監査されたいオブジェクトに注釈を付けるとEnversは詳細を処理させることができますので、それは、AOPのように構成されていますか?あなたはそれをGoogleにしたいかもしれません。時間的モデリングのための非常に一般的な手法の1つは、Peoplesoftで広く使用されている「有効期限付き」ロジックです。簡単に言えば、それはこのように書きます:レコードの

Table{ 
     Primary_key, 
     effdt, 
     effseq, 
     other data, 
     modified_ts 
    }; 

複数のバージョンがプライマリキー、EFFDTとeffseqを使用して「積み上げ」されています。システムの

すべてのテーブルには、このデザインパターンを持っているでしょう。 Effdtは日付のみを格納し、datetimeは格納しません。 effseq(int)は、同じ日に複数の変更を格納するために使用されます。 modified_tsは、データ変更の日付スタンプを格納します。表中の

データは次のようになります。

select * from MyTable A 
where effdt = (select max(effdt) from MyTable where PrimaryKey = A.PrimaryKey) 
and effseq = (select max(effseq) from MyTable where PrimaryKey = A.PrimaryKey 
                  and Effdt=A.EFfdt) 

そのヘルプはウィル:

PrimaryKey1 2012-01-01 1 MyData1 MyData2 
PrimaryKey1 2012-02-01 1 MyData1 Change1 
PrimaryKey1 2012-02-01 2 Change2 Change1 

は、あなたがこのようなクエリを使用する任意のテーブルから最新のデータを取得するには?