TIL DAY 8-2 || RDBMS Foreign Key

TK·2021년 2월 22일
0

TIL

목록 보기
11/55

RDBMS 관계형 데이터베이스의 개념

  • 관계형 데이터베이스란 테이블(table)로 이루어져 있으며, 이 테이블은 키(key)와 값(value)의 관계를 나타낸다.

  • 데이터의 종속성을 관계(relationship)로 표현하는 것이 관계형 데이터베이스의 특징이다.

--> 관계형 데이터베이스는 다음과 같은 테이블이 서로 다른 테이블들과 유기적으로 관계를 맺고 모여있는 집합체를 말한다.

  • 또한 모든 테이블에는 각자의 고유 키(Primary Key)가 있는데 주로 이 키를 통해 다른 테이블과 연결시킨다.

RDBMS 테이블 연결의 종류

관계형 데이터베이스 테이블을 연결할 때 크게 세가지 종류가 있다.

  • one to one : 일대일 관계
  • one to many : 일대다 관계
  • many to many : 다대다 관계

one to one

  • 테이블 A의 row 와 테이블 B의 row 가 정확히 일대일 매칭이 되는 관계를 one to one 관계라고 한다.

  • 위의 예제는 user_profiles 의 user_id 가 users 테이블의 id 를 참조(reference)하고 있다.

  • 이 때 user_profiles 테이블의 user_id 가 foreign key (외래키) 가 된다.

one to many

  • 테이블 A의 row 가 테이블 B의 여러 row 와 연결이 되는 관계를 one to many 관계라고 한다.

  • 한 사람이 주문을 여러개 시켰을 때를 생각해보자. 한 사람이 시킨 주문이 여러개가 될 수는 있지만 각 주문의 주인이 여러 명이 될 순 없다.

  • 그래서 만약 customer 테이블이 order 의 id 를 참조한다면 customer 테이블의 customer_name 이 여러개가 될 것이다.

  • 하지만 customer 에 중복되는 customer_name 이 여러개 존재하는 것은 비효율적이다.

  • 따라서 order 테이블에서 customer 테이블의 id 를 참조하는 foreign key 인 customer_id 컬럼을 생성해주면 된다.

즉, (하나의 테이블 1 개) : (다른 테이블 n 개의 row) 가 one to many 의 개념이라고 이해 할 수 있다.

many to many

  • 테이블 A의 여러 row 가 테이블 B의 여러 row 와 연결이 되는 관계를 many to many 라고 한다.

  • 책은 여러 작가에 의해 쓰일 수 있고, 작가들은 여러 책을 쓸 수 있다는 것을 염두해 두고 위 예시를 보자.

  • authors_books 라는 테이블은 authors 의 id 와 books 의 id를 각각 author_id 와 book_id fk 로 참조했다.

  • 이는 두 테이블을 새로운 테이블에 연결함으로써 저자-책 의 정보를 보다 효율적으로 나누기 위함이다.

테이블을 연결하는 이유

  • 왜 정보를 여러 테이블에 나누어서 저장하는가?

  • 앞서 본 one to many의 경우 그냥 하나의 테이블에 고객 정보와 구입한 제품 정보 모두를 저장 하면 안되는가?

  • 하나의 테이블에 모든 정보를 다 넣으면 동일한 정보들이 불필요하게 중복되어 저장된다.
    --> 따라서 더 많은 디스크를 사용하게 되고, 잘못된 데이터가 저장 될 가능성이 높아진다.

  • 예를 들어, 고객의 아이디는 동일한데 이름이 서로 다른 row 들이 있다면 어떻게 해야 할까?
    --> 여러 테이블에 나누어서 저장한후 필요한 테이블 끼리 연결 시키면 위의 두 문제가 사라진다.

    • 중복된 데이터를 저장하지 않음으로 디스크를 더 효율적으로 쓰고,
    • 또한 서로 같은 데이터이지만 부분적으로만 내용이 다른 데이터가 생기는 문제가 없어진다.
    • 이것을 normalization(정규화) 라고 부른다.

참고자료 : 관계형 데이터베이스 http://www.tcpschool.com/mysql/mysql_intro_relationalDB

profile
Backend Developer

0개의 댓글