Transact Charlie가 제안한 대로 운영 테이블 을 정규화 하는 것은 좋은 생각이며 시간이 지남에 따라 많은 두통과 문제를 줄일 것입니다. 그러나 외부 시스템과의 통합을 지원하는 인터페이스 테이블 과 분석 같은 것을 지원하는 보고 테이블과 같은 것들이 있습니다. 처리; 그리고 이러한 유형의 테이블은 반드시 정규화 되어서는 안됩니다 . 실제로, 매우 자주 , 훨씬 편리하고 성능이 좋지 않습니다 .
이 경우 운영 테이블에 대한 Transact Charlie의 제안이 좋은 것 같습니다.
그러나 통합 (외부 소스에서 데이터로드)을 위해 CompetitorName에 대한 효율적인 조인을 지원하기 위해 Competitors 테이블의 CompetitorName에 인덱스 (고유 할 필요는 없음)를 추가하고 인터페이스 테이블을 혼합에 넣습니다. CompetitionResults.
CompetitionResults에는 경쟁 결과에 포함 된 모든 데이터가 포함되어야합니다. 이와 같은 인터페이스 테이블의 요점은 Excel 시트 또는 CSV 파일 또는 해당 데이터가있는 형식에서 가능한 한 빠르고 쉽게 잘라 내고 다시로드 할 수 있도록하는 것입니다.
해당 인터페이스 테이블은 정규화 된 운영 테이블 세트의 일부로 간주되지 않아야합니다. 그런 다음 Richard가 제안한대로 CompetitionResults에 참여하여 아직 존재하지 않는 경쟁 업체에 레코드를 삽입하고 그렇지 않은 경쟁 업체에 레코드를 업데이트 할 수 있습니다 (예 : 실제로 전화 번호 또는 이메일 주소와 같은 경쟁 업체에 대한 자세한 정보가있는 경우).
실제로 주목할 것은, 경쟁사 이름은 데이터에서 고유하지 않을 것 입니다. 예를 들어, 20 만 명의 경쟁 업체에서는 2 명 이상의 David Smith가있을 수 있습니다. 따라서 경쟁 업체의 전화 번호 나 이메일 주소 또는 고유 한 정보 등 더 많은 정보를 수집하는 것이 좋습니다.
운영 테이블 경쟁사에는 복합 자연 키에 기여하는 각 데이터 항목마다 하나의 열만 있어야합니다. 예를 들어 기본 이메일 주소에 대해 하나의 열이 있어야합니다. 그러나 인터페이스 테이블 에는 기본 전자 메일 주소에 대한 이전 값 과 새 값에 대한 슬롯이 있어야 기존 값을 사용하여 경쟁 업체에서 레코드를 조회하고 해당 부분을 새 값으로 업데이트 할 수 있습니다.
따라서 CompetitionResults에는 "old"및 "new"필드 (oldEmail, newEmail, oldPhone, newPhone 등)가 있어야합니다. 이렇게하면 CompetitorName, Email 및 Phone의 경쟁사에서 복합 키를 구성 할 수 있습니다.
그런 다음 일부 경쟁 결과가 나오면 Excel 시트 또는 보유한 모든 항목에서 CompetitionResults 테이블을 잘라 내고 다시로드하고 모든 새 경쟁자를 경쟁사 테이블에 삽입하기위한 효율적인 단일 삽입을 실행하고 업데이트 할 단일 효율적인 업데이트를 수행 할 수 있습니다 CompetitionResults에서 기존 경쟁사에 대한 모든 정보. 또한 단일 삽입을 수행하여 CompetitionCompetitors 테이블에 새 행을 삽입 할 수 있습니다. 이러한 작업은 CompetitionResults 테이블을로드 한 후 실행될 수있는 ProcessCompetitionResults 저장 프로 시저에서 수행 할 수 있습니다.
이것은 Oracle Applications, SAP, PeopleSoft 및 기타 엔터프라이즈 소프트웨어 제품군의 세탁 목록을 사용하여 실제 세계에서 반복해서 본 것에 대한 기본적인 설명입니다.
내가 할 줄 마지막 코멘트 내가 SO에 이전했습니다 하나입니다 : 당신이 외래 키를 만들 경우 CompetitionCompetitors에 거기에 그 경쟁자와 행을 추가하기 전에 경쟁자가 경쟁자 테이블에 존재하는 것을 보장가 있다는 것을 확인 외래 키는 계단식 업데이트 및 삭제로 설정되어 있습니다. 이렇게하면 경쟁 업체를 삭제해야 할 경우 경쟁 업체를 삭제할 수 있으며 해당 경쟁 업체와 관련된 모든 행이 자동으로 삭제됩니다. 그렇지 않으면 기본적으로 외래 키를 사용하면 경쟁자를 삭제하기 전에 CompetitionCompetitors에서 모든 관련 행을 삭제해야합니다.
(일부 사람들은 계단식이 아닌 외래 키가 좋은 안전 예방책이라고 생각하지만 내 경험은 단순히 감독의 결과가 아니라 종종 엉덩이로 인해 고통을 겪는다는 사실입니다. 사람들이 실수로 물건을 삭제하는 것을 다루기 때문에 "확실히"대화 상자와 다양한 유형의 정기적 백업 및 중복 데이터 소스와 같은 것이 있기 때문에 실제로 데이터가 모두있는 경쟁자를 삭제하는 것이 훨씬 더 일반적입니다. 예를 들어 실수로 하나를 삭제 한 다음 "아뇨! 그럴 생각은 없었습니다! 이제 경쟁 결과가 없습니다! Aaaahh!" 준비를해야하지만 전자가 훨씬 일반적입니다.전자를 준비하는 가장 쉽고 가장 좋은 방법은 외래 키를 계단식으로 업데이트하고 삭제하는 것입니다.)
NVARCHAR(64)
열 기본 (따라서 및 클러스터링) 키! 우선, 그것은 매우 넓은 키입니다-최대 128 바이트; 두 번째로 가변 크기입니다. 다시 : 최적이 아닙니다 ... 이것은 당신이 할 수있는 최악의 선택입니다-성능은 지옥이 될 것이고 테이블과 인덱스 조각화는 항상 99.9 %가 될 것입니다 .....