schema
데이터베이스에서 데이터가 구성되는 방식과 서로 다른 엔티티 간의 관계에 대한 설명으로 데이터 베이스의 청사진과 같다.
학교를 위한 데이터베이스를 구축한다고 할때, 교사(Teachers), 수업(Classes), 학생(Students)와 같은 데이터를 저장할 수 있다. 이때 교사, 수업, 학생 각각은 고유한 정보단위로, 엔티티이며 테이블로 표현할 수 있다.
각 엔티티는 테이블이므로, 행과 열이 존재한다. 열(column)에 해당하는 것들을 우리는 필드(field)라고 하고, 행(row)에 해당하는 것을 우리는 record라고 한다.
이 엔티티들은 어떤 관계를 가질까?
교수 한 명은 여러개의 수업을 진행하므로 1:N의 관계를 갖고 두 테이블을 하나로 합쳐서 표현하면 아래와 같이 나타낼 수 있다. N에 해당하는 Classes 테이블에 Teachers 테이블의 pk인 ID를 외래키로 참조할 수 있다.
하나의 수업(CS 101)을 여러명의 학생들(김코딩, 박해커)이 들을 수 있고, 한명의 학생(김코딩)이 여러개의 수업(CS 101, CS 102)을 들을 수 있으므로 두 테이블 N:M의 관계를 갖는다.
따라서, Classes 테이블의 ID와 Students 테이블의 ID를 합쳐 수업을 듣는 학생들을 또다른 테이블로 합쳐서 표현할 수 있다.
관계형 데이터베이스
정의된 테이블을 relation이라고 부르기때문에 테이블을 사용하는 데이터베이스를 관계형 데이터베이스라고 한다
테이블간의 관계는 다음과 같다.
A테이블의 하나의 레코드가 B 테이블의 하나의 레코드와 연결된 경우
User 테이블은 총 3개의 필드를 가지고 있고, Phonebook 테이블은 2개의 필드를 갖는다. 두 테이블 모두 phone_id 필드를 가지고 있는데, 사용자 한명은 하나의 phone_id를 갖고, 휴대폰 번호는 하나의 phone_id를 갖는다.
즉, 두 테이블은 1:1 관계를 갖는다.
그러나, 1:1 관계는 자주 사용하지 않고, 위와같이 테이블을 분리하지 않고 User 테이블에 phone_id를 대신해 phone_number를 적는 것이 더 나을 수 있다.
A테이블의 하나의 레코드가 B 테이블의 여러개의 레코드와 연결된 경우
user_id가 1인 김코딩은 휴대폰을 10대 가지고 있을 수 있다. 이 경우 Phonebook 테이블에서 user_id가 1인 레코드는 10개가 된다. 하지만 반대로 여러개의 휴대폰을 한 명의 유저가 사용할 수 는 없으므로 두 테이블의 레코드는 1: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
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;
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;
표현 이해하기
Foreign key(PersonsID) references Persons(PersonID)