[解決済み] リビジョンのためのデータベース設計?
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 のエンティティを持っています)。
どのように解決するのですか?
- 行う しない は、IsCurrent 判別属性ですべてを一つのテーブルに入れます。 これは単に問題を引き起こすだけで、サロゲートキーや他のすべての種類の問題を必要とします。
- 設計 2 では、スキーマの変更に問題があります。 Employees テーブルを変更する場合、EmployeeHistories テーブルとそれに付随するすべての関連するスプローックを変更する必要があります。 スキーマ変更の労力が 2 倍になる可能性があります。
- 設計 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
関連
-
解決策:ユーザー root で localhost:3306 にある MySQL に接続できませんでした。
-
[解決済み] ストアドプロシージャ 'dbo.aspnet_CheckSchemaVersion' が見つかりませんでした。
-
[解決済み] ATTACHで開いたSQLiteデータベースファイルのテーブルを一覧表示するにはどうすればよいですか?
-
[解決済み] SQL Serverでシングルクォートをエスケープするにはどうすればよいですか?
-
[解決済み] Oracleの全テーブルのリストを取得しますか?
-
[解決済み] 最初の行への結合方法
-
[解決済み] SQL Serverでレコードを削除した後、IDシードをリセットする。
-
[解決済み] 各グループの上位1行を取得
-
[解決済み] SQL Server の CASE ステートメントで OR がサポートされていない。
-
[解決済み] SQLite - UPSERT *not* INSERT or REPLACE
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] SQL Server の SYSNAME データ型とは何ですか?
-
解決策:ユーザー root で localhost:3306 にある MySQL に接続できませんでした。
-
[解決済み] ストアドプロシージャ 'dbo.aspnet_CheckSchemaVersion' が見つかりませんでした。
-
[解決済み] SQL Server FOR EACH ループ
-
[解決済み] LINQでInclude()は何をするのですか?
-
[解決済み] PostgreSQLのCREATE DATABASE IF NOT EXISTSをシミュレートしてみませんか?
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] SQL Serverでシングルクォートをエスケープするにはどうすればよいですか?
-
[解決済み] T-SQLでnot equalには!=と<>のどちらを使うべきですか?
-
[解決済み] 監査ログを取得するためのデータベース設計【終了