TIL 12주차 데이터베이스 설계

lim1313·2021년 10월 9일
0

부트캠프 TIL

목록 보기
38/49

데이터베이스 설계

관계형 데이터베이스

  • 스키마 : 데이터베이스에서 데이터가 구성되는 방식과 서로 다른 엔티티 간의 관계에 대한 설명

  • 데이터(data): 각 항목에 저장되는 값입니다.

  • 테이블(table; 또는 relation) : 사전에 정의된 열의 데이터 타입대로 작성된 데이터가 행으로 축적된다.

  • 칼럼(column; 또는 field) : 테이블의 한 열을 가리킨다.

  • 레코드(record; 또는 tuple) : 테이블의 한 행에 저장된 데이터이다.

  • 키(key) : 테이블의 각 레코드를 구분할 수 있는 값이다. 각 레코드마다 고유한 값을 가집니다. 기본키(primary key)와 외래키(foreign key) 등이 있다.

  • 기본키
    : 설계자가 여러 후보키 중 하나를 선택하여 정의한 식별자 (유일성, 최소성). 기본키의 모든 필드의 값은 null 이 될 수 없다.

  • 외래키
    : 다른 테이블의 기본키를 참조한다.
    외래키의 모든 필드는 참조하는 기본키와 동일한 도메인(값의 종류&범위)을 갖는다.
    외래키의 모든 필드의 값은 참조하는 기본키와 동일하거나 null 이다.

관계 종류

  • 1:1 관계
  • 1:N 관계
  • N:N 관계
  • self referencing 관계 : 테이블 스스로 관계를 가질 수 있다.

⚡ 1:1 관계

하나의 레코드가 다른 테이블의 레코드 한 개와 연결된 경우이다.

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:N 관계

하나의 레코드가 서로 다른 여러 개의 레코드와 연결된 경우이다.

이 구조에서는 한 명의 유저가 여러 전화번호를 가질 수 있으나, 여러 명의 유저가 하나의 전화번호를 가질 수는 없다.

⚡ N:N 관계

여러 개의 레코드가 다른 테이블의 여러 개의 레코드와 관계가 있는 경우.
양방향에서 다수의 레코드를 가질 수 있다.

각 한 명은 여러 개의 여행 상품을 구매할 수 있고, 여행 상품 하나는 여러 명의 고객이 구매할 수 있다.

다대다 관계를 위한 테이블을 조인 테이블이라고 합니다. N:N(다대다) 관계를 그림으로 나타내면 다음과 같다.

Customer 테이블과 Package table이 따로 존재한다면, N:N(다대다) 관계는 두 개의 테이블과 1:N(일대다) 관계를 형성하는 새로운 테이블N:N(다대다) 관계를 나타낼 수 있습니다.

customer_package 테이블에서는 고객 한 명이 여러 개의 여행 상품을 가질 수 있고, 여행 상품 하나를 여러 명의 고객이 가질 수 있다.

customer_package 테이블은 customer_id와 package_id를 묶어주는 역할이다. 이 테이블을 통해 어떤 고객이 몇 개의 여행 상품을 구매했는지 또는, 어떤 여행 상품이 몇 명의 고객을 가지고 있는지 등을 확인할 수 있다. 이렇게 조인 테이블을 생성하더라도, 조인 테이블을 위한 기본키(여기서는 cp_id)는 반드시 있어야 한다.

⚡ 자기참조 관계(Self Referencing Relationship)

때로는 테이블 내에서도 관계가 필요하다. 예를 들어 추천인이 누구인지 파악하기 위해 사용할 수 있다.

다음과 같이 유저 테이블이 있다. user_id는 기본 키(primary key), name은 사용자의 이름, 그리고 recommend_id는 추천인 아이디이다.

User 테이블의 recommend_id는 User 테이블의 user_id와 연결되어 있다. 한 명의 유저(user_id)는 한 명의 추천인(recommend_id)를 가질 수 있다.


profile
start coding

0개의 댓글