1. ホーム
  2. sql

[解決済み] リビジョンのためのデータベース設計?

2022-07-20 15:12:29

質問

私たちは、プロジェクトで、データベース内のエンティティのすべてのリビジョン(変更履歴)を保存するための要件を持っています。現在、このために 2 つの設計案があります。

例:Employee" エンティティについて

設計1:

-- Holds Employee Entity
"Employees (EmployeeId, FirstName, LastName, DepartmentId, .., ..)"

-- Holds the Employee Revisions in Xml. The RevisionXML will contain
-- all data of that particular EmployeeId
"EmployeeHistories (EmployeeId, DateModified, RevisionXML)"

デザイン2。

-- Holds Employee Entity
"Employees (EmployeeId, FirstName, LastName, DepartmentId, .., ..)"

-- In this approach we have basically duplicated all the fields on Employees 
-- in the EmployeeHistories and storing the revision data.
"EmployeeHistories (EmployeeId, RevisionId, DateModified, FirstName, 
      LastName, DepartmentId, .., ..)"

他にこのような方法はないのでしょうか?

"デザイン1"の問題は、データにアクセスする必要があるときに、毎回XMLを解析しなければならないことです。これは処理を遅くし、また、リビジョン データ フィールドに結合を追加できないなど、いくつかの制限を追加することになります。

そして、quot;デザイン2" の問題は、すべてのエンティティで各フィールドを複製しなければならないことです(私たちは、リビジョンを維持したい約 70-80 のエンティティを持っています)。

どのように解決するのですか?

  1. 行う しない は、IsCurrent 判別属性ですべてを一つのテーブルに入れます。 これは単に問題を引き起こすだけで、サロゲートキーや他のすべての種類の問題を必要とします。
  2. 設計 2 では、スキーマの変更に問題があります。 Employees テーブルを変更する場合、EmployeeHistories テーブルとそれに付随するすべての関連するスプローックを変更する必要があります。 スキーマ変更の労力が 2 倍になる可能性があります。
  3. 設計 1 はうまく機能し、適切に実行されれば、パフォーマンス ヒットの点ではそれほどコストはかかりません。 xml スキーマとインデックスを使用することで、起こりうるパフォーマンスの問題を克服することができます。 xml のパースに関するコメントは妥当ですが、xquery を使用してビューを簡単に作成できます。 次のようなものです...
CREATE VIEW EmployeeHistory
AS
, FirstName, , DepartmentId

SELECT EmployeeId, RevisionXML.value('(/employee/FirstName)[1]', 'varchar(50)') AS FirstName,

  RevisionXML.value('(/employee/LastName)[1]', 'varchar(100)') AS LastName,

  RevisionXML.value('(/employee/DepartmentId)[1]', 'integer') AS DepartmentId,

FROM EmployeeHistories