質問

私のアプリケーションには、User、Customer、Postなどのいくつかのエンティティクラスがあります

データベースを設計しようとしています。エンティティが作成および更新された日付を保存します。これはトリッキーになるところです。確かに1つのオプションは、各エンティティテーブルにcreated_timestampおよびupdate_timestamp列を追加することですが、それは冗長ではありませんか?

別の可能性としては、この情報を保存するログテーブルを作成し、任意のエンティティの更新の追跡を含めることができます。

考えはありますか?後者の実装に傾倒しています。

役に立ちましたか?

解決

すべてのテーブルの単一ログテーブルアプローチには、考えられる2つの主な問題があります。

  1. ログテーブルの設計は、(おそらく)他のすべてのテーブルの設計を制約します。ほとんどの場合、ログテーブルにはTableNameという名前の列が1つあり、次にPKValueという名前の別の列があります(ログに記録するレコードの主キー値が格納されます)。一部のテーブルに複合主キー(つまり、複数の列)がある場合、ログテーブルの設計でこれを考慮する必要があります(おそらく、PKValue1、PKValue2などの列を使用して)。
  2. これが何らかのWebアプリケーションである場合、トリガーから利用できるユーザーIDは、WebアプリユーザーのIDではなく、アプリケーションのアカウントになります(ほとんどの場合、本当に保存したいものです) CreatedByフィールドで)。これは、Webアプリのコードで作成されたレコードとそうでない場合に作成されたレコードを区別するのに役立ちます。

CreatedDate列とModifiedDate列は、各テーブルで定義されているという理由だけで冗長ではありません。私はそのアプローチに固執し、各テーブルに挿入トリガーと更新トリガーを配置して、それらの列にデータを取り込みます。変更を行ったエンドユーザーも記録する必要がある場合は、トリガーをスキップして、アプリケーションコードからタイムスタンプとユーザーフィールドを入力します。

他のヒント

「ログ」で後者を行います;または「イベント」表。私の経験では、「更新」多くの場合、最新の更新時間だけでなく、修正が必要になるため、タイムスタンプは非常に早くイライラします。

作成/更新されたタイムスタンプをプレゼンテーションレイヤーに含める必要がある頻度。答えが「一度だけ」である場合は、各テーブルにこれらの列を配置することで対応した方が良いと思います。

数年前に取り組んだプロジェクトに、監査テーブルと呼ばれるものを更新するトリガーを実装しました(変更に関する基本情報を保存し、テーブルごとに1つの監査テーブルを作成しました)。これには、変更日(および最終変更日)が含まれます。

これらはキーテーブルにのみ適用されました(結合または参照データテーブルではありません)。

これにより、LastCreatedおよびLastModifiedフィールド。ただし、トリガーを最新の状態に保つという煩わしさがありました。

最終的に、トリガー/監査テーブルの設計はうまく機能し、ETL(!)の前にトリガーを削除して再適用するだけでした。

これは、私が取り組んでいるWebベースのCMS用です。作成日と最終更新日はほとんどのページに表示され、最終作成(および更新)ページのリストがあります。管理インターフェースもこの情報を使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top