이러한 특정 테이블에 서로 게이트 키가 필요합니까?


13

배경

이 테이블이 있습니다

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

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

airport_codeIATA (International Air Transport Association) 공항 코드 이며 비행기로 여행 할 때 수하물 태그에서 확인할 수 있습니다.

여기에 이미지 설명을 입력하십시오

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

여기에 이미지 설명을 입력하십시오

currency_codeIS0 417 표준 3 문자 통화 코드 이며 국제 통화 표시 보드에서 볼 수 있습니다.

여기에 이미지 설명을 입력하십시오

질문

이 자연 PK는 충분합니까?

PK에 충분한 산업 전체가 인정하는 세계적 표준을 사용하고 있습니까?

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

답변:


15

아닙니다. 그 열쇠는 확실히 충분합니다!

그것들은 독특하고, 거의 변경 되지 않으며 의미가 있습니다 . 이는 대리 키를 넘어서는 단계입니다. 그것은 좋은 PK의 정의와 거의 같습니다.

변경 불가능한 PK 및 숫자 정수에 대한 제한 사항은 관계형 모델 (Codd 's) 또는 SQL 표준 (ANSI 또는 기타)의 일부가 아닙니다 .


3
기본 키도 변경할 수 없어야합니다. IATA 공항 코드는 확실하지 않습니다. IATA의 변덕에 따라 변경 될 수 있습니다.
James Snell

3
@JamesSnell-IATA 공항 코드는 국가 코드만큼 불변입니다. 그렇다면 10 년에 한 번씩 변화 에 대해 이야기하고 있습니다 . 문제에 대한 논의는 여기 를 참조 하십시오 . 변경하기가 너무 어렵 기 때문에 아직 구식 코드가 많이 있습니다. 또한 이것이 CASCADE 업데이트의 목적입니다. 변경 가능한 기본 키는 좋은 습관이 아니라면 합법적입니다.
Bobson

2
@EricKing이 제 3자는 많은 산업의 모든 주요 정당의 대표로 구성되며, 수년간 표준을 논의한 후 합리적인 합의에 도달 할 때까지 투표합니다. 또한 변경 또는 새로 추가되는 메커니즘에 동의합니다. 그 외에도, 코드 목록 표준은 변덕스럽지 않고 생성되었지만, 전 세계적으로 상호 운용되고 전 세계적으로 올바르게 통신하기 위해서는 제어되고, 존중되고, 합의 된, 코드 목록을 작성해야 할 필요성이 존재하기 때문입니다.
Tulains Córdova

2
@ user61852-이 표준이 기본 키로 만들어 졌다고 말할 수 있습니다.
Bobson

3
@Bobson : "변경하기에 너무 많은 문제로 인해 여전히 오래된 코드가 많이 있습니다"-> 기본 키일 가능성이 있습니까?
Maciej

2

나는 필요 가 매우 강한 단어 라고 생각 하며, 엄밀히 말하면 테이블에는 대리 키 가 필요 하지 않을 것입니다 .

그러나 그것이 내 데이터베이스라면 어쨌든 대리 키를 추가 할 것입니다. 표준이 얼마나 안정적인지에 관계없이 데이터베이스 설계가 여러 타사 (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에 영향을 줄 염려가 필요없는 완벽한 예입니다.

또한 디자인의 일관성이 중요합니다. 대리 키를 일관되게 설계 한 수십 개의 테이블이있는 데이터베이스와 타사 코드를 PK로 사용하는 몇 개의 조회 테이블이 있으면 불일치가 발생합니다. 그것은 완전히 나쁘지는 않지만 문서화에 대해서는 특별한주의가 필요하며 보증되지 않을 수도 있습니다. 그들은있는 거 룩업 테이블 선 (善)을 위해서, 그냥 일관성을 위해 대용 키를 사용하여 완벽하게 괜찮습니다.

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

좋아, 호기심이 나를 물었고 나는 질문에 제공된 링크로 시작하여 재미를 위해 IATA 공항 코드에 대한 조사를하기로 결정했습니다.

결과적으로, IATA 코드는 질문 에서처럼 보편적이고 권위적이지 않습니다. 이 페이지 에 따르면 :

대부분의 국가 는 공식 항공 출판물에서 IATA 코드가 아닌 4 자 ICAO 코드를 사용 합니다.

또한 IATA 코드 및 ICAO 코드는 비행장을 식별하는 또 다른 방법 인 FAA 식별자 코드 와 다릅니다 .

이 문제를 제기하는 데있어 요점은 어떤 코드가 더 우수하거나 더 보편적이거나 더 권위 있고 포괄적인지에 대한 토론을 시작하는 것이 아니라 임의의 타사 식별자를 중심으로 데이터베이스 구조를 디자인하는 것이 내가 선택한 것이 아닌 이유를 정확하게 보여주는 것입니다 , 거기 않는 한 특정 비즈니스 이유는 그렇게 할 수 있습니다 .

이 경우, 기분이 내 데이터베이스가 기본 키 후보로 IATA 코드 (또는 제 3 자, 잠재적으로 변경 코드)를 삼가고 및 대리 키를 사용하여 더 나은, 더 안정을 구조화하고, 더 유연 할 것입니다. 이렇게하면 기본 키 선택으로 인해 발생할 수있는 잠재적 인 함정을 잊을 수 있습니다.


1
따라서 IATA 표준은 항공사에 충분하지만 귀하에게는 적합하지 않습니까?
Tulains Córdova

1
물론 런던 히드로에서 수하물을 찾고 싶을 때 공항 테이블까지 연결해야합니다 select * from baggage where airport_code = 'LHR'. 데이터베이스는 응용 프로그램을 사용할 수 있기 때문에 매우 좁고 독점적입니다. 특히 비즈니스 소유자가 데이터베이스 비용을 지불 한 소유자 인 경우 접근 방식입니다. 또한 PK 충돌을 피하기 위해 한 데이터베이스에서 다른 데이터베이스로 데이터를 가져 오는 것과 같은 일상적인 작업을 수행하는 코드를 작성해야합니다.
Tulains Córdova

1
IATA 코드는 변경할 수 없으므로 PK 후보로 간주 될 수 없습니다. 예 : 코드 IDL은 JFK로 이름이 변경 될 때까지 뉴욕에있었습니다. IDL 코드는 현재 미시시피에 있습니다.
James Snell

2
@EricKing IATA 및 ISO는 코드가 충분히 안정적이고 고유하며 보편적으로 받아 들여 지도록 관리합니다. 그것은 테이블을 디자인하는 사람의 관심과 많은 일치합니다.
Tulains Córdova

2
@ user61852-표준 코드이기 때문에 항공사 시스템에서 PK로 사용한다는 의미는 아닙니다 (여기에 더 많은 통찰력이 있습니까?). 이러한 대규모 규모의 계단식 업데이트는 매우 나쁜 생각처럼 보입니다.
JeffO

1

필드에 서로 게이트 키를 사용하는 것은 좋지만 인덱스 페이지 크기 자체가 고려할만한 문제는 없습니다.

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

BIGINT, INT, SMALLINT, TINYINT 또는 임의의 정수와 같은 데이터 유형을 사용하면 문제를 덜 수 있습니다.

내 2 센트 만

최신 정보:

소규모 프로젝트-몇 명, 심지어 수십 명의 사람들이 사용합니다. 소규모, 데모 프로젝트, 개인용 프로젝트, 경험없이 기술을 발표 할 때 포트폴리오에 추가 할 사항 등.

대규모 프로젝트-매일 수천, 수만, 수백만 명의 사용자가 사용합니다. 거대한 사용자 기반을 가진 국내 / 국제 회사를 위해 구축 할 무언가.

일반적으로 발생하는 일은 레코드가 자주 선택되는 것입니다. 서버는 빠른 액세스를 위해 결과를 캐시하지만 매번 덜 사용되는 레코드에 액세스해야합니다.이 시점에서 서버는 인덱스에 들어가야합니다. 페이지. (위의 공항 이름을 가진 예에서 사람들은 종종 국내 항공사를 타요. Chichago-> 로스 앤젤레스라고 말하지만, 사람들은 보스턴에서-> 짐바브웨에서 얼마나 자주 비행기를 타나요?)

VARCHAR을 사용하는 경우, 데이터가 항상 같은 길이가 아닌 한 (간격이 CHAR 값이 더 효과적인 경우) 간격이 균일하지 않음을 의미합니다. 이로 인해 인덱스 검색 속도가 느려지고 서버가 이미 초당 수천 및 수천 개의 쿼리를 처리하는 중이므로 불균일 인덱스를 통과하는 데 시간을 낭비하고 조인에서 동일한 작업을 다시 수행해야합니다. 최적화되지 않은 테이블에서 정기적으로 선택하는 경우 데이터 검색 속도를 높이기 위해 가능한 적은 조인이있는 경우 DW를 예로들 수 있습니다. 또한 데이터베이스 엔진을 망칠 수있는 UTF를 사용하는 경우도 있습니다 (일부 경우를 보았습니다).

개인적으로 내 경험에 따르면 제대로 구성된 인덱스는 조인 속도를 ~ 70 % 증가시킬 수 있으며 정수 열에 조인을 수행하면 데이터에 따라 ~ 25 % 정도 조인 속도를 높일 수 있습니다. . 기본 테이블이 커지기 시작하고 이러한 테이블이 사용되면 더 많은 공간을 차지하는 VARCHAR / CHAR 필드를 사용하는 것과 비교하여 몇 바이트의 열을 차지하는 정수 데이터 유형을 사용하는 것이 좋습니다. 디스크 공간 절약으로 관계형 데이터베이스의 성능과 전체 구조가 향상됩니다.

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

기본 키도 변경할 수 없어야합니다. IATA 공항 코드는 확실하지 않습니다. IATA의 변덕에 따라 변경 될 수 있습니다.

따라서이 점을 고려하면 하나의 레코드와 조인하는 테이블의 모든 레코드를 업데이트하는 대신 숫자에 바인딩 된 하나의 레코드를 업데이트해야합니다.


올바른 생각이지만 이러한 테이블의 요점은 각 테이블에 유한 한 수량의 레코드 만 있다는 것입니다. small project및로 코드 크기를 실제로 의미 한 경우 bigger그 이유가 무엇인지 명확하게 업데이트하십시오.
Bobson

1
변경 불가능한 PK 및 숫자 정수에 대한 제한 사항은 관계형 모델 (Codd 's) 또는 SQL 표준 (ANSI 또는 기타)의 일부가 아닙니다.
Tulains Córdova

4
고정 길이, 짧은 문자열 (ISO 코드와 같은)을 기반으로하는 인덱스 는 정수만큼 빠릅니다. 가변 길이를 기반으로하는 인덱스는 긴 문자열이 아닙니다.
Tulains Córdova

그것이 내가 말한 것입니다 (위의 VARCHAR 대 CHAR 부분 참조) 고정 길이 짧은 문자열 대 숫자 정수를 테스트 할 기회는 없었지만 변수 길이와 정수로 그렇게 할 수있는 기회가있었습니다
Toni Kostelac

2
참가 실적은 짚맨입니다. 종종 자연 키를 사용하면 처음에는 조인이 필요하지 않습니다.
마이크 셰릴 '고양이 리콜'

1

"항상 대리 키를 사용합니다"접근 방식을 사용하면 이러한 유형의 문제를 피할 수 있습니다. 데이터에 약간의 생각을하는 것이 중요하기 때문에 좋은 일이 아니지만 시간과 에너지와 노력을 많이 절약 할 수 있습니다. 이 규칙에 동의하는 사람이 있다면, 나열된 예제는 변경을 위해 거의 "의회 행위"가 필요하기 때문에 확실히 자격이 있습니다.

이러한 자연 키를 사용하는 데이터베이스의 임시 쿼리는 확실히 도움이됩니다. 찾아보기 테이블을 포함하여 동일한 작업을 수행하는보기를 작성하는 것만으로도 작동합니다. 현대의 데이터베이스는 아마도 이런 종류의 물건을 사용하는 것이 훨씬 중요합니다.

미국과 관련하여 표준이 크게 변경된 일부 사례가 있습니다. 세계는 Y2K를 다루어야합니다. 전 세계에 수십억 개의 레코드가 포함 된 데이터가 포함 된 실시간 앱을 사용하는 경우 계단식 업데이트가 최선의 아이디어는 아니지만 이러한 문제가 발생하는 곳에서 모두 일하지 않아야합니까? 해당 데이터 세트를 사용하면 직접 테스트하여 더 diffinitive 답변을 얻을 수 있습니다.


+1 좋은 답변입니다. 대부분의 경우 사람들은이 문제에 대해 매우 독단적입니다. 많은 데이터베이스 설계자들은 자아를 가지고 있으며 데이터베이스와 데이터의 소유자로 자신을 고려합니다. 다른 사람들은 데이터 소유자가 데이터를 이해할 수 없기 때문에 특정 응용 프로그램을 통해서만 사용할 수 있다는 것을 알았습니다. 또한 데이터 가져 오기 및 쿼리 작성과 같이 매일 수행되는 일을 생생하게 처리하면서 미래에 일어날 수도 있고 그렇지 않을 수도있는 것에 대한 프로비저닝을 선호합니다. 또한 그들의 견해를지지하는 모든 종류의 표준 서지 목록을 작성하지 못했습니다.
Tulains Córdova

그런데 "항상 대리 키를 사용합니다"규칙은 관계형 모델 (Codd 's)이나 SQL 표준에 없습니다. Oracle 데이터 사전 체계는 가능할 때마다 자연 키를 사용하고 다른 경우에는 인공 키를 사용합니다. PPDM ( ppdm.org )은 혼합 접근법을 권장하며 모델에서이를 사용합니다. ANSI SQL Standard는 모든 대리자에 대해 아무 말도하지 않습니다. 나는 모든 대리모와 자연이 부식성이라고 생각합니다. 자연스럽고 일부는 대리 관계 모델이 가르치는 것입니다.
Tulains Córdova
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.