1. 기본 키 (Primary Key)
테이블에서 각 레코드를 고유하게 식별하는 데 사용된다.
또한, 후보 키들 중에서 하나를 선택해서 지정한 유일한 키이다.
CREATE TABLE employees (
id INT PRIMARY KEY, -- 기본 키
name VARCHAR(50),
salary INT
);
✅ 특징
- 유일성: 기본 키의 값은 중복될 수 없음.
- 널 값 불허: 기본 키는 널 값(NULL)을 가질 수 없음.
- 기본 키가 설정된 컬럼은 자동으로 인덱스가 생성된다.
2. 유니크 키 (Unique Key)
기본 키와 유사하지만, 중복된 값은 허용하지 않지만 NULL 값은 허용된다.
CREATE TABLE users (
user_id INT PRIMARY KEY,
email VARCHAR(100) UNIQUE, -- 유니크 키
username VARCHAR(50) UNIQUE -- 유니크 키
);
✅ 특징
- 유니크 키는 중복을 방지하는 역할을 합니다.
- NULL 값을 허용하는 차이가 있다. (기본 키는 NULL을 허용하지 않음)
- 유니크 키는 인덱스를 생성하여 검색 성능을 향상시킨다.
3. 복합 키 (Composite Key)
복합 키는 둘 이상의 컬럼을 결합하여 유일성을 보장하는 키이다.
즉, 여러 컬럼을 조합하여 한 개의 후보 키를 만들 수 있다. 복합 키는 후보 키의 한 종류이며, 유일성을 보장하기만 하면 된다.
예를 들어, employee_id와 department_id를 결합한 키가 복합 키가 된다. 두 컬럼이 결합되어 유일성을 보장한다.
CREATE TABLE order_items (
order_id INT,
item_id INT,
quantity INT,
PRIMARY KEY (order_id, item_id) -- 복합 키
);
✅ 특징
- 여러 개의 컬럼을 결합하여 하나의 유니크한 값을 생성한다.
- 이 컬럼들이 결합되었을 때만 유니크한 값이 보장된다.
4. 외래 키 (Foreign Key)
다른 테이블과의 관계를 설정하는 데 사용된다. 한 테이블의 컬럼이 다른 테이블의 기본 키를 참조한다.
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
✅ 특징
- 참조 무결성을 유지하기 위해 사용된다.
- 외래 키를 설정하면, 참조된 테이블의 데이터가 변경되거나 삭제될 때 외래 키 관계에 영향을 미칠 수 있는 제약이 적용된다.
- 외래 키의 값은 참조된 테이블의 기본 키 값과 일치해야 한다.
5. 대체 키 (Alternate Key)
기본 키가 아닌 유니크 키 중에서 대체할 수 있는 키를 의미한다. 기본 키 외에 유니크한 값을 가지고 있는 컬럼들이다.
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
email VARCHAR(100) UNIQUE, -- 대체 키
phone_number VARCHAR(20) UNIQUE -- 대체 키
);
✅ 특징
- 기본 키가 아닌 다른 유니크 키로 데이터의 유일성을 보장한다.
- 대체 키는 보조적인 유니크 키로 사용된다.
6. 후보 키 (Candidate Key)
테이블에서 각 레코드를 유일하게 식별할 수 있는 컬럼들 중에서 하나의 기본 키로 선택할 수 있는 키이다.
쉽게 말하면, 유일성만 보장하는 키이다. 즉, 해당 컬럼(혹은 컬럼들의 조합)만으로 각 레코드를 유일하게 식별할 수 있으면 후보 키이다.
후보 키는 필수적인 컬럼들만 포함되어 있으며, 불필요한 컬럼이 포함되지 않는다. 예를 들어, employee_id나 email 같은 단일 컬럼이 후보 키가 될 수 있다. 또는 employee_id, department_id와 같이 복합적으로 컬럼들을 합쳐서 유일성을 보장할 수도 있다.
✅ 특징
- 테이블에서 유일하게 각 레코드를 식별할 수 있는 여러 후보들이 존재할 수 있음.
- 후보 키 중 하나가 기본 키로 선택된다.
- 위의 예시에서 email과 phone_number가 후보 키가 될 수 있다.
🔗 후보 키와 기본 키 관계
- 기본 키는 후보 키 중에서 하나만 선택된 키입니다. 즉, 기본 키는 후보 키의 특수한 경우이다.
- 후보 키는 기본 키를 제외한 나머지 유일한 컬럼들을 의미하며, 기본 키 외에도 다른 후보들이 존재할 수 있다.
- 기본 키는 후보 키 중에서 하나를 선택하여 사용하는 것이며, 후보 키들은 유일성을 보장하는 컬럼들의 집합이다.
다음 예시에서, employee_id, email이 후보 키가 될 수 있고, 그 중에서 employee_id가 기본 키로 선택된 경우이다.
CREATE TABLE employees (
employee_id INT PRIMARY KEY, -- 기본 키
email VARCHAR(100) UNIQUE, -- 유니크 키, 후보 키
phone_number VARCHAR(20) UNIQUE -- 유니크 키, 후보 키
);
- 여기서 employee_id는 기본 키이다.
- email과 phone_number는 기본 키를 제외한 후보 키가 된다.
- 즉, employee_id는 후보 키 중 하나로 포함된다.
7. 슈퍼 키 (Super Key)
테이블에서 각 레코드를 유일하게 식별할 수 있는 컬럼들의 집합을 의미한다. 중요한 점은 슈퍼 키는 하나 이상의 컬럼으로 이루어져 있으며, 각 컬럼의 조합이 고유성을 보장하면 슈퍼 키가 될 수 있다는 것이다. 즉, 슈퍼 키는 기본 키나 후보 키의 확장된 개념이라고 볼 수 있다.
예를 들어, employee_id만 있어도 유일성을 보장할 수 있지만, employee_id, name을 합쳐도 여전히 고유한 값을 보장한다.
이런 경우 employee_id, name은 슈퍼 키가 된다.
✅ 특징
- 슈퍼 키는 기본 키를 포함할 수 있다. 즉, 기본 키는 슈퍼 키이기도 하다.
- 슈퍼 키는 기본 키와 유사하지만, 기본 키 외에 불필요한 컬럼들을 추가할 수 있는 키이다.
- 예를 들어, 기본 키에 name과 같은 컬럼을 추가한 키도 슈퍼 키이다.
- employee_id, employee_id + name 같이 여러 컬럼의 조합도 슈퍼 키가 될 수 있다.
🚀 예시
CREATE TABLE employees (
employee_id INT, -- 직원 ID
name VARCHAR(50), -- 직원 이름
email VARCHAR(100), -- 이메일
phone_number VARCHAR(20) -- 전화번호
);
- 이 테이블에서 각 직원은 employee_id를 통해 고유하게 식별할 수 있다.
- 하지만, employee_id 하나만으로 테이블을 식별할 수 있는 것은 기본 키이고, 이 외에도 여러 가지 슈퍼 키가 존재할 수 있다.
🔑 슈퍼 키 예시
예시 | 설명 |
employee_id | 기본 키이고, 각 직원은 employee_id로 유일하게 식별된다. 그래서 employee_id는 슈퍼 키이다. |
employee_id, name | employee_id는 이미 유일한 값이므로, name을 추가해도 여전히 각 직원은 유일하게 식별될 수 있다. 이 조합도 슈퍼 키이다. |
employee_id, email | 마찬가지로 employee_id가 유일한 값이므로 email을 추가해도 각 레코드는 고유하게 식별된다. 이 조합도 슈퍼 키이다. |
employee_id, name, email | employee_id가 유일하므로, name과 email을 추가하더라도 각 레코드는 여전히 고유하게 식별됩니다. 이 조합도 슈퍼 키이다. |
employee_id, name, email, phone_number | 여러 개의 컬럼을 합쳐서 슈퍼 키를 만들 수 있다. |
🤔 슈퍼 키와 후보 키의 차이
- 후보 키는 필요한 최소 컬럼만 포함된 유일한 식별자이다. 예를 들어, employee_id만 있으면 후보 키로 적합하다.
- 슈퍼 키는 후보 키에 불필요한 컬럼을 추가한 것이다. 즉, employee_id 외에도 추가적인 컬럼들을 포함할 수 있다.
- 예를 들어, employee_id, name과 같이 name 컬럼을 추가한 것도 슈퍼 키가 될 수 있다.
8. 조인 키 (Join Key)
두 테이블을 조인할 때 사용되는 키이다. 일반적으로 외래 키와 함께 사용된다.
SELECT *
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id; -- 조인 키 사용
✅ 특징
- 테이블 간의 관계를 설정할 때 조인 키가 사용된다.
- 외래 키와 기본 키를 조인 키로 사용할 수 있다.
9. 문자열 키 (String Key)
문자열로 인덱스를 설정하는 경우에 사용된다.
CREATE INDEX idx_name ON employees(name);
✅ 특징
- 문자열 데이터형에 대해 인덱스를 설정할 수 있다.
- 비효율적인 문자열 검색을 빠르게 하기 위해 사용된다.
10. 비트 키 (Bit Key)
비트맵 인덱스(Bitmap Index)라고도 하며, BIT 자료형을 사용하는 인덱스이다.
CREATE INDEX idx_active ON users(active_status); -- BIT형 자료형 인덱스
✅ 특징
- 주로 논리적인 값(0과 1)으로 구분되는 값에 사용된다.
- 효율적인 집합 연산을 위한 인덱스이다.
11. 비트맵 인덱스 (Bitmap Index)
비트맵 방식으로 데이터를 압축하여 저장하는 인덱스이다.
CREATE INDEX idx_gender_status ON users(gender, status);
✅ 특징
- 주로 저 cardinality(값의 종류가 적은) 컬럼에서 효율적이다.
- 예를 들어 gender, status와 같은 컬럼에서 유용하다.
'DB' 카테고리의 다른 글
[DB] MySQL InnoDB의 인덱스 생성 전략 (0) | 2025.03.31 |
---|---|
[CS] 데드락 (0) | 2024.11.28 |
[DB] 병행 수행과 병행 제어 (0) | 2024.11.25 |
[DB] 트랜잭션 회복 기법 (0) | 2024.11.25 |
[DB] Soft Delete VS Hard Delete (0) | 2024.11.24 |