데이터베이스에서 데이터가 구성되는 방식과 서로 다른 엔티티 간의 관계에 대한 설명이다
즉, 데이터 베이스의 청사진
과 같다
엔티티(Entity)는 고유한 정보의 단위
각 엔티티에는 해당 엔티티의 특성을 설명하는 필드(Field) 가 있다
행렬이라면 열(column) 에 해당된다
테이블에 저장되는 모든 항목에는 해당 필드가 포함된다
테이블에 저장된 항목
행력에서 행(row)라고 불 수 있다
각 테이블에는 고유한 ID라는 필드가 있다
이는 각 테이블의 레코드 하나를 가리키는 숫자로, 자동적으로 그 값이 증가한다(auto increments) 이 ID 필드는 해당 테이블의 기본 키 (Primary Key) 역할을 한다
다른테이블에서 테이블의 기본 키 (primary key)를 참조할 때 해당 값을 외래 키(foreign key)라고 한다
구조화된 데이터는 하나의 테이블로 표현할 수 있다
사전에 정의된 테이블을 relation 이라고도 부르기 때문에, 테이블을 사용하는 데이터베이스를 관계형 데이터베이스(Relational database)
라고도 한다
하나의 레코드가 다른 테이블의 레코드 한 개와 연결된 경우
다음과 같이 User 테이블과 Phonebook 테이블이 있다고 가정한다
User 테이블은 user_id, name, phone_id를 가지고 있다
이 중 phone_id는 외래키(foreign key)로써, Phonebook 테이블의 phone_id와 연결되어 있다
Phonebook 테이블은 phone_id와 phone_number를 가지고 있다
각 전화번호가 단 한 명의 유저와 연결되어 있고, 그 반대도 동일하다면,
User 테이블과 Phonebook 테이블은 1:1 관계(One-to-one relationship)다
1:1 관계는 자주 사용하지 않는다
1:1로 나타낼 수 있는 관계라면 User 테이블에 phone_id를 대신해 phone_number를 직접 저장하는 게 나을 수 있다
하나의 레코드가 서로 다른 여러 개의 레코드와 연결된 경우
User 테이블과 Phonebook 테이블의 관계를 다음과 같이 가정한다
이 구조에서는 한 명의 유저가 여러 전화번호를 가질 수 있다
그러나 여러 명의 유저가 하나의 전화번호를 가질 수는 없다
이런 1:N(일대다) 관계는 관계형 데이터베이스에서 가장 많이 사용한다
여러 개의 레코드가 다른 테이블의 여러 개의 레코드와 관계가 있는 경우
N:N(다대다) 관계를 위해 스키마를 디자인할 때에는, Join 테이블을 만들어 관리한다
1:N(일대다) 관계와 비슷하지만, 양방향에서 다수의 레코드를 가질 수 있다
다음과 같이 여행 상품을 관리하는 테이블이 있다고 가정하한다
여러 개의 여행 상품이 있고, 여러 명의 고객이 있다
고객 한 명은 여러 개의 여행 상품을 구매할 수 있고, 여행 상품 하나는 여러 명의 고객이 구매할 수 있다
이렇게 Customer 테이블과 Package table이 따로 존재한다면, N:N(다대다) 관계를 어떻게 표현할 수 있을까?
다대다 관계는 두 개의 일대다 관계와 그 모양이 같다
두 개의 테이블과 1:N(일대다) 관계를 형성하는 새로운 테이블로 N:N(다대다) 관계를 나타낼 수 있다
이렇게 다대다 관계를 위한 테이블을 조인 테이블이라고 한다
N:N(다대다) 관계를 그림으로 나타내면 다음과 같다
customer_package 테이블에서는 고객 한 명이 여러 개의 여행 상품을 가질 수 있고, 여행 상품 하나를 여러 명의 고객이 가질 수 있다
customer_package 테이블은 customer_id와 package_id를 묶어주는 역할을 한다
이 테이블을 통해 어떤 고객이 몇 개의 여행 상품을 구매했는지 또는, 어떤 여행 상품이 몇 명의 고객을 가지고 있는지 등을 확인할 수 있다
이렇게 조인 테이블을 생성하더라도, 조인 테이블을 위한 기본키(여기서는 cp_id)는 반드시 있어야 한다
만약 외래키를 리스트 형식으로 관리하는 필드가 있다면, 어떤 문제가 발생할 수 있을까?
때로는 테이블 내에서도 관계가 필요하다 예를 들어 추천인이 누구인지 파악하기 위해 사용할 수 있다
다음과 같이 유저 테이블이 있다 user_id는 기본 키(primary key), name은 사용자의 이름, 그리고 recommend_id는 추천인 아이디다
User 테이블의 recommend_id는 User 테이블의 user_id와 연결되어 있다
한 명의 유저(user_id)는 한 명의 추천인(recommend_id)를 가질 수 있다, 그러나 여러 명이 한 명의 유저를 추천인으로 등록할 수 있다
이 관계는 1:N(일대다) 관계와 유사하다고 생각할 수 있다, 그러나 일반적으로 일대다 관계는 서로 다른 테이블의 관계를 나타낼 때 표현하는 방법이다