2

タスクとログテーブルがあるとしましょう:

tbl_tasks

Id     Name               ProjectId
-----------------------------------
1      Walk the dog       1
2      Check the mail     1 

tbl_log

Id     TaskId    CreatedDateTime 
--------------------------------
1      1         6/3/13 7:18am    
2      2         6/3/13 7:18am      
3      1         6/3/13 7:18am      

ログ テーブルは、イベントの永続的な記録である必要があります。ただし、ユーザーがタスクを削除すると、整合性の問題が発生し、いくつかの解決策を考えています。

1 . ログ テーブルで TaskIn を使用する代わりに、タスク名を使用します。私はこのアプローチのファンではありませんが、簡単な解決策です。

tbl_log

Id     TaskName           Credits 
---------------------------------
1      Walk the dog       2      
2      Check the mail     1      
3      Walk the dog       2      

2 . タスクがプロジェクトに対して 1:m の関係を持つことを可能にする別のテーブルを導入しますが、実際には 1:1 であり、pk (一意の制約) として taskId を持つことによって適用されます。タスクを削除する代わりに、タスクとプロジェクトの関係を削除します。私は、FK を持たないすべてのタスクが切断されたために、これが残したすべてのごみのファンではありません。これは、ほとんどの場合になると思います。

tbl_tasksInProject

TaskId     ProjectId    
-------------------
1          1               
2          1                     

これに対処するためのベストプラクティスは何ですか?

4

3 に答える 3

2

2 つの解決策のうち、正直に言うと、タスク名を保持することにします。ID だけを保持している場合、それが何を参照しているのかをどのように知ることができますか?

しかし 3 番目のオプションとして、tblTask​​s に Deleted という追加フィールドを用意してみませんか? これは、実際にレコードを削除するのではなく、タスクが削除されたときに true に設定できます - 効果的に論理的な削除を行い、関係を維持しますか?

于 2013-06-03T11:35:16.303 に答える
0

あなたがとるアプローチは、ベストプラクティスではなく、要件に本当に依存すると思います。

タスクが削除された後でも、対応するレコードをログ テーブルに保持したいようです (それ自体はあまり良い方法ではありません。何も参照しないデータを保持する意味は何ですか?)。このような場合は、論理的な削除を行うのが最善の方法かもしれません (このアプローチの利点と欠点については、この質問に対する上位 2 つの回答で説明しています)。

つまり、「IsDeleted」という名前の BIT 列がTasksあり、削除する代わりに、フィールドを 1 に更新するだけです。

この列の代わりに、ProjectIDNULL 可能にし、外部キーの参照アクション トリガーを次のように変更します。

ALTER TABLE tbl_tasks
ADD CONSTRAINT FK_tbl_Tasks_ProjectID FOREIGN KEY (ProjectID)
REFERENCES tbl_Projects (ID) ON DELETE SET NULL;

このように、プロジェクトが削除された場合、関連するタスクの ProjectID は になりNULLNULLProjectID を持つタスクが「削除」されたことがわかります。これは、Task テーブルへの参照整合性が失われないことを意味します。

または、論理的な削除アプローチが必要なく、削除されたタスクのログ イベントを保持する必要がない場合は、タスク テーブルからログ テーブルに削除をカスケードすることもできます。

ALTER TABLE tbl_log
ADD CONSTRAINT FK_tbl_log_TaskID FOREIGN KEY (TaskID)
REFERENCES tbl_tasks (ID) ON DELETE CASCADE;

要約すると、どの方法を選択しても一貫性があり、すべてのデータを削除するか (ON DELETE CASCADE)、データをまったく削除しないか (ソフト削除)、半分を削除しないと、参照整合性の問題は発生しません。

于 2013-06-03T11:50:35.793 に答える