MS SQL 2008 を使用すると、すべてのテーブルに、挿入されたレコードの「I」、更新されたレコードの「U」、削除されたレコードの「D」を示す Status varchar(1) 列、および DateCreated 日時列と DateUpdated 日時列が含まれます。 .
ほとんどの場合、アクティブなレコードのみをテーブルにクエリしたいので、次のようにします。
SELECT column FROM table WHERE Status <> 'D'
使用状況を把握するために、これは最も頻繁に使用されるフィルターであり、ほぼすべてのクエリに表示され、テーブルが結合されるときに複数回表示されます。
パフォーマンスの最大化に重点を置いて、新しい Web アプリケーションとデータベースを開発しています。1 つの提案は、このプロジェクトと将来のプロジェクトから始めて、レコードが削除されたかどうかを示し、2 つの日時フィールドから更新されたステータスを推測するために、varchar(1) Status 列パターンを「IsDeleted」のようなものに置き換えることです。
言い換えると...
SELECT column as InsertedRecords FROM table WHERE Status = 'I' -- Rare case
SELECT column as UpdatedRecords FROM table WHERE Status = 'U' -- Rare case
SELECT column as ActiveRecords FROM table WHERE Status <> 'D'
SELECT column as DeletedRecords FROM table WHERE Status = 'D'
...代わりに次のようになります...
SELECT column as InsertedRecords FROM table WHERE IsDeleted = 0 AND DateCreated = DateUpdated -- Rare case
SELECT column as UpdatedRecords FROM table WHERE IsDeleted = 0 AND DateCreated <> DateUpdated -- Rare case
SELECT column as ActiveRecords FROM table WHERE IsDeleted = 0
SELECT column as DeletedRecords FROM table WHERE IsDeleted = 1
具体的なパフォーマンスの利点/影響 (主要なインデックスと大規模なクエリ) はありますか? または両方の実装が完全に受け入れられますか? 一貫性を保つために現在のパターンを継続して、以前に作成されたアプリケーション/データベースと整合させることに不利な点はありますか?