문제

배경

이 테이블이 있어요

+-------------------------+  +------------------------+
|Airport                  |  |Country                 |
|-------------------------|  |------------------------|
|airport_code string (PK) |  |country_code string (PK)|
|address string           |  |name string             |
|name  string             |  +------------------------+
+-------------------------+

+-------------------------+
|Currency                 |
|-------------------------|
|currency_code string (PK)|
|name string              |
+-------------------------+

공항_코드IATA(국제항공운송협회) 공항 코드, 비행기로 여행할 때 수하물 태그에서 볼 수 있습니다.

enter image description here

국가 코드ISO 3166-1 A3 표준 국가 코드, 올림픽에서 볼 수 있습니다.

enter image description here

통화 코드IS0 417 표준 3자 통화 코드, 국제환전안내판에서 보실 수 있습니다.

enter image description here

질문

이러한 천연 PK가 충분히 좋은가요?

전체 산업에서 인정되는 세계적으로 인정받는 표준을 사용하는 것이 PK에 충분합니까?

이 테이블에는 무슨 일이 있어도 대리자가 필요합니까?

도움이 되었습니까?

해결책

아니오, 그렇지 않습니다.그 열쇠는 확실히 충분히 좋습니다!

그들은 고유 한 가 아니라 거의 변경되지 않고 의미있는 을 이며, 이는 대리 키를 통해 단계적입니다.그것은 꽤 좋은 pk의 정의입니다.

변호 불가능한 PKS에 대한 제한 사항은 관계형 모델 (Codd 's)의 일부가 아닙니다.모든 SQL 표준 (ANSI 또는 기타).

다른 팁

나는 이 매우 강력한 단어이며, 엄격한 의미에서 테이블은 아마도 대리 키 가 필요하지 않습니다.

그러나 내 데이터베이스 인 경우 어쨌든 대리 키를 추가 할 것입니다. 나는 그들의 표준이 얼마나 안정적인 지에 관계없이 제 3 자의 무리 (IATA, ISO)의 무리에 의존하기를 원할 것입니다. 또는 나는 특정 표준에 의존하고 싶지 않을 수 있습니다 (다른 통화 코드 표준은 무엇입니까? 나는 모른다). 나는 아마도 대리 키와 같은 테이블을 모델로 모델링 할 것입니다 :

+-------------------------+  +------------------------+
|Airport                  |  |Country                 |
|-------------------------|  |------------------------|
|airport_id       int (PK)|  |country_id     int (PK) |
|iata_airport_code string |  |iso_country_code string |
|icao_airport_code string |  +------------------------+
|faa_identifier    string |  
|address           string |  
|name              string |  
+-------------------------+

+-------------------------+
|Currency                 |
|-------------------------|
|currency_id int (PK)     |
|iso_currency_code string |
|name string              |
+-------------------------+
.

다른 말로하면, 이러한 업계 표준 코드가 본질적으로 중요하게 중요한 경우, 내 신청서에 본질적으로 중요한 을 제외하고는 테이블의 PK로 사용하지 않을 것입니다. 그들은 단지 라벨입니다. 대부분의 다른 테이블은 어쨌든 대리 키가있을 것입니다.이 설정은 데이터 모델에 일관성을 추가합니다. '추가'의 비용 대리 키가 최소화됩니다.

에 기반한 업데이트

예제 테이블의 컨텍스트를 알지 못하면 IATA 공항 코드가 데이터베이스를 사용하여 응용 프로그램에 얼마나 중요한지 알 수 없습니다. 분명히 IATA 코드가 응용 프로그램 전체에서 보시고 사용되도록 중앙에서 중요하게 사용되면 적절한 분석 후 테이블의 PK로 코드를 사용하는 것이 올바른 결정 일 수 있습니다.

그러나 테이블이 앱의 몇 가지 모서리에서 사용되는 조회 테이블 일 경우 IATA 코드의 상대적으로 중요성은 데이터베이스 인프라에서 이러한 눈에 띄는 지점을 정당화하지 못할 수 있습니다. 물론, 여기에 몇 가지 질문에 추가 조인을해야 할 수도 있지만 IATA 코드를 만드는 것의 의미를 완전히 이해하도록 완전히 이해하기 위해 연구를 수행하는 데 필요한 노력과 비교하여 사소한 노력이 될 수 있습니다. 기본 키 필드. 경우에 따라 나는 상관하지 않아도됩니다. 그러나 IATA 코드에 대해 을 조심해야합니다. @james snell의 댓글은 내 테이블의 PK에 영향을 미치는 것에 대해 걱정할 필요가없는 것의 완벽한 예입니다.

또한 설계의 일관성이 중요합니다. 수십 개의 테이블이있는 데이터베이스가있는 경우 모두가 일관되게 설계된 대리 키를 가져온 다음 3 번째 파티 코드를 PK로 사용하는 몇 가지 조회 테이블을 사용하여 불일치를 소개합니다. 그것은 완전히 나쁘지는 않지만 문서에서 추가주의가 필요하며 보증되지 않을 수도 있습니다. 그들은 조회 테이블 선량을 위해, 일관성을 위해 대리 키를 사용하는 것은 완벽하게 괜찮습니다.

추가 연구를 기반으로 한 업데이트 :

OK, 호기심 비트 나와 나는 질문에 제공된 링크로 시작하여 IATA 공항 코드에 대한 연구를하기로 결정했습니다.

밖으로 나올 때 IATA 코드는 질문이 그들을 나가는 것만 큼 보편적이고 권위있는 것이 아닙니다. 이 페이지 :

대부분의 국가는 4 자 인 Href="http:///en.wikipedia.org/wiki/international_civil_aviation_organization_airport_code" relinch"nofollow"> ICAO 코드 가 아니라 IATA 코드가 아닙니다. 공식 항공 발행물.

IATA 코드 및 ICAO 코드는 FAA 식별자 코드 와 구별됩니다. 비행장을 식별하는 또 다른 방법입니다.

이들을 가져 오는 것은 어떤 코드가 더 좋거나 보편적이거나 권위있는 또는 더 포괄적 인 것에 대한 논쟁을 시작하지는 않지만 임의의 제 3 자 식별자 주위에 데이터베이스 구조를 디자인하는 이유를 정확히 보여주기 위해서는 내가 할 것도 없을 것입니다. 그렇게 할 특정 비즈니스 이유가 없으면 을 선택하십시오. .

이 경우, i 느낌이 내 데이터베이스가 기본 키 후보로 IATA 코드 (또는 잠재적으로 변경 가능한 코드)를 획득하여 더 나은 구조화되고 안정적이며 유연합니다. 대리 키를 사용하십시오. 그렇게함으로써 기본 키 선택으로 인해자를 수있는 잠재적 인 함정을 조정할 수 있습니다.

필드에 대리 키를 갖는 것은 문제가 없으며 고려해야 할 사항은 인덱스 페이지 크기 자체일 수 있습니다.

이것은 관계형 데이터베이스이기 때문에 많은 조인을 수행하게 되며 숫자 유형의 대리 키를 사용하면 데이터베이스에서 처리하기가 더 쉬워질 수 있습니다.인덱스 페이지 크기가 더 작아서 검색 속도가 더 빨라집니다.이것이 작은 프로젝트라면 문제가 되지 않으며 아무런 문제 없이 지나갈 수 있습니다. 그러나 응용 프로그램이 커질수록 병목 현상을 줄이고 싶어질 것입니다.

BIGINT, INT, SMALLINT, TINYINT 또는 정수와 유사한 데이터 유형을 사용하면 향후 문제를 줄일 수 있습니다.

그냥 내 2센트

업데이트:

소규모 프로젝트 - 소수, 어쩌면 수십 명이 사용합니다.소규모, 데모 프로젝트, 개인용 프로젝트, 경험 없이도 기술을 선보일 때 포트폴리오에 추가할 프로젝트 등.

대규모 프로젝트 - 매일 수천, 수만, 수백만 명의 사용자가 사용합니다.대규모 사용자 기반을 갖춘 국내/국제 회사를 위해 구축할 수 있는 것입니다.

일반적으로 레코드 중 선택된 소수의 레코드가 자주 선택되고 서버는 빠른 액세스를 위해 결과를 캐시하지만 때때로 덜 사용되는 일부 레코드에 액세스해야 하는 경우 서버가 인덱스에 들어가야 합니다. 페이지.(공항 이름이 포함된 위의 예에서 사람들은 치차고 -> 로스앤젤레스 등 국내선을 자주 이용하지만 보스턴 -> 짐바브웨에서 항공편을 이용하는 사람들은 얼마나 자주 나타남)

VARCHAR을 사용하면 데이터의 길이가 항상 같은 경우(CHAR 값이 더 효과적인 경우)를 제외하고 간격이 균일하지 않음을 의미합니다.이로 인해 인덱스 검색 속도가 느려지고 서버가 이미 초당 수천 개의 쿼리를 처리하느라 바쁘기 때문에 이제는 균일하지 않은 인덱스를 통과하는 데 시간을 낭비해야 하며 조인에서 동일한 작업을 다시 수행해야 합니다. 최적화되지 않은 테이블에서 일반 선택을 수행하는 경우 데이터 검색 속도를 높이기 위해 가능한 한 적은 수의 조인이 있는 DW를 예로 들어 보겠습니다.또한 데이터베이스 엔진을 망칠 수 있는 UTF를 사용하는 경우에도 마찬가지입니다(몇 가지 경우를 본 적이 있습니다).

개인적으로 내 경험에 따르면 적절하게 구성된 인덱스는 조인 속도를 최대 70%까지 높일 수 있으며, 정수 열에 대한 조인을 수행하면 최대 약 25%까지 조인 속도를 높일 수 있습니다(데이터에 따라 다름). .기본 테이블이 커지기 시작하고 이러한 테이블이 사용됨에 따라 더 많은 공간을 차지하는 VARCHAR/CHAR 필드를 갖는 것보다 정수 데이터 유형이 몇 바이트의 열을 차지하는 것을 선호합니다.이는 디스크 공간 절약, 성능 향상 및 관계형 데이터베이스의 전체 구조로 귀결됩니다.

또한 James Snell은 다음과 같이 언급했습니다.

기본 키도 변경할 수 없어야 하며 IATA 공항 코드는 절대 변경할 수 없습니다.IATA의 변덕에 따라 변경될 수 있습니다.

따라서 이 점을 고려하면, 조인하는 테이블의 모든 레코드와 함께 해당 레코드 하나를 업데이트해야 하는 것보다 숫자에 바인딩된 레코드 1개를 업데이트해야 합니까?

"The The The Time The Time"접근법을 사용하면 이러한 유형의 관심사를 우회하게됩니다. 그것은 당신의 데이터를 몇 가지 생각하는 것이 중요하기 때문에 좋은 일이 아닐 수도 있지만, 확실히 많은 시간, 추귀 및 노력을 절약 할 수 있습니다. 누군가 가이 규칙에 대한 수락을 채택해야한다면, 나열된 예는 변경을하기 위해 근거리 "의회의"근처의 "의회"가 필요하기 때문에 확실히 자격을 얻습니다.

이 자연 키가있는 데이터베이스의 데이터베이스의 쿼리는 확실히 도움이됩니다. 조회 테이블을 포함하여 똑같은 작업을 수행하는 뷰를 작성하면됩니다. 현대 데이터베이스는이 유형의 재료로 훨씬 더 나은 작업을 수행 할 수 있습니다.

표준이 크게 바뀌었던 미국에 특정한 경우가 있습니다. 우편 번호는 5 - 9 자리 숫자로 확장되고 일관된 2 글자로의 약어로 확장되고 기간을 제거하십시오 (일리노이 아프 때가 아프면 기억하십시오.), 그리고 대부분의 세계는 Y2K를 다루어야합니다. 데이터가 수십억 개의 기록을 포함하는 전 세계에 데이터가 확산 된 실시간 앱이 있으면 계단식 업데이트가 최선의 아이디어가 아니지만 그러한 도전에 직면 한 장소에서 모두 작동하지 않아야합니까? 그 데이터 집합을 사용하면 직접 테스트 할 수 있으며 더욱 어려움을 겪을 수 있습니다.

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