키 (key)
- 후보키 (Candidate Key)
- 릴레이션을 구성하는 속성 중에 튜플을 유일하게 식별할 수 있는 속성들의 부분집합을 의미한다.
- 릴레이션은 반드시 하나 이상의 후보키를 가져야 한다.
- 릴레이션에 있는 모든 튜플에 대해서 유일성과 최소성을 충족시켜야 한다.
- 기본키 (Primary Key)
- 후보키 중 선택한 주 키
- 특정 튜플을 구별할 수 있는 유일한 키
- Null 값을 가질 수 없다(개체 무결성)
- 동일한 값이 중복되어 저장될 수 없다.
- 정수를 지향하고 유효 아이디(String 같은 문자열)을 지양한다.
- 유효 아이디 사용 시 별도의 정렬을 위한 테이블이 필요하다.
- 크기가 커질 가능성이 커서 불필요한 메모리 사용이 늘어난다.
- 해결방안으로 TSID**, snow flake** 등이 있지만, 그래도 정수 사용을 권장한다.
- 굳이 쓰려한다면 정렬할 필요가 없는 경우나 소규모의 데이터를 다룰 때 유효 아이디를 사용한다.
- 대체키 (Alternate Key)
- 후보키가 둘 이상일 때 기본키를 제외한 나머지 후보키들을 말한다.
- 보조키라고도 한다.
- 슈퍼키 (Super Key)
- 한 릴레이션 내에 있는 속성들의 집합으로 이루어진 키를 뜻한다.
- 유일성은 만족하나 최소성은 만족하지 못한다.
ex) <학생> 이라는 릴레이션에서 '학번', '주민번호', '학번+주민번호', '학번+주민번호+성명' 등으로 슈퍼키를 구성할 수 있다. 여기서 유일성은 지켜질 수 있다. 최소성을 만족하지 못한다는 뜻은 '학번+주민번호+성명' 의 조합으로 유일함은 지켜지지만 각 개별적으로 보았을 때 성명은 유일함이 지켜지지 않기에 최소성을 만족하지 못한다고 한다.
- 외래키 (Foreign Key)
- 릴레이션 R1,R2가 있다고 할 때, R1이 R2를 참조한다고 한다. 이 때 R1에 R2의 기본키가 속성으로 들어가는데 이를 외래키라고 한다.
- 두 릴레이션의 관계(R1,R2) 를 표현하는데 쓰인다.
- 이 때 외래키는 참조하는 릴레이션 R2의 기본키값 외의 값은 있을 수 없다 (참조 무결성)
- 대리키 (Surrogate Key)
- 자연키** 와 대칭되는 개념인 인조키** 중 하나로 Entity의 식별자(PK)와 동급의 의미를 가지는 키를 가리킨다.
- PK가 있음에도 사용되는 이유는 아래와 같다.
- PK는 외부에 노출시키지 않는 것이 좋기 때문이다. 외부의 노출로 인해 타인의 PK 까지 접근하려 할 수 있기 때문이다.
- PK가 외부연동 서비스와 연동될 경우 DB 변경등의 요인으로 많은 공수가 발생할 수 있기 때문이다.
- 시스템 내부에서는 PK를 사용하고, 외부에서는 대리키를 사용하도록 한다.
- MySQL에서 1천만건 이상의 데이터에 대해 random string(무작위 문자열) 값을 사용해도 조회 성능에 큰 이슈가 없기에 random string을 사용하나, 성능 개선을 위해 UUID** 를 rearranged** 하여 사용하는 것을 고려하기도 한다.
참고
- 자연키(Natural Key) : 비즈니스 로직상에서 생긴 키를 자연키라한다.
- 인조키(Artificial Key) : 완전히 키로서의 용도로 인위적으로 생성한 키를 인조키라고 한다.
- UUID(Universally Unique Identifier) : 고유 식별자를 생성하기 위한 표준 방식 (ex. 550e8400-e49b-41d4)
- rearranged UUID : UUID 구조를 재배치하여, 정렬을 최적화한 방식이다. 이로인해 B-tree 성능을 높일 수 있다.
- TSID : 정렬 가능한 유효아이디
- snow flake : 스토리지 탐색 최적화 제공 툴
'DB' 카테고리의 다른 글
MySQL Server (0) | 2024.11.01 |
---|---|
RDBMS (Relationa DataBase Management System) (0) | 2024.11.01 |
3단계 데이터 베이스 구조 (0) | 2024.10.31 |
데이터베이스 관리 시스템(DataBase Management System, DBMS) (0) | 2024.10.31 |
데이터 베이스 시스템과 파일 시스템 (0) | 2024.10.31 |