정규화된 데이터베이스의 세부 테이블에서 고아 레코드를 방지하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/448592

  •  19-08-2019
  •  | 
  •  

문제

제대로 정규화되지 않은 오래된 데이터베이스를 유지관리해야 합니다.예를 들어 주문부터 배송 날짜까지 프로젝트의 다양한 이정표에 대해 5개 이상의 서로 다른 날짜 열을 갖도록 성장한(또는 버섯처럼 늘어나는) 프로젝트 테이블이 있습니다.거리 주소, 메일 주소 또는 웹 링크에 대한 열이 각각 포함된 여러 테이블도 있습니다.

구조를 정규화하고, 주소, 예정일 등의 테이블을 생성하고, 1:N 관계(고객별 주소, 프로젝트별 마감일 등)가 가능하도록 필요한 테이블을 만들고 싶습니다.

지금은 세부 테이블의 데이터 변경 사항을 처리하는 방법을 잘 모르겠습니다.예를 들어 고객 배송 주소가 변경되었다고 생각해 보세요.둘 이상의 레코드(아마도 둘 이상의 테이블에 있음)가 해당 레코드를 참조할 수 있기 때문에 주소 테이블의 데이터를 변경하는 것은 불가능합니다.다른 행에 관련 외래 키가 없으면 새 주소 레코드를 추가하면 이전 레코드가 고아가 될 수 있습니다.

나는 이 문제를 처리하기 위해 다음과 같은 방법을 생각해 보았습니다.

  • 새 세부 레코드를 추가하고 이전 세부 레코드를 삭제해야 하는지 여부를 마스터 테이블의 업데이트 트리거에서 확인합니다.이를 위해서는 세부 테이블과 관계가 있는 모든 테이블, 전체 테이블 또는 sproc에 대한 지식이 필요합니다.나는 이 이별의 상실을 좋아하지 않는다.또한 활성 트랜잭션에 더 많은 테이블이 포함됩니다.

  • 트리거가 이전 세부 레코드를 삭제하고 오류를 포착하도록 합니다.이건 정말 잘못된 것 같아요.

  • 고아 레코드를 사용하고 정기적인 유지 관리 작업을 통해 모든 세부 테이블을 정리합니다.

여러 마스터 테이블에 연결된 세부 테이블의 데이터 변경을 처리하는 데 선호되는 방법은 무엇입니까?이에 대한 정보를 읽어볼 수 있는 팁이 있나요?

도움이 되었습니까?

해결책

문제의 일부는 원래 스키마 디자인일 수 있습니다.외래 키는 주소, 전화번호 등을 처리하여 잘못된 방향을 가리킵니다.세부 사항 대신 마스터로.이는 특정 주소의 모든 사용을 한 번에 업데이트하려는 경우 편리할 수 있지만 내 경험에 따르면 항상 어려운 예외 사례가 너무 많이 발생합니다. 예를 들어 한 위치에 있는 한 사람이 이동하여 링크를 끊어야 하는 경우와 전체 링크를 끊어야 하는 경우가 있습니다. 가구 또는 사무실 이사를 위해 기존 기록을 업데이트합니다.CRUD 화면에서 사용자에게 이 세부 정보를 숨기려고 하면 원하는 대로 작동하지 않는 상황이 발생하게 됩니다.

중복된 값을 축소하기 위해 그런 식으로 수행했다면 사실상 데이터베이스가 비정규화되는 것입니다.단순히 주소 행의 존재 자체는 의미가 없습니다.유일한 차이점은 대부분의 비정규화와 달리 속도 대신 공간 효율성을 얻으려고 한다는 것입니다.그 시점에 링크 테이블을 생성하는 것은 문제를 더욱 복잡하게 만들 뿐입니다.

예를 들어 연락처당 여러 개의 주소를 원하는 경우 주소를 상위 연락처를 다시 가리키는 외래 키가 있는 세부 테이블로 만들고 중복된 주소 값에 대해 걱정하지 마세요. 그것들은 단지 가치일 뿐이야.그렇지 않으면 주소를 실제 엔터티로 만듭니다.제목이나 설명 필드와 CRUD 화면을 추가하여 독립된 엔터티로 사용할 수 있습니다.

다른 팁

고아 레코드와 함께 살고 정기적 인 유지 보수 작업이 모든 세부 테이블을 정리하십시오.

삭제 및 업데이트 케이스를 흐리게하고 있다고 생각합니다.

클라이언트 A와 클라이언트 B가 있고 둘 다 동일한 주소를 사용하는 경우 관계형 테이블의 레코드에 의해 반영됩니다 (ClientAddresses, 여러 엔티티에 대한 주소를 저장하는 경우 더 복잡 할 것이라고 확신합니다. 저것)

두 클라이언트가 공유하고 주소를 공유하고 클라이언트 A에 부정확 한 경우 클라이언트 B에도 부정확 할 것입니다 (즉, 데이터 입력 오류). 기본 주소 정보, 협회 레코드를 제거하고 (ClientAddresses에서 삭제) 새 주소를 추가하십시오. 관계형 테이블에서 삭제를 수행 할 때 (아마도 저장된 프로 시저에서) 삭제를 수행 할 때 기본 테이블에서 삭제되지 않은 경우 주소 레코드를 분리하는 주소 레코드를 참조하는 다른 레코드가 있는지 확인하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top