sql >> データベース >  >> RDS >> Oracle

データベースの履歴行管理

    最初の質問は次のとおりです。そのデータをどうしますか?明確なビジネス要件がない場合は、それを行わないでください。

    私は似たようなことをしました。3年間実行した後、「有効なデータ」の約20%があり、残りは「以前のバージョン」です。そしてそれは1000万+4000万レコードです。過去3年間に、変更の履歴を調査するための2つのリクエストがありましたが、どちらのリクエストもばかげていました。レコード変更のタイムスタンプを記録し、残業していないかどうかを確認するように依頼されました(午後5時以降)。

    現在、誰も必要としないデータの80%を含む特大のデータベースで立ち往生しています。

    編集:

    あなたが可能な解決策を求めたので、私は私たちがしたことを説明します。検討しているソリューションとは少し異なります。

    1. すべてのテーブルには代理主キーがあります。
    2. すべての主キーは単一のシーケンスから生成されます。 Oracleは数値を生成してキャッシュできるため、これは正常に機能します。したがって、ここではパフォーマンスの問題は発生しません。 ORMを使用し、メモリ内の各オブジェクト(およびデータベース内の対応するレコード)に一意の識別子を持たせたいと考えました
    3. ORMを使用し、データベーステーブルとクラス間のマッピング情報は属性の形式です。

    すべての変更は、次の列を持つ単一のアーカイブテーブルに記録されます。

    • id(代理主キー)
    • タイムスタンプ
    • 元のテーブル
    • 元のレコードのID
    • ユーザーID
    • トランザクションタイプ(挿入、更新、削除)
    • varchar2フィールドとしてデータを記録する
      • これは、フィールド名と値のペアの形式の実際のデータです。

    物事はこのように機能します:

    • ORMには、コマンドの挿入/更新と削除があります。
    • 挿入/更新および削除コマンドをオーバーライドするすべてのビジネスオブジェクトに対して1つの基本クラスを作成しました
      • insert / update / deleteコマンドは、リフレクションを使用してフィールド名/値のペアの形式で文字列を作成します。コードはマッピング情報を探し、フィールド名、関連する値、およびフィールドタイプを読み取ります。次に、JSONに似たものを作成します(いくつかの変更を追加しました)。オブジェクトの現在の状態を表す文字列が作成されると、アーカイブテーブルに挿入されます。
    • 新しいオブジェクトまたは更新されたオブジェクトがデータベーステーブルに保存されると、そのオブジェクトはターゲットテーブルに保存されると同時に、現在の値を持つ1つのレコードがアーカイブテーブルに挿入されます。
    • オブジェクトが削除されると、ターゲットテーブルからオブジェクトが削除されると同時に、トランザクションタイプが「DELETE」である1つのレコードがアーカイブテーブルに挿入されます。

    プロ:

    • データベース内の各テーブルにアーカイブテーブルはありません。また、スキーマが変更されたときにアーカイブテーブルを更新することを心配する必要もありません。
    • 完全なアーカイブは「現在のデータ」から分離されているため、アーカイブによってデータベースのパフォーマンスが低下することはありません。別のディスク上の別のテーブルスペースに配置すると、正常に機能します。
    • アーカイブを表示するための2つのフォームを作成しました:
      • アーカイブテーブルのフィルターに従ってアーカイブテーブルを一覧表示できる一般的なビューアー。ユーザーがフォームに入力できるフィルターデータ(期間、ユーザーなど)。各レコードはフィールド名/値の形式で表示され、各変更は色分けされています。ユーザーは、各レコードのすべてのバージョンを確認でき、誰がいつ変更を加えたかを確認できます。
      • 請求書ビューア-これは複雑でしたが、元の請求書入力フォームと非常によく似た請求書を表示するフォームを作成しましたが、異なる世代を表示できるいくつかの追加ボタンがあります。このフォームを作成するのにかなりの労力を要しました。フォームは数回使用されましたが、現在のワークフローでは必要なかったため、忘れられました。
    • アーカイブレコードを作成するためのコードは、単一のC#クラスにあります。データベース内のすべてのテーブルにトリガーを設定する必要はありません。
    • パフォーマンスは非常に良好です。ピーク時には、システムは約700〜800人のユーザーによって使用されます。これはASP.Netアプリケーションです。 ASP.NetとOracleはどちらも、8GbRAMを搭載した1つのデュアルXEONで実行されています。

    短所:

    • 単一テーブルのアーカイブ形式は、データテーブルごとに1つのアーカイブテーブルがあるソリューションよりも読みにくいです。
    • アーカイブテーブルの非IDフィールドの検索は困難です-LIKEのみを使用できます 文字列の演算子。

    したがって、もう一度、アーカイブの要件を確認してください 。これは簡単な作業ではありませんが、利益と使用は最小限に抑えることができます。



    1. アラビア語をサポートするようにMysqlデータベースを作成するにはどうすればよいですか?

    2. UNIQUEINDEXとUNIQUEKEYの違いは何ですか?

    3. Oracle DBの複数のテーブルを更新する方法は?

    4. mysqlテーブルの親ツリー(whileループ)