1

データベースに履歴テーブルを追加しました。もともと私はDeletedというビットを追加し、その行が削除された場合は1に更新するつもりでした。それ以外の場合は、各行が更新されます。

次に、誰がいつ何を削除したかをログに記録する必要があると通知されました。そこで、Nullable[DeletedBy][DeletedOn]フィールドを追加しました。この時点で、これによって削除済みビットが冗長になるのではないかと思っていました。どの行が削除されているかを確認したい場合は、テーブルをクエリして、DeletedByがNullでない場所を確認するだけです。

私はこの質問で、より良い実践であると尋ねることを意図しました:

  1. 余分なビット列がある

  2. すでに存在するNULL可能列を使用して、削除された行を識別します

しかし、私はこれが好みのものだと思い始めています。代わりに私の質問は、どちらがより効率的ですか?このテーブルが大きくなった場合、実行するとパフォーマンスが向上しますか?

    Select * from MyTable where [Deleted] = 1

以上

    Select * from MyTable where [DeletedBy] is not null
4

5 に答える 5

2

これはもっと好みです。技術的にはdatetimeフィールドはフィールドよりも大きいbitですが、とにかくそれを保存する必要があるので、それは実際には重要ではありません。ただし、パフォーマンスに関しては、どちらにもインデックスを付けて同じ結果を得ることができます。bit個人的には、フィールドは冗長であり、null許容型を使用していると思いますdatetime

于 2012-04-11T15:51:17.070 に答える
1

誰が削除したかを知る必要があるので、DeletedBy列はそこにとどまる必要があります。これが主な質問になります:ビット列を保持する必要がありますか?

答えは簡単です:いいえ:)私はそれがほんの少しの列であり、それはあまり占有しないことを知っていますが、たくさんの行を少し掛けるとたくさんのビットになります。もちろん、ストレージに影響を与えることはないでしょうが、この場合、冗長データを保持する理由はありません。

あなたが持っているかもしれないdeleted=1フィールドに関しては、DeletedByを'system'のようなもの、または新しいフィールドの実装前にレコードが削除されたことを通知するものに更新するだけです。

于 2012-04-11T16:00:54.330 に答える
1

少し前に「DeletedBy」を追加し、ライブデータベースに「deleted」であるレコードがすでに存在する場合は、「deleted by」に入力する情報がないため、ビットフィールドを保持する必要があります。 'この段階で(私は想像します)。

于 2012-04-11T15:53:43.177 に答える
1

あなたは基本的に監査証跡を作成しています、そしてそれは簡単です。まず、監査情報のいくつかの標準フィールドを使用して、すべての監査テーブルを作成します。例えば:

[audit_id] [int] IDENTITY(1,1) NOT NULL,
[audit_action] [varchar](16) NOT NULL,
[audit_date] [datetime] NOT NULL,
[audit_user_name] [varchar](128) NOT NULL,
--<your fields from the table being audited>

デフォルトのaudit_dateの値はgetdate()。です。Active Directoryセキュリティを使用している場合は、デフォルトのaudit_user_nameを値に設定しsuser_sname()ます。それ以外の場合は、クエリでこれを指定する必要があります。

次に、監査対象のテーブルのINSERT、UPDATE、およびDELETEのトリガーを作成します。値を監査テーブルに書き込みます。DELETEの例を次に示します。

CREATE TRIGGER [dbo].[tr_my_table_being_audited_delete] 
   ON  [dbo].[my_table_being_audited] 
   AFTER DELETE
AS 
BEGIN

SET NOCOUNT ON;

INSERT INTO dbo.my_audit_trail_table (audit_action, --<your fields from the table being audited>)
    SELECT  'DELETE', --<your fields from the table being audited>
    FROM    deleted

END
于 2012-04-11T16:31:18.893 に答える
0

大規模なテーブルの場合、ソフト削除を使用するのは本当に好きではありません。アーカイブを使用することを好みますが、すべてのプロジェクトが異なることを理解しています。

オーバーヘッドが少し少ないので、おそらくプライマリテーブルに「DeletedBy」フラグを保持し、監査用に「DeletedBy」と「Timestamp」を使用してDeletionLogテーブルを作成します。

これは、読み取りの多い環境で特に役立ちます。

于 2012-04-11T16:33:08.867 に答える