SQL (1) schema, join

4603 단어 sqlmysqlmysql

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)

좋은 웹페이지 즐겨찾기