タイムスタンプフィールドをテーブルに追加しないようにするにはどうすればよいですか? [閉まっている]
質問
多くのソリューションで見られる各レコードの2つの追加列(timeCreated、timeLastUpdated)に関して質問があります。私の質問:より良い代替手段はありますか?
シナリオ:(レコードではなく、テーブルに関して)巨大なDBがあり、顧客が来て「タイムスタンプ」を追加するように頼みます。テーブルの80%まで。
これは、別のテーブル(TIMESTAMPS)を使用して達成できると考えています。このテーブルには、明らかなタイムスタンプ列に加えて、テーブル名と更新されるテーブルの主キーがあります。 (ここでは、ほとんどのテーブルで主キーとしてintを使用すると仮定していますが、テーブル名はほとんどの場合文字列である必要があります)。
これを描くために、この基本的なシナリオを想定してください。 2つのテーブルがあります。
支払い:-(通常の記録)
TIMESTAMP:-{現在のタイムスタンプ} + { TABLE_UPDATED
、 id_of_entry_updated
、 timestamp_type
}
この設計では、これら2つの「追加」は必要ないことに注意してください。現在、 TABLE_UPDATED
および id_of_entry_updated
でインデックスを作成しているため、ネイティブ支払いオブジェクトの列(これはORMソリューションを介して行われる可能性があります)。さらに、 timestamp_type
は、エントリが挿入(例:" 1")、更新(例" 2")、およびその他の追加が必要なもの(< deletion"など)を示します。 ;。
このデザインについてどう思いますか。私は、ベストプラクティス、時間の経過とともに機能し、拡張されるものに最も興味があります。参照、リンク、ブログのエントリは大歓迎です。この問題に対処しようとする少なくとも1つの特許(出願中)を知っていますが、現時点では詳細が公開されていないようです。
乾杯、 エドゥアルド
解決
作業中に、変更を行ったユーザーも記録します。
(他の人が強調した結合パフォーマンスに加えて)分離テーブル設計の欠陥は、すべてテーブルにキーのID列があると仮定することです。常にそうとは限りません。
SQL Serverを使用する場合、新しい2008バージョンは 変更データキャプチャ
により、あなたが話している多くの痛みを取り除くことができます。 Oracleにも同様のものがあると思います。
更新:どうやらOracleはSQL Serverと同じものと呼んでいるようです。むしろ、Oracleの実装が最初に来たため、SQL ServerはOracleと同じものを呼び出します;)
http://www.oracle.com/technology/oramag/ oracle / 03-nov / o63tech_bi.html
他のヒント
監査対象の各テーブルに2つのテーブルがあるデザインを使用しました:
create table NAME (
name_id int,
first_name varchar
last_name varchar
-- any other table/column constraints
)
create table NAME_AUDIT (
name_audit_id int
name_id int
first_name varchar
last_name varchar
update_type char(1) -- 'U', 'D', 'C'
update_date datetime
-- no table constraints really, outside of name_audit_id as PK
)
NAME
に対して何かが行われるたびに、 NAME_AUDIT
を取り込むデータベーストリガーが作成されます。このようにして、テーブルに加えられたすべての変更の記録をいつ取得します。データベーストリガーによって維持されているため、アプリケーションはこれについての本当の知識を持っていません。
これはかなりうまく機能し、実装するためにアプリケーションコードを変更する必要はありません。
タイムスタンプを個々のテーブルに追加する方がいいと思います。複合キー(1つは文字列)のタイムスタンプテーブルへの参加は遅くなります。大量のデータがある場合、最終的には実際の問題になります。
また、多くの場合、タイムスタンプを確認しているのは、アプリケーションの問題をデバッグしているときに、常に他のテーブルと結合するのではなく、データをすぐに必要とするときです。
提案する方法の利点は、変更を行ったユーザーの追跡など、TIMESTAMPテーブルに他のフィールドを追加するオプションが提供されることです。また、この契約の価格を変更した人など、機密フィールドへの編集を追跡することもできます。
別のファイルに記録の変更を記録すると、次のように記録に複数の変更を表示できます。
mm / dd / yy hh:mm:ss XXXによって追加 mm / dd / yy hh:mm:ssフィールド価格XXXで変更、 mm / dd / yy hh:mm:ssレコードはXXXによって削除されました
1つの欠点は、メインテーブルの変更を反映するためにTIMESTAMPSテーブルに挿入を実行する余分なコードです。
トリガーで実行されるようにタイムスタンプを設定すると、トリガーを実行できるアクション(読み取り?)を記録できます。また、ロックの利点もいくつかあります。
(すべてを一粒の塩で取ります、私はDBAやSQLの第一人者ではありません)
はい、私はそのデザインが好きで、いくつかのシステムで使用しています。通常、次のいくつかのバリアント:
LogID int
Action varchar(1) -- ADDED (A)/UPDATED (U)/DELETED (D)
UserID varchar(20) -- UserID of culprit :)
Timestamp datetime -- Date/Time
TableName varchar(50) -- Table Name or Stored Procedure ran
UniqueID int -- Unique ID of record acted upon
Notes varchar(1000) -- Other notes Stored Procedure or Application may provide
設計の悪夢の1つは、すべての挿入、更新、または削除がそのテーブルにヒットする必要があることです。これにより、主要なパフォーマンスとロックの問題が発生する可能性があります。 (タイムスタンプだけでなく)そのようなテーブルを一般化することは悪い考えです。また、データを取得するのは悪夢です。
ユーザーに表示させたくないフィールドを追加すると、GUIレベルでコードが破損する場合、GUIにコードを誤って書き込みます。
タイムスタンプを取得するために実行する必要がある余分な結合は、わずかなパフォーマンスの打撃と首の痛みになると思います。それ以外は問題ありません。
あなたがしたことを正確にやった。オブジェクトモデルと、新しいスタンプと異なるタイプのスタンプを最小限のコードでモデルに追加する機能に最適です。また、変更を行ったユーザーを追跡していましたが、多くのロジックはこれらのスタンプに大きく基づいていました。目が覚めました。
1つの欠点は、レポート、および/または画面上に多くの異なるスタンプを表示することです。あなたが私たちがやった方法でそれをしているなら、それは多くの結合を引き起こしました。また、バックエンドの変更は苦痛でした。
当社の解決策は、「トランザクション」を維持することです。 「セッション」に加えて、表表。 UPDATE、INSERT、およびDELETE命令はすべて、「トランザクション」を通じて管理されます。オブジェクトとこれらの各SQL命令は、「トランザクション」に保存されます。テーブルがデータベースで正常に実行されたら。この「トランザクション」テーブルには、transactiontType(INSERTの場合はI、DELETEの場合はD、UPDATEの場合はU)、transactionDateTimeなどの他のフィールド、外部キー「sessionId」などがあり、最終的に誰が命令を送信したかを示します。いくつかのコードを使用して、誰が何をいつ実行したかを特定することも可能です(ガスは月曜日にレコードを作成し、ティムは火曜日に単価を変更し、リズは木曜日に追加の割引を追加しました)。
このソリューションの長所は次のとおりです。
- 「誰が、いつ、誰に」を伝え、ユーザーに表示することができます! (SQLステートメントを分析するにはコードが必要です)
- データが複製され、複製が失敗した場合、このテーブルからデータベースを再構築できます
短所は
- 1か月あたり10万件のデータ更新は、Tbl_Transactionの100,000件のレコードを意味します
- 最後に、このテーブルはデータベースボリュームの99%になる傾向があります
選択:90日より古いすべてのレコードは毎朝自動的に削除されます
フィリップ、
90日以上経過したものを単に削除したり、最初に別のDBに移動したり、テキストファイルに書き込んだり、保存するために何かを行ったり、メインの本番DBから移動したりしないでください。
結局のところ、ほとんどの場合、「ドキュメントを最も多く獲得している」というケースです!