문제

최적의 솔루션이 무엇인지 궁금합니다.

정규화 된 데이터베이스가 있다고 가정 해 봅시다. 전체 시스템의 주요 키는 Varchar입니다. 내가 궁금한 점은이 바르 차를 정규화를 위해 int와 관련 시키거나 떠나야 하는가? Varchar로 떠나는 것이 더 간단하지만 더 최적 일 수 있습니다.

예를 들어 나는 가질 수 있습니다

People
======================
name      varchar(10)   
DoB       DateTime    
Height    int  

Phone_Number
======================
name      varchar(10)   
number    varchar(15)

아니면 가질 수 있습니다

People
======================
id        int Identity   
name      varchar(10)   
DoB       DateTime  
Height    int  

Phone_Number
======================
id        int   
number    varchar(15)  

물론 몇 가지 다른 일대일 관계를 추가하십시오.

모두 어떻게 생각하십니까? 어느 것이 더 낫고 그 이유는 무엇입니까?

도움이 되었습니까?

해결책

실제로 이름을 기본 키로 사용할 수 있습니까? 같은 이름을 가진 여러 사람의 위험이 높지 않습니까?

당신이 정말로 운이 좋으면 당신의 이름 속성을 기본 키로 사용할 수 있습니다. 그러나 종종 Customer_ID 등과 같이 무언가를 만들어야합니다.

그리고 마지막으로 : "이름"은 적어도 하나의 DBM으로 예약 된 단어이므로 전체 이름과 같은 다른 것을 사용하는 것을 고려하십시오.

다른 팁

중요한 크기의 실제 데이터베이스 응용 프로그램을 개발 한 대부분의 사람들은 대리 키가 유일한 현실적인 솔루션이라고 말할 것입니다.
나는 학계가 동의하지 않을 것이라는 것을 알고 있지만 이것이 이론적 순도와 실용성의 차이입니다.

일부 테이블이 복합 기본 키를 갖는 비유 로그 키를 사용하는 테이블 사이에 합리적인 크기의 쿼리가 합리적이지 않습니다.

PK로서 모든 종류의 비합성 데이터 (즉, 응용 프로그램에 의해 생성 된 것과 반대로)를 사용하는 것은 문제가된다. 문화/현지화 차이, 사례 민감도 (및 DB 콜레이션에 따라 다른 문제)에 대해 걱정해야합니다. 해당 사용자가 제공 한 데이터가 변경되는 경우/시기에 데이터 문제가 발생할 수 있습니다.

비 사용자 생성 데이터 (또는 순차 안내서 (또는 DB가 지원하지 않거나 페이지 분할을 신경 쓰지 않는 경우 비 순차적) 또는 ID (Guids가 필요하지 않은 경우)를 사용하면 훨씬 쉽고 ID가 훨씬 쉬우 며) 훨씬 더 안전합니다.

중복 데이터와 관련하여 : 비 합성 키를 사용하는 것이 어떻게 당신을 보호하는지 알 수 없습니다. 사용자가 "Bob K. Smith"또는 "Smith, Bob"또는 "Bob Smith"대신 "Bob Smith"를 입력하는 문제가 여전히 있습니다. 키가 합성인지 여부에 관계없이 복제 관리가 필요합니다. 또는 비합성 및 비 합성 키에는 합성 키가 깔끔하게 피할 수있는 다른 잠재적 인 문제가 많이 있습니다.

많은 프로젝트는 (예를 들어 엄격하게 제한된 협업 선택으로 인해 엄격하게 제한된 협업 선택이 이들을 피할 필요가 없지만) 걱정할 필요는 없지만 일반적으로 합성 키를 선호합니다. 이것은 유기농 키로 성공할 수 없다고 말하는 것이 아닙니다. 분명히 할 수 있지만 많은 프로젝트에서는 더 나은 선택이 아닙니다.

Varchar가 더 크면 데이터베이스 전체에 상당한 데이터를 복제하는 것을 알 수 있다고 생각합니다. 숫자 ID 열을 사용한 경우 다른 테이블에 외래 키 열을 추가 할 때 거의 동일한 양의 데이터를 복제하지 않습니다.

또한 텍스트 데이터는 비교 측면에서 왕의 고통입니다. 여기서 id = user_id ~ 대 입력 이름과 같은 이름입니다 (또는 비슷한 것).

"이름"필드가 실제로 기본 키로 적절한 경우 수행하십시오. 데이터베이스가 할 것입니다 ~ 아니다 이 경우 대리 키를 만들어보다 정규화하십시오. 외국 키에 대한 중복 문자열을 얻을 수 있지만 FK 제약은 대리 키에서와 마찬가지로 문자열의 무결성을 구하기 때문에 정규화 문제는 아닙니다.

그러나 당신은 "이름"이 무엇인지 설명하지 않습니다. 실제로 문자열이 기본 키로 적절한 것은 거의 거의 없습니다. 사람의 이름이라면 PK로 작동하지 않습니다. 한 사람 이상이 같은 이름을 가질 수 있기 때문에 사람들은 이름을 바꿀 수 있습니다.

다른 사람들이 언급하지 않은 것 중 하나는 int 필드의 결합이 Varchar 필드의 결합보다 더 잘 수행되는 경향이 있다는 것입니다.

그리고 나는 시간이 지남에 따라 독특하지 않기 때문에 (사람이나 비즈니스)의 이름을 사용하는 것보다 대리 키를 항상 사용할 것입니다. 예를 들어 데이터베이스에서는 같은 이름의 100 개가 넘는 인스턴스를 가진 164 개의 이름이 있습니다. 이것은 이름을 키 필드로 고려하는 것의 위험을 분명히 보여줍니다.

원래 질문은 정규화 중 하나가 아닙니다. 언급 한대로 정규화 된 데이터베이스가있는 경우 정규화 이유로 변경할 필요가 없습니다.

질문에는 실제로 두 가지 문제가 있습니다. 첫 번째는 int 또는 varchars가 기본 키 및 외래 키로 사용하기에 선호되는지 여부입니다. 두 번째는 문제 정의에 주어진 자연 키를 사용할 수 있는지 또는 자연 키를 대신하기 위해 합성 키 (대리 키)를 생성 해야하는지 여부입니다.

INT는 Varchars보다 조금 더 간결하며 인덱스 처리와 같은 것들에 대해 조금 더 효율적입니다. 그러나 그 차이는 압도적이지 않습니다. 당신은 아마도 이것만으로 당신의 결정을 내리지 않아야 할 것입니다.

제공된 자연 키가 실제로 자연 키로 작용하는지 여부에 대한 질문은 훨씬 더 중요합니다. "이름"열에서 복제 문제가 유일한 문제는 아닙니다. 사람이 그녀의 이름을 바꿀 때 어떤 일이 발생하는지에 대한 문제도 있습니다. 이 문제는 아마도 당신이 주신 예에서 표면적이지 않지만 다른 많은 데이터베이스 응용 프로그램에서 표면적입니다. 예를 들어, 학생이 수강 한 모든 과정의 4 년 동안의 성적표가 있습니다. 여자는 4 년 동안 결혼하고 그녀의 이름을 바꿀 수 있습니다. 이제 당신은 갇혀 있습니다.

당신은 이름을 변하지 않아야합니다.이 경우 더 이상 실제 세계에 동의하지 않거나 사람이 취한 모든 과정에서 소급 적으로 업데이트하지 않으므로 당시 인쇄 된 명단에 동의하지 않습니다.

합성 키를 결정하는 경우 이제 응용 프로그램이 사용자 커뮤니티에 합성 키의 가치를 공개할지 여부를 결정해야합니다. 그것은 벌레의 또 다른 캔 이며이 토론의 범위를 넘어서는 것입니다.

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