0

新しいデータベースをモデル化しようとしています。要件の 1 つは、異なる行のバージョンを保持することです。同じオブジェクトの 2 つのバージョンのサンプルを次に示します。

ID | UID                                  | Name  | Date
--------------------------------------------------------------
 1 | 734FD814-024D-4795-AFD0-34FECF89A13A | Alpha | 2013-02-08
 2 | 734FD814-024D-4795-AFD0-34FECF89A13A | Bravo | 2013-02-09

このテーブルを参照として外部キーを作成するには、主キーを指定する必要があります。2 つの候補はIDUID1 つ目はauto increment数値、2 つ目はオブジェクトごとに手動で生成された一意の識別子です。

制限:

ID主キーとして選択する場合:

  • オブジェクトの新しいバージョンが作成されると、古いバージョンへのすべての参照が無効になり、更新する必要があります
  • 各挿入のすべての参照を手動で更新することはオプションではなく、非常に重い

UID主キーとして選択する場合:

  • UIDは一意ではないため、単独では使用できません。他のフィールドに関連付けて、複雑な主キー内で使用する必要があります
  • 使用される他のすべてのフィールドが変更される可能性があり、外部キー参照にブレーキがかかる可能性があります。

これらの制限を克服するための最良のアプローチ (可能な限り軽量) について何か提案はありますか?

PS : OrmLite を使用して、POCO オブジェクトを使用してデータベースをモデル化しています。

4

2 に答える 2

1

これは、金融アプリケーションでは非常に一般的なシナリオです。優れたアプローチは、1 つの行をアクティブとしてマークすることです。例えば:

ObjectID, StartDt, EndDt, ...other columns...

行が[StartDt, EndDt>「実際の」行であった時間間隔をマークします。次のように参加できます。

join    YourTable yt
on      yt.ObjectId  = otherTable.ObjectID
        and yt.StartDt is not null
        and yt.EndDt is null -- Select active row
于 2013-02-09T12:00:05.963 に答える
0

バージョンをバージョンに変更しないフィールド(IDの場合もあります)は、別のテーブルに配置できます。それはあなたがリンクするテーブルです。バージョン固有の情報は、別のテーブルにあります。最新バージョン情報への参加を支援するために、そのテーブルで最新の状態を維持するIsLatestフラグを設定できます。

于 2013-02-09T11:24:28.557 に答える