May 01, 2023
데이터베이스 제약조건(Constraint) 제약조건이란 데이터의 무결성을 지키기위해 입력받은 데이터에 대한 제한을 두는 것을 의미한다.
NOT NULL : NULL값 입력 금지
CREATE TABLE PRODUCT(
id INT NOT NULL
);
UNIQUE : 중복값 입력 금지 (NULL값은 중복입력 가능)
CREATE TABLE PRODUCT(
id INT UNIQUE
);
PRIMARY KEY : 기본키를 지정하는 constraint, NOT NULL + UNIQUE 특성을 모두 지님
CREATE TABLE PRODUCT(
id INT PRIMARY KEY
);
FOREIGN KEY : 한 테이블을 다른 테이블과 연결하여 외래키를 지정하는 제약조건, 다른 테이블의 컬럼을 조회해서 무결성 검사, 해당 테이블은 다른 테이블에 의존됨.
CREATE TABLE PRODUCT(
id INT PRIMARY KEY
user_id INT
FOREIGN KEY user_id
PREFERENCES USER(id) ON UPDATE CASCADE
);
테이블 간의 의존성 때문에 테이블의 삭제, 수정이 일어났을 때 수행할 동작을 지정해주어야 한다.
설정할 수 있는 동작은 아래와 같다.
DEFAULT : 해당 필드의 디폴트값을 설정
CREATE TABLE USER(
name VARCHAR(30) DEFAULT 'Anonymous'
);
키에 종속되지 않는 필드를 제거한다. (이행적 종속을 없애도록 테이블을 분해하는 것)
레코드 내에서 해당 레코드 키의 일부분이 아닌 값은 테이블에 속하지 않는다. 일반적으로는 필드 그룹의 내용이 테이블의 단일 레코드에 적용될 수 있는 경우 항상 해당 필드를 별도의 테이블에 배치하는 것이 좋다.
Candidates
id | name | age | address | university |
---|---|---|---|---|
1 | A | 23 | Seoul | SNU |
2 | B | 25 | Pusan | SNU |
3 | C | 24 | New York | NYU |
예를 들어 Employee Recruitment 테이블에 입사 지원자의 대학 이름과 주소가 포함되어 있을 수 있다. 하지만 그룹에 메일을 보내려면 전체 대학 목록이 필요하다. 대학 정보가 Candidates 테이블에 저장되어 있는 경우 현재 입사 지원자를 포함하지 않고 대학 목록만 생성할 수 있는 방법은 없다. 이 경우에는 별도의 Universities 테이블을 만든 후 대학 코드 키를 사용하여 Candidates 테이블과 연결한다.
Candidates
id | name | age | address | university_id |
---|---|---|---|---|
1 | A | 23 | Seoul | 1 |
2 | B | 25 | Pusan | 1 |
3 | C | 24 | New York | 2 |
Universities
id | name | Country |
---|---|---|
1 | SNU | Korea |
2 | NYU | USA |
예외: 이론적으로는 세 번째 정규 형식을 따르는 것이 좋지만, 실제로 항상 해당 형식을 따를 수 있는 것은 아니다. 예를 들어 Customers 테이블에서 발생 가능한 모든 필드 간 종속성을 제거하려는 경우에는 도시, 우편 번호, 영업 사원, 고객 등급 및 여러 레코드에서 중복될 수 있는 기타 모든 요소에 대해 별도의 테이블을 만들어야 한다. 물론 이론적으로는 정규화를 수행하는 것이 좋습니다. 그러나 대부분의 작은 테이블에서는 정규화를 수행하면 성능이 저하되거나 열린 파일 및 메모리 용량이 초과될 수 있다.