2011-09-03 13 views
2

データベースの各テーブルにdate_createdカラムとdate_modifiedカラムがあります。アプリケーションまたはデータベースのタイムスタンプ列を更新しますか?

MySQLトリガーを使用するデータベースでタイムスタンプ列を設定すると、PHPを使用してアプリケーション層に設定する利点と欠点は何ですか?

多くのサーバーに配備すると、維持管理が容易になり、時間同期が改善されますか?

編集: Johanはデータベースにタイムスタンプを設定することを推奨しているので、これらの正しい実装ですか? さらに、すべてのテーブルでdate_createdとdate_modifiedを使用することをお勧めしますか? または特定のテーブルに追加することをお勧めしますか? データベース

date_created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP 
date_modified TIMESTAMP NOT NULL DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP 
+0

MySQL(非常に面倒なことに、その "機能"について知らず、完全に異なるデータを含むようにしたい場合)は、行が更新されたときにテーブルの最初のタイムスタンプ列の値を上書きするので、データベースに直接値を持たせることもできます。トリガーは必要ありません。 – wildpeaks

答えて

2

タイムスタンプ。

マスター/スレーブ設定で複製する場合、データベースのタイムスタンプは(元のタイムスタンプを使用して)正しく複製されます。

トリガーにタイムスタンプを設定していません(!)。

テーブル定義で指定する代わりに、MySQLは自動的に挿入または更新時に正しいタイムスタンプを設定します。
テーブルを作成(または変更)するときに一度だけ設定する必要があります。

簡単にできませんでした。

+0

私は同意します。環境によっては、Webサーバとデータベースの間に大きなクロックスキューが存在する可能性があることに注意してください。一般に、一貫性のためにDB時間を使いたいとします。 – MZB

+0

@MZB、さらに多くの理由で、データベースレプリケーションのクロックスキューが、DBが処理する解決済みの問題であるためです。 – Johan

+0

"容易"は必ずしも "良い"という意味ではありません –

0

どのテーブルにタイムスタンプ列を入れるべきかはあなたの裁量です。本番環境では、すべての表にこれらの列があります。

ただし、コードで値を設定します。私は、これは日付がアプリケーションを完全に制御できるように行われたと信じています。いずれにしても、レプリケーションはうまくいくことがわかります。アプリケーションで日付を設定し、アプリケーションサーバー時間ではなくDBサーバー時間を使用する場合は、単にMySQLのNOW()関数を使用して列を設定します。

0

すべてのテーブルでdate_createdとdate_modifiedを使用することをお勧めしますか?

確かに。
私もdate_deletedをスローします。

アプリケーションまたはデータベースのタイムスタンプ列を更新しますか?

これらのフィールドの使い方によって異なります。
最後の編集時間を表示したい記事がある場合は、mysqlタイムスタンプ機能を使用しないでください。データベース内のすべてのレコードで同じ更新時間のような予期しない結果になるためです。

トリガーと同じです。
怠け者ではない場合は、このフィールドを手動で設定してください。すでにORMを使っているので、あなたには何の費用もかかりませんね。

+0

データベース内のすべてのレコードで同じ更新時刻のような予期しない結果が発生しました。 MySQLが実際に変更されていないことを知るのに十分なほどスマートなので、 'update table1 set a = 0 where a = 0'は実際にタイムスタンプ更新を引き起こさないでしょう。 – Johan

関連する問題