✏️ [Database] (2) Key와 constraint 설정하기

박상민·2023년 11월 16일
0

Database

목록 보기
4/9
post-thumbnail

내용

  • primary key 설정하기
  • unique constraint 설정하기
  • not null constraint 설정하기
  • attribute의 default 값 설정하기
  • check constraint 설정하기
  • foreign key 설정하기
  • constraint 이름 명시하기

해당 글은 ✏️ [Database]SQL의 개념과 데이터베이스와 테이블 생성하기 - [1]에서 이어집니다.

⭐️ Primary key

**Key constraints: Primary key

  • primary key: table의 tuple을 식별하기 위해 사용, 하나 이상의 attribute(s)로 구성
  • primary key는 중복된 값을 가질 수 없으며, NULL도 값으로 가질 수 없다,

사진을 보시면 PLAYER라는 테이블의 primary key가 team_id, back_number 두 개의 attribute로 구성되었습니다.
이때 첫번째 튜플과 두번째 튜플은 primary key를 위반했습니다. 왜일까요?
primary key에 대해서 첫번째 튜플의 밸류와 두번째 튜플의 밸류가 완전히 똑같이 때문입니다. primary key에 대한 중복된 값을 가졌기 때문입니다.

마찬가지로 세번째 튜플 또한 primary key에 대한 value로 NULL을 가졌기에 primary key를 위반했습니다.


Primary Key를 선언하는 방법은 크게 두 종류로 나뉩니다.

Primary key를 선언하는 2가지 방법

  • attribute 하나로 구성될 때
  • attribute 하나 이상으로 구성될 때

여기서 attribute가 하나 이상일 때 작성하는 위치를 주의해야합니다. 이 경우에는 테이블의 가장 아래 쪽에 작성해야합니다.

📌 UNIQUE constraint

  • UNIQUE로 지정된 attribute(s)는 중복된 값을 가질 수 없다
  • 단, NULL은 중복을 허용할 수도 있다. (RDBMS 마다 다름)

위 사진처럼 phone_number attribute에 UNIQUE 속성이 걸린다면 두 개의 중복된 전화번호 데이터를 가질 수가 없게 됩니다.

UNIQUE를 선언하는 방법

  • attribute 하나로 구성될 때
  • attribute 하나 이상으로 구성될 때

UNIQUE를 선언하는 방법은 앞에서 설명한 Primary key를 선언하는 것과 마찬가지로 2가지로 구성됩니다.
여기서 attribute가 하나 이상일 때 작성하는 위치를 주의해야합니다. 이 경우에는 테이블의 가장 아래 쪽에 작성해야합니다.

📌 NOT NULL constraint

  • attribute가 NOT NULL로 지정되면 해당 attribute는 NULL을 값으로 가질 수 없다.


사진처럼 phone_number attribute를 NOT NULL로 지정하면 2번째 튜플처럼 데이터가 NULL이 되는 경우가 불가능해집니다.

NOT NULL을 선언하는 방법

위 사진처럼 NOT NULL과 UNIQUE를 같이 사용하는 경우가 많습니다.
위에서 설명한 것처럼 UNIQUE는 NULL일 경우 중복을 허용하기 때문에 NOT NULL로 그 부분을 잡아주는 것입니다.


이해가 됐는지 확인해볼까요?

위 사진은 DEPARTMENT를 생성하는 SQL문입니다.
아래에 작성된 것은 attribute를 지정하고 그 속성 작성한 것입니다.
id, name, leader_id 3개의 attribute가 각각 어떤 속성을 가졌는지 이해가 되시나요?

이해가 된다면 다음으로 넘어가겠습니다.

📌 Attribute의 DEFAULT

  • attribute의 default 값을 정의할 때 사용
  • 새로운 tuple을 저장할 때 해당 attribute에 대한 값이 없다면 default 값으로 저장


salary의 DEFAULT를 50000000로 설정하고 튜플을 생성할 때 salary의 값을 입력하지 않는다면 DEFAULT로 설정한 값이 입력이 됩니다.

ㅇDEFAULT를 선언하는 방법

📌 CHECK constraint

  • attribute의 값을 제한하고 싶을 때 사용


salary attribute에 CHECK를 설정하면 CHECK에 설정한 조건을 만족하지 못하는 value를 입력이 불가능합니다.

CHECK를 선언하는 방법

⭐️ Foreign key

  • attribute(s)가 다른 table의 primary key나 unique key를 참조할 때 사용

위 사진은 EMPLOYEE 테이블의 department_id(Foreign key)가 DEPARTMENT 테이블의 id(Primary key)를 참조하는 예시입니다.

여기서 제약사항이 존재하는데 Foreign key가 참조하는 값을 Primary key에 반드시 존재하는 값이어야 합니다.

Foreign key를 선언하는 방법

📌 constraint 이름 명시하기

  • 이름을 붙이면 어떤 constraint을 위반했는지 쉽게 파악할 수 있다.
  • constraint를 삭제하고 싶을 때 해당 이름으로 삭제 가능

위 사진처럼 이름을 붙여준다면 에러가 발생했을 때 어떤 constrains을 위반했는지 바로 알 수 있습니다. 옆에 있는 이름을 생략한 경우와 비교를 해보면 그 차이가 크다는 것을 알 수 있습니다.

⭐️ Database 구조를 정의할 때 중요한 점

DB 구조를 정의할 때 중요한 점이 있습니다. SQL은 기본적으로 제공하는 여러가지 문법이 있습니다. SQL의 문법은 '이건 이때 사용하고, 이건 이때 사용하는거야'라고 정해져있는 것이 아닙니다.

그렇기 때문에 DB 구조를 정의할 때는 만들려는 서비스의 스펙과 데이터 일관성, 편의성, 확장성 등을 종합적으로 고려하여 DB 스키마를 적절하게 정의하는 것이 중요합니다.

주니어 개발자와 시니어 개발자를 구분하는 여러 기준이 있겠지만 그 중 하나가 '데이터베이스를 얼마나 잘 설계하는가'라고 합니다.


출처
글에 사용된 내용 및 사진은 모두 아래 영상의 자료입니다.
유튜브-쉬운코드
시니어 백엔드 개발자가 알려주는 데이터베이스 개론 & SQL

profile
스프링 백엔드를 공부중인 대학생입니다!

0개의 댓글