2013-06-03 9 views
2

가 나는 작업 및 로그 테이블이 있다고 가정하자 FK 제약 조건을 테이블 삭제하는 경우 :모범 사례

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  

로그 테이블은 영구 r이어야합니다. 이벤트의 ecord. 그러나 사용자가 작업을 삭제하면 몇 가지 해결책을 염두에 둔 무결성 문제가 발생합니다.

. 로그 테이블에서 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이 될 것이고 taskId를 pk (고유 제한 조건)로 사용함으로써 시행 될 것입니다. 작업을 삭제하는 대신 작업과 프로젝트 간의 관계를 삭제하십시오. 나는 모든 작업이 FK가없는 절단 된 나머지 모든 쓰레기를 좋아하지 않는다. 내가 추측하는 것은 대다수의 경우 일 것이다.

tbl_tasksInProject

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

이 다루는 가장 좋은 방법은 무엇입니까?

답변

2

나는 두 가지 해결책 중 솔직히 말해서 작업 이름을 붙잡고 있습니다. 당신이 단순히 신분증을 지킨다면 그 신원이 무엇을 의미하는지 어떻게 알 수 있습니까?

그러나 세 번째 옵션으로 tblTasks에 Deleted?라는 추가 필드가없는 이유는 실제로 레코드를 삭제하는 대신 작업이 삭제 될 때 true로 설정되어 효과적으로 소프트 삭제를 수행하고 관계를 유지 관리 할 수 ​​있습니다.

0

"이름"및 nullable FK가 "tbl_tasks"인 세 번째 테이블을 만듭니다.
그런 다음 세 번째 테이블을 tbl_log 참조하십시오. tbl_tasks '행이 삭제 얻을 때마다

따라서, 해당 행에 대한 참조 그냥 널 얻는다 (또는 디폴트로 설정 "삭제가 불가능"tbl_tasks 행)

0

난 당신이 취하는 접근 방식은 정말 아니라, 당신의 요구 사항에 따라 달라집니다 생각 모범 사례보다.

작업을 삭제 한 후에도 로그 테이블에 해당 레코드를 보관하고 싶습니다 (아무런 관련이없는 데이터를 유지하는 것이 중요할까요?). 이 경우 소프트 삭제를 가장 잘 수행 할 수 있습니다 (이 방법의 이점과 단점은 this question의 맨 위 두 가지 답변에서 설명합니다).

즉, BIT 열을 Tasks에 "IsDeleted"라고 지정하고 삭제하는 대신 필드를 1로 업데이트하면됩니다.

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

이 방법을, 프로젝트가 연관된에 다음 ProjectID을 삭제 한 경우 다음과 같이

이 칼럼에 대한 대안은 ProjectID 널 (NULL)을하고, 외부 키에 referencial 액션 트리거를 변경하는 것 작업이 NULL이되면 NULL ProjectID가있는 작업이 "삭제됨"임을 알 수 있습니다. 이것은 당신이 Task 테이블에 대한 참조 무결성을 잃지 않는다는 것을 의미합니다.

ALTER TABLE tbl_log 
ADD CONSTRAINT FK_tbl_log_TaskID FOREIGN KEY (TaskID) 
REFERENCES tbl_tasks (ID) ON DELETE CASCADE; 
: 당신은 소프트 삭제 방법을 원하지 않는 당신은 당연히 바로 로그 테이블에 작업 테이블에서 삭제 계단식 수 삭제 작업에 대한 로그 이벤트를 보관할 필요가없는 경우 또는

,

요약하면 어느 방법을 선택하든간에 모든 데이터를 삭제하거나 (소프트 삭제) 모든 데이터를 삭제하거나 삭제하지 않으면 절반을 삭제하지 않으므로 참조 무결성 문제가 발생하지 않습니다.