2012-07-13 2 views
0

예상대로 테이블을 참조하는 많은 외부 키가있는 큰 데이터베이스가 있습니다. 데이터베이스 디자인 관점에서, 외래 키에 의해 참조되는 레코드의 삭제를 어떻게 처리해야합니까?참조 된 외부 키 삭제 ID

내가 생각한 한 가지 옵션은 레코드가 활성화되어 있는지 여부를 결정하는 테이블에 부울 열을 추가하는 것입니다. 그래서 내가 레코드를 지우고 자한다면, 나는 부 울린 액티브 값을 false로 설정했을 것입니다.

데이터베이스가 비대화 될 수 있지만 참조 된 모든 외래 키가 변경되지 않을뿐만 아니라 데이터베이스에 더 많은 정보가 저장됩니다.

시스템의 중요한 데이터베이스에 관한 귀하의 의견을 듣고 싶습니다.

답변

1

는 지금까지 내가 당신의 질문을 이해, 당신은 두 테이블이 있습니다

| main |    |  child  | 
|-------|    |---------------| 
|id|data| (1) ----> (n) |id|main_id (FK)| 

을 그리고 당신은 자식 테이블의 레코드가있는 경우, 기본 테이블에서 데이터를 삭제하지 않습니다.

당신은 사용하는 RDBMS를 말하지 않았습니다. 그러나 MySQL에서는 외래 키 유형을 설정할 수 있습니다. RESTRICT로 설정하면 시스템은 하위 테이블에 데이터가있는 경우 기본 테이블에서 데이터를 삭제할 수 없습니다.

또는 CASCADE로 설정할 수 있습니다. 그러면 주 테이블의 데이터를 삭제하면 하위 테이블에서 자동으로 삭제됩니다.

따라서 추가 '활성'입력란을 만들 필요가 없습니다.

+0

실례합니다. Postgres를 사용하고 있으며 CASCADE를 삭제하는 방법을 알고 있습니다.나는 전체적으로 애플리케이션을 살펴 보았고 데이터베이스를 통해 많은 외래 키로 참조되는 사용자 테이블과 같은 항목을 삭제했습니다. 경험상 이러한 테이블에서 항목을 삭제하는 것이 좋습니다? 사용자 테이블에 활성 부울 열을 추가하는 것과는 대조적으로 손상된 데이터의 가능성을 단순히 증가시키지 않을까요? 이런 경우 좋은 디자인인가요? – greatkalu

0

귀하의 질문에 대한 답변은 귀하의 신청서에 따라 크게 다릅니다.

"역사적인"데이터가 필요한 경우 "사용 가능"플래그를 사용하는 것이 올바른 선택입니다. 그러나 데이터베이스에 중요한 데이터가 있고 삭제 된 데이터를 복구하기가 쉽지 않은지 확인하려면 "사용 가능"플래그가 표시되지 않습니다.

다른 측면 :

  • 당신은 "삭제 취소"를해야합니까?
  • 얼마나 자주 삭제 작업이 수행됩니까? 많은 삭제는 많은 비활성화 된 항목을 만듭니다.
  • 비활성화 된 항목을 참조하는 항목이 사용 중지되지 않도록하는 쉬운 방법 (예 : 데이터베이스 트리거)이 있습니까?
  • 응용 프로그램에서 사용 가능한 항목 만 보거나 처리하도록하는 프로세스 또는 메커니즘이 있습니까? 전망을 고려하십시오.
  • 사용 가능한 항목을 찾는 속도를 높이고 많은 공간이 필요하도록 적절한 색인을 만드는 것이 좋습니다.
  • 마지막으로 삭제 된 항목을 삭제하기위한 요구 사항 (기술적, 조직적, 법적)이 있습니까? 그 목적으로 삭제 날짜가 필요합니까?
  • 정리 스크립트가 필요합니까?

저는 많은 질문을 알고 있습니다. 그러나 그 질문이 귀하의 질문에 대한 답변을 찾는 데 도움이되기를 바랍니다.

+0

조언 해 주셔서 감사합니다. 내 응용 프로그램의 전체 아이디어는 종이 작업 및 파일을 통해 할 필요없이 많은 정보를 사용할 수 있도록하는 것이므로 enable-flag를 선택해야합니다. 내 데이터베이스는 거의 250 개의 테이블을 가지고 있으며, 이는 매우 중요합니다. 따라서 DB 서버가이 모든 데이터를 처리 할 수 ​​있기를 바랍니다. 다시 한번 감사드립니다. – greatkalu