관계형 데이터베이스의 조회 테이블에 대한 모범 사례는 무엇입니까?


14

조회 테이블 (또는 일부 사람들이 호출하는 코드 테이블 )은 일반적으로 특정 열에 제공 할 수있는 가능한 값의 모음입니다.

예를 들어, party두 개의 열이있는 (정당에 대한 정보를 저장하기 위한) 룩업 테이블이 있다고 가정 하십시오.

  • party_code_idn시스템 생성 숫자 값을 보유하며 ( 비즈니스 도메인 의미 가 부족함 ) 실제 키에 대한 대리 역할을합니다.
  • party_code비즈니스 도메인 내포 가있는 값을 유지하므로 테이블의 실제 또는 "자연"키입니다 .

이러한 테이블에는 다음과 같은 데이터가 유지된다고 가정하겠습니다.

 +----------------+------------+
 | party_code_idn | party_code |
 +----------------+------------+
 |              1 | Republican |
 |              2 | Democratic |
 +----------------+------------+

party_code값 "공화당"와 "민주당", 테이블의 실제 키 인 고유 한 제약 조건으로 설정되어 있지만, I는 임의로 추가 유지 열 party_code_idn및 비록 테이블 (의 PK로 정의 논리적 말하기 , party_code기본 키 [PK]로 작동 할 수 있습니다).

질문

트랜잭션 테이블 에서 조회 값 을 가리 키기위한 최상의 방법은 무엇입니까 ? FOREIGN KEY (FK) 참조를 (a) 자연스럽고 의미있는 값으로 직접 또는 (b) 대리 값으로 참조 를 설정해야합니까?

옵션 (a)는 , 예를 들어,

 +---------------+------------+---------+
 | candidate_idn | party_code |  city   |
 +---------------+------------+---------+
 |             1 | Democratic | Alaska  |
 |             2 | Republican | Memphis |
 +---------------+------------+---------+

다음과 같은 속성이 있습니다 1 :

  1. 최종 사용자가 읽을 수 있음 (+)
  2. 여러 시스템에서 쉽게 가져 오기 / 내보내기 (+)
  3. 모든 참조 테이블에서 수정이 필요하므로 값을 변경하기 어려움 (-)
  4. 새로운 가치를 추가하는 데 많은 비용이 들지 않습니다 (=)

응용 프로그램 프로그래밍 전문 용어의 함수 호출 에서 유추 하는 것은 거의 " 값으로 전달 "과 비슷하다고 생각합니다 .

예를 들어, 옵션 (b)

 +---------------+----------------+---------+
 | candidate_idn | party_code_idn |  city   |
 +---------------+----------------+---------+
 |             1 |              1 | Alaska  |
 |             2 |              2 | Memphis |
 +---------------+----------------+---------+

아래 속성이 있습니다.

  1. 최종 사용자가 읽을 수 없음 (-)
  2. 역 참조해야하므로 가져 오기-내보내기 어려움 (-)
  3. 트랜잭션 테이블 에만 참조를 저장하기 때문에 값을 쉽게 변경할 수 있습니다 (+)
  4. 새로운 가치를 추가하는 데 많은 비용이 들지 않습니다 (=)

앱 프로그래밍 용어에서 함수 호출 과 비교하는 경우“ 참조로 전달 ”과 매우 유사합니다 .

가져 오기-내보내기조회 테이블을 다시 채우고 서로 게이트 열 을 다시 시드 하는 것과 같은 다른 방식으로 수행 될 수도 있습니다 . 나는 이것이 올바르게되고 있기를 바랍니다. 이것은 내가 방금 들었던 것입니다.

1. 참고 +, -=이러한 속성의 혜택을 나타냅니다.

질문

아주 중요한 점 : 후자의 접근 방식을 사용하려는 경우 룩업 (또는 코드 ) 테이블과 FK 참조 간에 차이가 있습니까? 나는 그들이 똑같이 작동한다고 생각합니다.

관련 자료

답변:


10

하여 IDN, 나는 그것을 가지고 당신은 의미 IDENTITY, SEQUENCE또는 AUTO_INCREMENT필드를? 여기여기를 살펴 봐야 합니다 .

그림 10 아래 첫 번째 참조의 섹션 5 (데이터 값을 데이터 요소로 잘못 사용)

물론 영업 사원을위한 별도의 테이블을 보유한 다음 외래 키를 사용하여 참조 할 수 있으며, 위에 표시된 sales_person_id와 같은 간단한 대리 키를 사용하는 것이 좋습니다.

따라서이 전문가는 대리 키를 "지연"해야한다고 생각합니다. 실제로는 기본 SQL 기술이므로 일상적인 SQL에서 문제를 일으키지 않아야합니다. 그림 10에 오류가있는 것 같습니다. SalesData의 sales_person은 텍스트가 아닌 대리 키 (예 : 숫자) 여야합니다. 위의 인용문에서 이것을 추론하고 있습니다.

모든 비용을 피해야하는 것은 (1) 공통 조회 테이블에 요약 된 오류를 저지르는 유혹 (초보 데이터베이스 프로그래머에게는 매우 흔함)입니다. 이것을 일반적으로 Joe Celko ( 혹은 OTLT-One True Lookup Table 이라고도 함)로 알려진 MUCK ( Massly Unified Code Key ) 접근 방식 (우연히-: 아님) 이라고하며 모든 종류의 어려움을 초래합니다. 초보자 프로그래머는 단일 코드 / 조회 / 테이블이 더 깨끗하고 사실과 거리가 멀 때 더 효율적이라고 생각하는 것 같습니다.

위의 두 번째 참조에서 :

정규화는 중복 데이터를 제거하여 데이터 무결성을 강화하는 작업을 훨씬 간단하게 만들지 만 MUCK을 만드는 프로세스는 완전히 다른 것입니다 .MUCK는 중복 데이터를 제거하지 않고 중복 테이블로 인식되는 것을 제거하지만 내가 설명 하듯이, 적은 수의 테이블은 단순성과 동일하지 않습니다.

여기서 다루는 관련 EAV ( Entity Attribute Value ) 패러다임을 살펴볼 수도 있습니다 .


IDN은 자동 생성 외래 키를 의미했습니다. Common Lookup Tables를 사용하지 않습니다. 어떻게 생각했는지 잘 모르겠습니까? 우리는 실제로 수백 개의 코드 테이블처럼 사용합니다. 통일 된 테이블에서 누군가 그렇게하는 것이 정말 이상해 보입니다. 그러나 그러한 패턴을 아는 것이 좋으며 피해야합니다. EAV는 흥미로워 보인다. 따라서 합의는 IDN 즉 대리 키를 사용하여 역 참조해야한다는 것입니다.
Nishant

1
"역 참조"전략은 확실히 대다수의 접근 방식 인 것으로 보인다. 조금 실험 해보고 어떻게 진행하는지 보시겠습니까? 자연스러운 키를 선택하고 SQL이 어떻게 작동하는지 확인한 다음 대리자를 지정하고 잠시 동안 키를 엉망으로 만듭니다. Celko와 Pascal은 SQL / 관계형 세계에서 존경을받을 것이지만, 사람들은 그들의 접근 방식이 너무 교리적이고 순수 주의적이며 "실제"시스템은 서로 게이트 키를 사용해야한다고 주장하는 사람들을 보았습니다. 자연 키가 세 개의 필드이고 FOREIGN KEY다른 테이블에있는 경우 YMMV이지만 상당히 지저분해질 수 있습니다.
Vérace

그래, 나는이 순수 주의적 사고를했고 ppl이 대리 키를 사용하는 이유와 같았습니다! 그리고 일부 유스 케이스는 순수주의 세계에서 다루기가 정말 어려워 보였습니다. 가져 오기 및 내보내기의 단점이 있지만 대리 방식이 더 쉽다고 생각했습니다. 실제로 조합 시나리오는 까다로울 수 있습니다. 대리 시나리오에서 Btw 코드 테이블이 외래 키와 크게 다르지 않습니까? 논리적 차이는 존재하지만 외래 키 외에는 아무것도 없습니다.
Nishant

1
UNIQUE CONSTRAINTs 및 NOT NULLs 를 통해 자연 키를 적용 할 수 있습니다. 코드 테이블 항목은 FOREIGN KEY해당 테이블을 사용 / 참조하는 테이블에 있으므로 개념이 관련되어 있지만 동일하지는 않습니다. 코드 테이블의 서로 게이트 키는 "자식"테이블에 나타나는 필드입니다. 확실히 읽을 수 INT는 없지만 공간이 많지 않기 때문에 서로 게이트 키의 이점이 있습니다.
Vérace

10

두 가지 옵션의 장점 중 일부는 코드 테이블에 실제 코드를 넣는 세 번째 방법이 있습니다. 이를 통해 전체 가치의 본질을 포착하고 고유 한 짧은 문자 시퀀스를 의미합니다. 주어진 예에서 그것은

Idn: 1
Name: Democrats
Code: D      (or DEM)

코드는 외래 키로 트랜잭션 테이블에 전달됩니다. "실제"데이터와는 짧고 이해하기 쉽고 다소 독립적입니다. 이름 을 증분 변경해도 코드가 변경되지는 않습니다. 그러나 공화당이 대량으로 야영 하는 경우, 대리 ID가 발생하지 않는 수반 문제와 함께 코드 변경이 필요할 수 있습니다.

이 스타일을 약어 인코딩이라고합니다. Celko의 글을 추천 할 수 있습니다. Google 도서에는 몇 가지 예가 있습니다. "Celko 인코딩"을 검색하십시오.

다른 예 : 국가의 경우 2 ~ 3 자 인코딩, 통화 코드의 경우 3 자 인코딩 (GBP, USD, EUR). 짧고 스스로 설명하며 변경되지 않습니다 (그리고 ISO가 있습니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.