공식문서&논문 - 데이터베이스

MySQL Glossary(Primary Key, Synthetic Key, Natural Key, Foreign Key, Foreign Key Constraint, DML)

깊게 생각하고 최선을 다하자 2022. 9. 26. 12:56

[아래 문서를 참고해서 번역했습니다. 오류나 잘못된 내용이 있으면 피드백 부탁드립니다.] 

https://dev.mysql.com/doc/refman/8.0/en/glossary.html

 

1) 주요 키(Primary Key)

- 테이블에서 모든 행을 유일하게 식별할 수 있는 여러 칼럼들의 셋(혹은 이러한 칼럼들의 셋에 기반한 인덱스)입니다. 

  그에 따라, 이것은 반드시 유일한 인덱스여야 하며, 어떠한 NULL 값도 가져서는 안됩니다. 

 

- InnoDB는 모든 테이블이 그러한 인덱스(즉, 클러스터 인덱스)를 갖고 있으며, 테이블의 스토리지를 주요 키의 칼럼 값으로 조직화합니다. 

 

- 주요 키 값을 선택할 때, 자연 키 보다는 임의의 값(즉, 합성 키)을 사용하는 것을 고려해야 합니다. 

 

2) 합성 키(synthetic key) 

- 인덱스화된 칼럼, 일반적으로 주요 키를 의미하며, 값들이 임의로 할당됩니다. 때때로 auto-increment 칼럼을 사용함으로써 달성됩니다. 값을 온전히 임의로 다룸으로 인해서, 지나치게 한정적인 룰과 잘못된 어플리케이션 가정을 피할 수 있습니다. 

 

- 예를 들어, 직원들의 숫자를 나타내는 숫자의 시퀀스는 직원이 채용되었지만, 실제로 합류하지 않는다면 차이가 발생할 수 있습니다. 혹은 100번 숫자의 직원이 회사를 떠났다가 다시 합류했다면, 500번 숫자의 직원보다 늦은 채용 날짜를 가질 수 있습니다. 

 숫자 값들은 또한 예측 가능한 길이의 짧은 값들을 생산합니다. 예를 들어, "Road", "Boulevard", "Expressway" 등을 의미하는 숫자 코드들을 저장하는 것은 그 값들을 문자열로 저장하는 것보다 더 효율적입니다. 

 

3) 자연 키(Natural Key) 

- 인덱스화된 칼럼, 일반적으로 주요 키를 의미하며, 값들이 실세계의 의미를 갖습니다. 일반적으로 권장되지 않는데,

  그 이유는 다음과 같습니다.

 

(1) 만약에 값에 변화가 필요하면, 클러스터 인덱스를 재정렬하고, 각각의 2차 인덱스에서 반복되는 주요 키의 복사본을  업데이트 하기 위해 많은 인덱스 유지가 필요합니다. 

(2) 안정적으로 보이는 값도 예측할 수 없는 방식으로 변할 수 있는데, 따라서 데이터베이스에서 정확하게 나타내기가 힘듭니다. 예를 들어, 하나의 나라가 두 개 혹은 여러 개로 바뀔 수 있는데, 이는 원래의 나라 코드를 쓸모없게 만듭니다. 혹은 유니크 값에 관한 룰들은 예외를 가질 수 있습니다. 예를 들어, 납세자의 ID가 한 사람에게 고유하게 할당되었지만, 데이터베이스가 "신원 도난"과 같은 상황에서 그 룰을 어기는 레코드들을 다뤄야할 수 있습니다. 납세자의 ID와 다른 민감한 ID 값들은 주요 키를 형편 없게 만드는데, 왜냐하면 그것들이 보호되고, 암호회되고, 아니면 다른 칼럼들과 다르게 다뤄져야 하기 때문입니다. 

 

- 따라서 일반적으로 합성 키를 구성하기 위해서 임의의 숫자 값을 활용하는 것이 낫습니다. 

  대표적인 예로는 auto-increment 칼럼이 있습니다. 

 

 

4) 외래 키(Foreign Key)

- 구분된 InnoDB 테이블의 행 간의 포인터 관계의 타입입니다. 외래 키 관계는 부모 테이블과 자식 테이블 양쪽의 한 칼럼에 정의되어 있습니다.  

  

- 연관된 정보간에 빠른 검색을 가능하게 하는 것에 덧붙여, 외래 키는 데이터가 삽입, 업데이트, 삭제 됨에 따라 해당 포인터를 무력화하게 만듦으로써 참조 무결성을 강화합니다. 이러한 강화 메커니즘은 제약의 한 가지  타입입니다. 만약 연관된 외래 키가 존재하지 않는다면, 다른 테이블을 가리키는 행은 삽입될 수 없습니다. 만약에 행이 삭제되거나 외래키 값이 변경되는 상황에서 다른 테이블의 행이 해당 외래 키를 가리킨다면,

1) 삭제를 방지하거나

2) 다른 테이블의 대응되는 칼럼 값이 null이 되거나

3) 자동적으로 다른 테이블에 대응되는 행을 삭제

할 수 있습니다. 

 

- 정규화된 데이터베이스를 디자인할 때는,

-> 중복된 데이터를 찾아내고, 해당 데이터를 새로운 테이블로 분리하고, 외래 키 관계를 셋업함으로써, Join 오퍼레이션을 사용 가능하도록 하는 단계를 거쳐야 합니다. 

 

 

5) 외래 키 제약 조건(Foreign Key Constraint)

- 외래 키 관계를 통해 데이터베이스의 일관성을 유지하기 위한 제약 조건입니다. 다른 종류의 제약들처럼, 이것은 데이터가 불일치한다면, 데이터가 삽입되거나 업데이트 되는 것을 막을 수 있습니다. 이러한 경우, 예방되는 불일치는 여러 테이블에 존재하는 데이터입니다. 

  

- 대안으로, 외래 키 생성 시 ON CASCADE 옵션을 부여하면, DML 동작이 수행될 때 외래 키 제약 조건에 따라 자식 테이블의 행이 삭제되고, 다른 값으로 변화하거나 null이 될 수 있습니다. 

 

 

6) DML(Data Manipulation Language)

- 데이터 조작 언어는 INSERT, UPDATE, DELETE 동작을 수행하는 SQL 명령문의 집합입니다. SELECT 명령문은 때때로 DML 명령문으로 여겨지는데, 왜냐하면 SELECT FOR UPDATE 형식이 INSERT, UPDATE, DELETE와 동일한 잠금 고려 사항이 적용되기 때문입니다. 

 

- InnoDB 테이블을 위한 DML 명령문은 트랜잭션의 컨텍스트에서 동작하므로, 그것들의 효과는 단일 단위로서 커밋되거나 롤백될 수 있습니다.