SQL (1) schema, join

Creating the dots·2021년 8월 27일
0

SQL

목록 보기
1/21
post-thumbnail

schema

데이터베이스에서 데이터가 구성되는 방식과 서로 다른 엔티티 간의 관계에 대한 설명으로 데이터 베이스의 청사진과 같다.

학교를 위한 데이터베이스를 구축한다고 할때, 교사(Teachers), 수업(Classes), 학생(Students)와 같은 데이터를 저장할 수 있다. 이때 교사, 수업, 학생 각각은 고유한 정보단위로, 엔티티이며 테이블로 표현할 수 있다.

각 엔티티는 테이블이므로, 행과 열이 존재한다. 열(column)에 해당하는 것들을 우리는 필드(field)라고 하고, 행(row)에 해당하는 것을 우리는 record라고 한다.

이 엔티티들은 어떤 관계를 가질까?

Teachers와 Classes는 1:N의 관계를 갖는다

교수 한 명은 여러개의 수업을 진행하므로 1:N의 관계를 갖고 두 테이블을 하나로 합쳐서 표현하면 아래와 같이 나타낼 수 있다. N에 해당하는 Classes 테이블에 Teachers 테이블의 pk인 ID를 외래키로 참조할 수 있다.

Classes와 Students는 N:M의 관계를 갖는다

하나의 수업(CS 101)을 여러명의 학생들(김코딩, 박해커)이 들을 수 있고, 한명의 학생(김코딩)이 여러개의 수업(CS 101, CS 102)을 들을 수 있으므로 두 테이블 N:M의 관계를 갖는다.

따라서, Classes 테이블의 ID와 Students 테이블의 ID를 합쳐 수업을 듣는 학생들을 또다른 테이블로 합쳐서 표현할 수 있다.

관계형 데이터베이스

정의된 테이블을 relation이라고 부르기때문에 테이블을 사용하는 데이터베이스를 관계형 데이터베이스라고 한다

테이블간의 관계는 다음과 같다.

  • 1:1
  • 1:N
  • N:N
  • self referencing

1:1 관계

A테이블의 하나의 레코드가 B 테이블의 하나의 레코드와 연결된 경우

User 테이블은 총 3개의 필드를 가지고 있고, Phonebook 테이블은 2개의 필드를 갖는다. 두 테이블 모두 phone_id 필드를 가지고 있는데, 사용자 한명은 하나의 phone_id를 갖고, 휴대폰 번호는 하나의 phone_id를 갖는다.

즉, 두 테이블은 1:1 관계를 갖는다.

그러나, 1:1 관계는 자주 사용하지 않고, 위와같이 테이블을 분리하지 않고 User 테이블에 phone_id를 대신해 phone_number를 적는 것이 더 나을 수 있다.

1:N 관계

A테이블의 하나의 레코드가 B 테이블의 여러개의 레코드와 연결된 경우

user_id가 1인 김코딩은 휴대폰을 10대 가지고 있을 수 있다. 이 경우 Phonebook 테이블에서 user_id가 1인 레코드는 10개가 된다. 하지만 반대로 여러개의 휴대폰을 한 명의 유저가 사용할 수 는 없으므로 두 테이블의 레코드는 1:N의 관계를 갖는다.

N:N 관계


A테이블의 여러개의 레코드가 B 테이블의 여러개의 레코드와 연결된 경우

customer_id가 1인 김코딩은 package_id가 100인 제주 여행상품을 5개 구매할 수 있다. 제주 여행상품을 구매한 사람은 김코딩 뿐만 아니라 다수일 수 있다. 즉, 한 사람이 여러개의 여행상품을 구매할 수 있고, 하나의 여행상품을 구매한 사람이 여러명일 수 있으므로 두 테이블의 레코드는 N:N의 관계를 갖는다.

이와같이 다대다 관계를 스키마 디자인할때에는 JOIN 테이블을 만들어 관리한다.

자기참조 관계

하나의 테이블에서도 관계가 있을 수 있다. 한명의 유저가 추천인을 갖는 경우가 이에 해당한다. 유저는 한명의 추천인을 가질 수 있지만 추천인은 여러명이 등록할 수 있다.

JOIN

데이터베이스의 모든 테이블은 하나의 주제(theme)만 가져야한다

every table in the database needs to have a single theme

LEFT JOIN

The LEFT JOIN keyword returns all records from the left table (table1), and the matching records from the right table (table2). The result is 0 records from the right side, if there is no match.

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;

INNER JOIN

The INNER JOIN keyword selects records that have matching values in both tables.

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

표현 이해하기

Primary key

  • 관계형 데이터베이스의 테이블에서 하나의 레코드를 식별할 수 있는 고유한(유니크한) 값
    ex. 일반적으로는 자동으로 증가하는(auto_increment) 정수를(int) pk로 설정한다
  • pk는 테이블 내 여러개의 컬럼에 설정할 수 있다
    ex. 날짜, 사원번호, 판매처, 제품명, 수량 등을 열로 가지는 sales 테이블이 있다고 해보자
    이때, 이 각각의 열들의 값은 고유하지 않으므로 pk가 될 수 없다. 따라서, 이 경우의 기본키는 날짜, 사원번호, 판매처, 제품명 4개의 열들의 조합이 된다.

Foreign key

  • 다른 테이블을 참조하는 목적으로 사용된다.
  • REFERENCES 라고 하는 SQL을 사용해서 FOREIGN KEY로 다른 테이블과 관계를 형성한다.
    Foreign key(PersonsID) references Persons(PersonID)
profile
어제보다 나은 오늘을 만드는 중

0개의 댓글