web-dev-qa-db-ja.com

データベーステーブルはいつタイムスタンプを使用する必要がありますか?

まず、この質問はデータベース交換に関係しているのではないかと思いましたが、データベースよりもプログラミングソリューション全体に関係していると思います。人々がそれが最高だと思うなら、データベース交換に移ります。

データベーステーブルに作成および更新されたタイムスタンプをいつ追加する必要があるのか​​疑問に思いましたか?

最初の明白な答えは、何かが更新されたとき(トランザクション完了日など)にビジネスロジックがそれを知る必要がある場合は、それを入力する必要があるということです。

しかし、ビジネスロジック以外の場合はどうでしょうか。たとえば、行が変更された日時を知っておくと、フォールトの検出に役立ちます。一部のビジネスロジックが失敗し、関連するデータベースの行を調べて、1つの行が別の行の前に更新されており、それがエラーの原因であることを特定できます。

この使用例では、すべてのテーブルに更新を与えてタイムスタンプを作成することは理にかなっています(ただし、アプリケーションのどの部分でも更新されない最も簡単な列挙型テーブルを除く)。

すべてのテーブルにタイムスタンプを付けることは、間違いなくデータベースをすばやく停止させる優れた方法です(間違っている可能性もあります)。

それでは、データベーステーブルがタイムスタンプの作成と更新を使用するのはいつですか?

19
Gaz_Edge

より良い、より多くの包括的なデータベース管理のために、そして最も賢明な実践はそうすることです。

まず、開発者である可能性が高いため、開発のためにデータベーストランザクションおよび/またはアクティビティを追跡し、データベースに関係するときはいつでもコードのバグやエラーを簡単に追跡できるようにします。

また、データベースで行われたアクティビティを追跡する必要があるときはいつでも統計目的です。

もう1つは、おそらく当面はデータベースのアクティビティを追跡する必要がないことですが、将来的には発生する可能性が高くなります。 本日はお時間をいただきますが、今後さらにお買い求めいただけます

密猟者(開発者)とゲームキーパー(DBA)の両方である人物として、まだ多くの人がこれに価値を見出せず、肥大化していると考えていることに驚いています。

簡単に言えば:

レコードが追加されている(ただし更新されていない)テーブルの場合。ログインなどDATE_CREATED列を追加することを検討します。

レコードが追加および更新されるテーブルでは、DATE_CREATED列とDATE_UPDATED列を追加することを検討します。

私は、設計の一部としてDATE_CREATEDとDATE_UPDATEDがデフォルトですべてのテーブルに含まれている多くの場所で働いてきました。

数百万/数十億行の大規模なデータベースで、データベースの更新が数日間にわたって実行された場合、更新を引き起こしたデータポットを追跡するいくつかのテーブルにSOURCE列も追加しました。サードパーティのフィード、ユーザーの更新、DBAの変更、データクレンジングなど。

16
Robbie Dee

質問の言い方では、物事のリストを求めています。私はあなたの質問に直接答えるのではなく、別の解決策を使うべきときに答える危険を冒します。

障害の発見に役立つように行が変更された日時を知ることが本当に役立つシナリオを考えることができます

特定のレコードのすべての更新のログを保持する方が便利でしょうか?最後の更新を知っているだけでは、十分な情報ではない可能性があります。このログは別のテーブルに置くことができます。同じログファイル内のいくつかのテーブルからの変更を追跡する方が便利です(テーブルである必要はありません)。これにより、すべてのテーブルchange_datesの大規模なユニオンクエリで集計を取得できなくなります。これは、システム内のより多くのイベントの記録を確認するのに役立つため、トラブルシューティングにも役立ちます。

さらに:ユーザーも考慮する必要があります。ビジネスケースにはならないかもしれませんが、経験の浅いユーザーや、ユーザーエラーを起こさず、常にコンピューターのせいにしたいという企業文化のユーザーがいる場合は、あらゆる種類のログを記録すると、テーブルの更新日を含めるのに役立ちます。この場合、Update_UserIDフィールドも必要になる場合があります。

6
JeffO

次のいずれかに該当する場合は、データベーステーブルに作成テンプレートと変更テンプレートを含める必要があります。

  1. この表は、ユーザーが指定したアクティビティのプライマリレコードを表しています。ユーザーがXを実行し、Table_Xの1対多の子であるTable_YTable_Xの両方がある場合、Table_Yはプライマリレコードではないため、追加のフィールドは必要ありません。
  2. システム追跡が永続的、一時的、または繰り返し必要な場合。 Table_YTable_Xの更新時にのみ更新されることを確認する必要がある場合は、追加の追跡フィールドが役立ちます。

これらはどちらも排他的ではないことに注意してください。先に進み、デフォルトでそれらをどこにでも追加でき、パフォーマンスのチューニングに必要な場合にのみ省略できます。

1
DougM

個人的な意見:

modified列に値が表示されません。

createdは、絶対にexceptionalで正当化しない限り、すべてのデータベーステーブルに追加する必要があります。そこにあることには多くの価値があります。

ただし、updatedは無駄に見えます。何も考えずに、2つのデータベーステーブルを作成します。1つはドキュメントIDを指定し、もう1つはドキュメントバージョンを指定します。非常に単純な場合

create table document (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

create table version (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    document_id INT NOT NULL REFERENCES document(id),
    content TEXT NOT NULL,
    created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

次に、必要なversionの最新のdocumentを選択します。このようにして、変更日を保存するだけでなく変更日-最終日だけでなく-も保存しますそのドキュメントのバージョン。それに対する唯一の議論は本当にハードドライブの容量ですが、確かにあなたがどのハードドライブの容量を使い果たしているのか気になっているとき、ほとんどの場合、あなたはさらに煩わしいでしょうデータのバージョン管理について

1
Algy Taylor