2023.02.26
데이터베이스 디자인의 시작은 entity를 정의하는데서 시작한다. 여기서 entity란 데이터베이스에 입력될 데이터의 집합을 의미한다. 다시 말해 사람, 장소, 물건, 사건, 개념 등과 같은 명사와 관련된 데이터의 집합인데, 데이터베이스에서는 하나의 entity의 속성을 저장하기 위해 한 개 이상의 테이블을 사용한다. 그리고 그 테이블의 주제를 entity 라고 표현한다.
예를 들어 회원관리 앱을 개발할 때는 users 라는 entity(table)가 있을 수 있다. 또한 특정 user의 address를 저장하기 위해서 addresses라는 entity(table)가 필요하다.
즉, entity = 테이블 / entity의 객체 = 테이블의 row
이다.
데이터베이스에서는 두 개의 엔티티간의 관계를 정의해야 한다. 이처럼 관계를 표기하기 위해서는 아래 3가지 개념이 필수적이다.
관계명
: 관계명이란 엔티티가 관계에 참여하는 형태를 지칭하는 이름으로, 두 개의 엔티티에 대한 것이기 때문에 하나의 관계는 2개의 현재형으로 표현한 관계명을 가진다.
즉, UML 에서랑 똑같다고 보면 될듯
관계 차수
: 두 개의 엔티티 관계에서 참여자의 수를 표현하는 것을 관계 차수라고 한다. 가장 일반적인 관계 차수 표현방법은 1:1
, 1:N
, N:N
이다. 관계 차수에서 가장 중요하게 고려해야 할 사항은, 한 쪽 엔티티와 관계를 맺은 엔티티 쪽이 하나의 객체만을 가지는지, 혹은 여러 개의 객체를 가질 수 있는지를 파악하는 것이 중요하다.
아래 그림은 이와 같은 관계 차수와 관련하여 그린 ERD(Entity Relationship Diagram) 으로, 엔티티간의 관계를 시각화한 다이어그램을 말한다. 데이터베이스를 다루다보면 한번쯤은 그려볼법한 다이어그램이다.
관계 선택 사양(Optionality)
: 관계에서 항상 참여해야 하는지(필수관계인지) 아니면 참여할 수도 있는지(선택관계인지)에 대한 것을 관계 선택 사양이라고 한다. 아래처럼 엔티티가 항상 관계에 참여하는지 (필수 참여) 아니면 선택적으로 관계에 참여하는지(선택참여)를 구분할 수 있어야 한다.
예로 들면, 학생 엔티티는 수업 엔티티와 관계가 있을 수도, 없을 수도 있다. 따라서 학생 엔티티를 기준으로 학생-수업 관계는 선택참여가 된다. 따라서 동그라미 표시를 했다. 반대로 학생이 듣지 않는 수업에 대해서는 고려하지 않는 경우에, 수업 엔티티는 학생 엔티티와의 관계가 필수적이기 때문에 수업 엔티티를 기준으로 수업-학생 관계는 필수 참여가 된다. 따라서 이때는 선을 하나 그어서 표시했다.
이거 표기법은 뭔가 모르겠다. 다시 더 찾아봐야 할 듯.
key는 테이블의 관계와 유일성(uniqueness)을 설정하는 constraint 중 하나이다.
가장 대표적인 두 종류의 key는 Primary Key(PK)
와 Foreign Key(FK)
가 있다. 이 외에도 많지만 일단 기본적으로 두개만 보고 간다.
Primary Key는 테이블에서 가장 기본적인 속성을 의미한다. 테이블에서 특정 row(record/tuple)르 식별하기 위해 사용되는 값이다. 데이터베이스에서 테이블을 생성할 때 하나 또는 그 이상의 항목을 기본키로 설정할 수 있다.
식별자로 동작하기 위해서는 아래의 제약이 필수적이다.
NOT NULL
: 아무런 값이 없는 상태 값인 null 값을 가질 수 없다.UNIQUE
: 다른 row와 중복되어 나타낼 수 없는 단일 값을 가진다.여기서 주의할 것은, 테이블에서 하나만 가질 수 있기 때문에 똑같이 NOT NULL
, UNIQUE
한 constraint를 가지고 있다고 하더라도 모두가 기본키가 될 수 없다. 그리고 일반적으로는 id라는 필드를 primary key로 지정하는 경우가 많다.
기본적으로 제약 조건을 설정한 필드를 Foreign Key (외래키) 라고 부르며, 한 테이블을 다른 테이블과 연결해주는 역할을 한다. 관계를 맺고 있는 테이블 중 참조되는 관계의 기본키 필드 혹은 UNIQUE 제약조건이 설정된 필드와 대응되어 관계에 참조 관계를 표현하는 속성을 의미한다.
예를 들어 colors
라는 테이블과 shapes
라는 테이블이 있다고 하자. 이 때 shape
가 여러 개의 color
를 가질 수 있다고 했을 때 아래와 같이 shapes
에 color_id
라는 column을 colors
테이블의 foreign key로 설정하여 아래 그림과 같은 관계를 만들 수 있다.
참조 무결성이란 참조 관계에 있는 2개의 테이블 간의 데이터 무결성, 즉 데이터가 항상 일관된 값을 유지되는 것을 의미한다. 즉 참조되는 테이블의 기본키에 대한 외래키가 존재하는 한 해당 row는 수정되거나 삭제될 수 없다. 만약 해당 레코드를 수정하거나 삭제하면, 다른 테이블의 외래키가 삭제되거나 수정된 레코드를 가리켜 참조 무결성 제약에 위배가 되기 때문이다.
예를 들어 shapes
테이블의 color_id
가 Foreign Key이고 그 값이 ‘1’ 이면 실제로 colors
테이블에 ‘1’이 있어야 하고 두 값은 항상 같아야 한다. 만약 변경해야 하거나 삭제해야 하는 상황에는 Cascade Action 을 사용해야 한다.
이렇게 참조 무결성 개념이 있는 이뉴는 다른 테이블에 존재하지 않는 데이터를 참조하지 않도록 보장하고, 사용자의 실수로 인해 관련 데이터가 삭제되거나 수정되는 것을 막기 위해서이다.
MySQL 은 관계형 데이터베이스이다. 따라서 각 테이블간 관계를 설정할 수 있는데, 아래와 같이 나눠질 수 있다.
테이블 레코드(행) 하나당 다른 테이블의 한 레코드(행)와 연결되어 있는 경우
아래 User 테이블은 Phonebook 테이블의 phone_id 를 외래키로 참조하고 있다. 유저와 전화번호 간의 관계를 아래와 같이 가정해보면, 1:1 관계가 된다.
1개의 행은 다른 1개의 행과 연결되어 있다. 이게 1:1 관계.
테이블 레코드(행) 하나당 여러 개의 레코드(행)와 연결되어 있는 경우
다시 전화번호와 유저를 예로 아래와 같은 가정을 한다.
여러 개의 레코드(행)가 여러 개의 레코드를 가지는 관계. N:N 관계일 때는 따로 조인 테이블을 만들어서 관리해야 한다.
여행 상품이 있다고 한다면, 양방향에서 다수를 가지는 아래의 경우 N:N 관계가 된다.
customer_package 테이블은 customer_id 와 package_id 를 묶는 조인 테이블 역할을 한다. 즉, 일반적으로 두 테이블의 대표키를 컬럼으로 갖는 다른 테이블을 생성해서 관리한다는 말이다.