source

외부 키를 사용하는 것이 좋습니까, 아니면 고유 ID를 할당하는 것이 좋습니까?

manysource 2022. 11. 13. 19:34

외부 키를 사용하는 것이 좋습니까, 아니면 고유 ID를 할당하는 것이 좋습니까?

데이터베이스의 단순화된 모델은 예를 들어 다음과 같습니다.A컬럼이 있습니다.a, b, c, d(그래서(a, b, c, d)는 프라이머리 키입니다).그럼 다른 테이블이 있어요B목록과 같은 데이터를 저장하다A, 첫 번째 정상 형태를 유지하기 위해.

이것.B따라서 테이블에는 열이 있습니다.a, b, c, d, e, 각 장소eentry는 목록의 1개 요소입니다.외부 키의 제약이 있는 것은 당연합니다.(a, b, c, d)B모든 것이 존재해야 하는 진실성을 강요하는 것A그럼 먼저B.

하지만 외부 키 제약으로 인해 데이터베이스 엔진이 B의 데이터 스토리지를 압축하거나 복제하지 않도록 할 수 있는지 궁금합니다.(a, b, c, d)A에 있는 것과 동일한 문자 그대로 다시 저장됩니까?)[아니오(No)]의 경우 각 엔트리를 에 할당합니다.A이 경우 고유 ID를 선택하는 것이 더 나을까요?

대부분의 SQL 기반 데이터베이스 엔진에서는 외부 키 값을 적어도2회(참조 테이블과 부모 테이블)에 물리적으로 저장해야 합니다.큰 외부 키의 경우 그렇게 하지 않는 옵션이 있으면 좋겠습니다.많은 데이터베이스 설계자는 부분적으로 이러한 추가 오버헤드가 있기 때문에 큰 외부 키는 피하도록 선택할 수 있습니다.

대부분의 DBMS는 외부 키와 상관없이 데이터를 압축하는 옵션을 제공합니다.대부분의 경우, 이는 외부 키에 의한 데이터의 물리적 복제를 보완하는 데 그치지 않을 수 있습니다.

그러나 외부 키는 논리적 구성이며 데이터베이스 설계에서는 논리적 문제와 물리적 문제를 구분하는 것이 중요합니다.

테이블 스토리지:각 MySQL 테이블은 완전히 개별적으로 저장됩니다.경우에 따라서는 두 개의 테이블이 동일한 OS 파일에 저장될 수 있지만 블록(InnoDB의 경우 16KB)은 완전히 분리됩니다.따라서 (a,b,c,d)는 데이터셋의 적어도2개소(A에 1개, B에 1개)에 표시됩니다.

A는 추가 정보를 생성하는 부작용이 있습니다.INDEX는 아직 존재하지 않습니다.(이 경우 PK라고 했으므로 이미 인덱스입니다.)FK 에서는, FK 에는, 다음의 정보가 필요 없습니다.UNIQUEindex. (이 경우 PK는 고유하지만 관련이 없어 보입니다.)

2차 인덱스(대조)PRIMARY KEY테이블의 )는 키 열로 정렬된 별도의 BTree에 저장됩니다.따라서 (a,b,c,d)가 아직 색인화되지 않았다면, FK는 (a,b,c,d)의 추가 사본, 즉 2차 지수에 추가 사본으로 이어질 것이다.

InnoDB에는 한 가지 압축 형식이 있습니다. 테이블을 선언할 수 있습니다.ROW_FOMAT=COMPRESSED다만, 이것은 중복 배제(a, b, c, d)와는 관계가 없습니다.

PK에는 4개의 열이 많지만 괜찮습니다.4면SMALLINTPK 복사본당 행당 8바이트(및 오버헤드)에 불과합니다.한 무더기라면VARCHARs더 큰 부피가 될 수 있습니다.

PK로 의도적으로 대리인을 추가해야 할 때는 언제입니까?제 경험상, 3분의 1 정도밖에 안 됩니다. (다른 사람들은 주장할 것입니다.)보조 키나 이를 참조하는 FK가 없는 경우, 대용은 공간과 속도의 낭비입니다.보조 키 또는 FK가 1개뿐인 경우 필요한 공간은 거의 동일합니다.이 마지막 상황은 당신이 지금까지 설명한 것입니다.

테이블 크기:행이 1,000개일 경우 공간은 문제가 되지 않습니다.100만 줄의 행은 우주에 대해 더 심각하게 생각하게 할 수 있습니다.10억 행의 경우, '모든 멈춤을 당깁니다.'

PK 힌트:포함 안 함DATETIME또는TIMESTAMP, 언젠가 같은 초를 가진 두 개의 행이 필요할 것입니다.PK에 암묵적인 일의성 제약에 필요한 수보다 많은 열을 넣지 마십시오.그러면 해당 제약이 사실상 손실됩니다(예외도 있습니다).

언급URL : https://stackoverflow.com/questions/52712034/better-to-use-foreign-key-or-to-assign-unique-ids