2016-03-21 20 views
1

私はSQL Server 2014を持っており、大学ではすべてのテーブルに対してソフト削除を実装したいと考えています。ソフト削除の実装

SET DATEFORMAT dmy 

CREATE TABLE Customers 
(
    CustomerId int IDENTITY (1,1) not null, 
    FirstName varchar (20) not null, 
    LastName varchar (30) not null, 
    Address1 varchar (30) not null, 
    Address2 varchar (30) not null, 
    Address3 varchar (30) null, 
    Eircode varchar (8) null, 
    DateOfBirth date not null, 
    CountyId int not null, 
    CountryId int not null, 
    AssociationId int null, 
    CustomerTypeId int not null, 
    AccountId int not null 
) 

私は時に削除使用してソフト削除のために列を追加します。これを行う最善の方法は何ですか?

データベースのすべてのテーブルでソフト削除(deleted_at)を使用して一貫性を保つことを推奨しますか。

+0

外部キーを宣言するのを忘れませんでしたか? – Schwern

答えて

0

一貫性が鍵です。

1つのテーブルで使用するフィールド名は、他のテーブルでも一貫性を維持しようとすると、コードをリファクタリングして多くの行に新しいwhere句を適用する必要があります。

ALTER TABLEを使用すると、deletedのブール値フィールドを単純に追加することもできます。また、日付/時刻、さらにはユーザーさえもより多くのデータを記録できます。繰り返しますが、一貫性が重要です。どのフィールド名を使用しても、他のテーブル間で一貫性を保ちます。

次に、トリガを作成して、削除時にフィールド情報を更新し、トリガから削除をキャンセルすることもできます。フィールド名の一貫性はここで大いに役立ちます。

0

フィールドにdeleted_time(ユーザーなど)を追加し、トリガーを追加して削除時にこのフィールドを入力し、削除レコードをキャンセルします。クエリの追加条件では、deleted_timeはnullではありません。
現在のデータのパフォーマンスを向上させるために、Customers_archのような新しいテーブルを作成してCustomersに削除時にトリガを追加し、date_time、userなどのいくつかの追加フィールドを持つCustomersからCustomers_archに行を挿入することができます。あなたの既存のアプリに

0

ソフト削除は、データ設計とクエリの複雑さを増します。すべてのクエリは、deleted_atをチェックすることを覚えていなければなりません。すべての結合は、deleted_atもチェックする必要があります。これは人々が忘れる可能性のあるものです。

必要がない場合は実行しないでください。これを使用しているものに応じて、ローリングバックアップ、レコードを別のテーブルに移動する、または「アクティブな」結合テーブルを使用する方が優れた設計です。後者の例として、あなたはそうのようなテーブルを結合する必要があるだろう

CREATE TABLE active_customers (
    CustomerID INT REFERENCES Customers(CustomerId) 
); 

これは冗長に思えるかもしれないが、それは関係が簡単になります。今や、誰がアクティブで誰が誰でないかを決定する明確な方法があります。クエリactive_customerscustomersとの結合。顧客が有効化または無効化されたときに他のテーブルを更新するには、active_customersにトリガを追加することができます。アクティブな顧客を必要とする関係はactive_customersに関連付けることができ、結合を限定する必要はありません。