1

多くのエンタープライズ アプリには、オブジェクトのバックエンド ストレージとしてリレーショナル データベースがあります。一部のオブジェクトは不変であり、一部は不変です。

不変オブジェクトが可変に依存する場合、適切なバージョンを提供する必要があります。

参照: OrderオブジェクトとCustomerオブジェクトがあります。ご注文はお客様次第です。しかし、秩序は決して変わりません。注文が完了して発送された後、顧客は住所を変更します。配送に使用された住所を知るにはどうすればよいですか? データベースが非正規化されるため、すべての情報を順番に保存したくありません。

答えはバージョン管理です。注文は特定のバージョンの顧客に依存する必要があります。

これは、共有ライブラリ (GAC、SxS、さまざまな .so バージョンなど) に使用されるアイデアです。

しかし、データベースでそれを行う方法は? 「バージョン」フィールドをすべてのテーブルとリレーション フィールドに追加しますか? それは私のデータベース X2 を増やし、もつれさせます。

この情報を分離してどこかに保存しますか?

私は素晴らしい解決策がなければならないと信じています。何でも知ってますか?

4

2 に答える 2

1

問題を理解しているのかよくわかりません。たとえば、顧客と注文を例にとると、

CREATE TABLE address (
  address_id NUMBER PRIMARY KEY,
  street     VARCHAR2(100),
  ...
);

CREATE TABLE customer (
  customer_id NUMBER PRIMARY KEY,
  first_name  VARCHAR2(100),
  ...
  address_id  NUMBER REFERENCES address( address_id )
);

CREATE TABLE orders (
  order_id   NUMBER PRIMARY KEY,
  ...
  customer_id NUMBER REFERENCES customer( customer_id ),
  address_id  NUMBER REFERENCES address( address_id )
);

ADDRESSがファーストクラスのテーブルの場合、とは両方とも特定ORDERSCUSTOMERアドレスを参照できます。 CUSTOMER顧客の現在の住所ORDERSを参照できます。注文がチップされた住所を参照できます。これは、顧客の当時の現在の住所であるか、注文した人の住所である可能性があります(つまり、私は花を注文します。母の日に母の家に送りました)。 ADDRESSその後、不変になるため、行を更新するのではなく、ADDRESS単にINSERTnewADDRESS_IDを使用して、テーブル内の行を更新しCUSTOMERてnewを指すようにしADDRESSます。

顧客の住所の履歴を追跡する場合は、テーブルから、ある種のバージョン関連情報を含む新しいマッピングテーブルに移動するaddress_idだけですcustomercustomer_address通常、マッピングが有効であった日付の範囲を指定すると、次のようになります。

CREATE TABLE customer_address (
  customer_address_id NUMBER PRIMARY KEY,
  customer_id         NUMBER REFERENCES customer( customer_id ),
  address_id          NUMBER REFERENCES address( address_id ),
  valid_from          DATE,
  valid_to            DATE
);
于 2012-06-05T17:41:59.820 に答える
1

既にお気づきのように、不変データが可変データを参照することは決して許可されるべきではありません。答えは、参照されるデータを不変にすることです。バージョンの使用はその一例にすぎませんが、他の方法もあります。

Order-Customer の例では、注文は顧客全体に依存していません。顧客のパスワードを変更したり、新しい注文を作成したりしても、元の注文にはまったく影響しません。したがって、顧客から依存部分を取り除き、それらを不変にすることができます。これは、 Address が不変であることを意味しますが、顧客は引き続き変更可能であるため、顧客の参照を現在の住所または複数の住所に変更することができます。

これは、リレーショナル データベースを使用していくつかの方法で実装できます。2つの明白なもの:

  • Address テーブルを挿入のみ (更新または削除なし) にすることができます。これは最も簡単な方法ですが、ORM の邪魔になる可能性があり、Order に関連付けられていない場合でも、すべての Address がデータベースに保持されます。

  • Address テーブルを変更可能にします (更新と削除を許可します)。次に、新しい注文が作成されるたびに顧客の現在の住所のコピーを作成し、注文は新しいコピーを参照します。これは ORM に最も適したソリューションですが、Address が変更されない場合でも、すべての Order は独自の Address のコピーを取得します。

于 2012-06-05T17:48:08.453 に答える