あなたが言及した問題に直面した場合、私は次のようにLOGテーブルを設計します:
-
EntityName
:(文字列)操作されているエンティティ。(必須) -
ObjectId
:操作されているエンティティ、主キー。 -
FieldName
:(文字列)エンティティフィールド名。 -
OldValue
:(文字列)エンティティフィールドの古い値。 -
NewValue
:(文字列)エンティティフィールドの新しい値。 -
UserCode
:アプリケーションユーザーの一意の識別子。 (必須) -
TransactionCode
:エンティティを変更する操作には、一意のトランザクションコード(GUIDなど)が必要です(必須)。
複数のフィールドを変更するエンティティの更新の場合、これらの列は、更新(トランザクション) -
ChangeDate
:取引日。 (必須) -
FieldType
:TEXTやDoubleなどのフィールドタイプを示す列挙またはテキスト。 (必須)
このアプローチを使用すると、
任意のエンティティ(テーブル)を追跡できます
レポートは読み取り可能になります
変更のみがログに記録されます。
トランザクションコードは、単一の変更を検出するための重要なポイントになりますアクション。
BTW
Store the changes in the entitychange table and then store the value
according to its datatype in entitychange_[bool|timestamp|double|string]
必要ありません。単一のテーブルに変更とデータ型があります
Use partitioning by HASH(entity_id)
ChangeDateによるパーティション分割、またはメインのLOGテーブルからバックアップおよび削除するのに十分古いchangeDateのバックアップテーブルを作成することをお勧めします
Should I use another database system, maybe MongoDB?
すべてのデータベースには独自の長所と短所があり、任意のRDBMSで設計を使用できます。MongoDBここで見つけることができます
お役に立てば幸いです。