6

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

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

もう1つの可能性は、この情報を格納するログテーブルを作成することであり、任意のエンティティの更新を追跡するためのログテーブルを含めることができます。

何かご意見は?私は後者の実装に傾いています。

4

5 に答える 5

6

すべてのテーブルに対して単一のログ テーブルを使用する方法には、次の 2 つの主な問題が考えられます。

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

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

于 2008-10-26T02:26:53.227 に答える
5

「ログ」または「イベント」テーブルを使用して後者を行います。私の経験では、最新の更新時刻だけでなく、多くの場合、修正が必要になるため、「更新された」タイムスタンプはすぐにイライラします。

于 2008-10-26T00:06:18.580 に答える
0

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

于 2008-10-26T12:23:35.287 に答える
0

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

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

これにより、LastCreated フィールドと LastModified フィールドを考慮しなければならないという通常のフラストレーションが解消されましたが、トリガーを最新の状態に保つという煩わしさが生じました。

最終的に、トリガー/監査テーブルの設計はうまく機能し、ETL(!) の前にトリガーを削除して再適用することだけを覚えておく必要がありました。

于 2008-10-26T01:07:00.363 に答える
0

どのくらいの頻度で作成/更新されたタイムスタンプをプレゼンテーション レイヤーに含める必要がありますか? 答えが「久しぶりに」以上のものである場合は、各テーブルにそれらの列を配置することで、より良いサービスが提供されると思います。

于 2008-10-26T00:05:42.217 に答える