외부 키를 사용하는 것이 좋습니까, 아니면 고유 ID를 할당하는 것이 좋습니까?
데이터베이스의 단순화된 모델은 예를 들어 다음과 같습니다.A
컬럼이 있습니다.a, b, c, d
(그래서(a, b, c, d)
는 프라이머리 키입니다).그럼 다른 테이블이 있어요B
목록과 같은 데이터를 저장하다A
, 첫 번째 정상 형태를 유지하기 위해.
이것.B
따라서 테이블에는 열이 있습니다.a, b, c, d, e
, 각 장소e
entry는 목록의 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 에는, 다음의 정보가 필요 없습니다.UNIQUE
index. (이 경우 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면SMALLINT
PK 복사본당 행당 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
'source' 카테고리의 다른 글
numpy reshape에서 -1은 무엇을 의미합니까? (0) | 2022.11.13 |
---|---|
Talend가 열을 타임스탬프로 구문 분석할 수 없습니다. (0) | 2022.11.13 |
유형이 x인 동일한 테이블에 엔트리가 포함된 유형이 y인 행을 모두 삭제하려면 어떻게 해야 합니까? (0) | 2022.11.13 |
PDO에서 준비한 문이 HAVING 절을 무시하는 것 같습니다. (0) | 2022.11.13 |
Python에서 "assert"의 용도는 무엇입니까? (0) | 2022.11.13 |