1

一意の数値オブジェクト識別子への変更を追跡するためのシステムを実装する必要があります。システムが動作する環境は非常に制限されているため、問題に対処する便利なエンタープライズ クラスの RDBMS メソッドはすべて検討の対象外です。つまり、組み込みの変更追跡を有効にしたり、組み込みの監査を有効にしたり、出力をログ ファイルに書き込んだり、テーブルなどでトリガーを使用したりすることは、ソリューションの一部ではありません。変更は、アプリケーション レベルで書き込まれ、管理される「挿入のみ」のトランザクション テーブルに格納する必要があります。

変更を追跡する必要があるオブジェクトは、次の 2 つの方法で動作します。

  • 1 つのオブジェクトを 2 つの新しいオブジェクトに分割できます
  • 2 つのオブジェクトを結合して 1 つのオブジェクトにすることができます

特定のオブジェクトのコレクションの場合、オブジェクト ID は一意の長整数です。オブジェクトが分割 (分割) されると、対象オブジェクトに割り当てられた ID は廃止され、2 つの新しい ID に置き換えられます。したがって、オブジェクト 27 が分割されると、オブジェクト 57 および 58 に置き換えられます。57 および 58 は、その特定のシーケンスから取得できる次の番号です。

同様に、2 つのオブジェクトが 1 つにマージされると、サブジェクト オブジェクト ID は廃止され、シーケンス内で次に使用可能な番号に置き換えられます。したがって、オブジェクト 85 とオブジェクト 227 がマージされると、オブジェクト 357 に置き換えられます。オブジェクト 357 は、シーケンス内で次に使用可能な未使用の番号です。マージ操作では、2 つの親のうちの 1 つだけに関連付けられた属性を保持できるため、ユーザーはマージ時にどちらを保持するかを選択します。この場合は 85 または 227 です。この選択は、後で使用するために保存する必要があります。使用する。

トランザクション テーブルには、オブジェクトの分割とマージの完全な履歴を格納する必要があります。オブジェクトが対象となる分割と結合の数に制限はありません。

可能であれば、トランザクションを単一のテーブルに効率的に格納するために使用できる SQL データ構造に関する提案を探しています。

トランザクション テーブル構造が定義されたら、分割またはマージ トランザクションに関与した特定の ID の完全な ID 系列を取得できるように、SQL でクエリを実行できるようにする必要があります。この場合、物事はそれほど制限的ではないので、必要に応じてトランザクション データに 1 つ以上のビューを設定したり、必要に応じて新しいテーブルなどを作成したりできます。再帰的 SQL を使用して、ID リネージのクエリと表示を行うことができます。

トランザクションの記録が定義されたら、次の要件は、変更された ID を 1 つ以上の関連テーブルに非同期的に伝達することです。

分割の例

親テーブル ID 27 は ID 57 と ID 58 に分割されます。関連するテーブルでは、ID 27 のレコードが削除され、それぞれ ID 57 と 58 を持つ 2 つの (ID 27 と同じ) 新しいレコードに置き換えられます。

マージの例

親テーブル ID 327 と ID 959 は ID 1023 にマージされます。関連テーブルでは、ID 327 と ID 959 を持つレコードが削除され、1023 とマークされた新しいレコードに置き換えられます。新しいレコードで定義される属性値は、元のマージ トランザクションと共に格納された選択肢。

あなたの提案は非常に高く評価されています。前もって感謝します。

4

1 に答える 1

0

最も簡単な方法をお勧めします:

part1_id part2_id composed_id is_split

ここで、is_splitは分割の場合は true、マージの場合は false です。マージの場合、属性はpart1_id保持されます (これにより曖昧さがなくなります)。スプリットの場合は、part1_id < part2_idホールドする必要があります。

これは、データを簡単かつ効率的に格納するには十分なはずですが、任意の長いチェーンをたどってid3 つのフィールドすべてを調べる必要があるため、取得は少し複雑です。

idしかし、任意の長いチェーンに参加できるため、それに対してできることはほとんどありません。たぶん、次のようなテーブル

in1_id in2_id out1_id out2_id

検索には少し良いかもしれません。マージの場合、両方inの が使用され、1 つだけが使用されoutます (おわかりですか?)。この表現の冗長性と戦うために必要なすべての制約を追加するだけです。

于 2014-06-17T22:52:40.720 に答える