54일차 [데이터베이스] 관계형 데이터베이스2
2021. 10. 12 화요일
1. Today's Key Points!🔑
- Schema Design
- 데이터베이스 연결
2. 정리해보자!🧹
관계형 데이터베이스는 행과 열로 구성된 테이블에 데이터를 저장하기 때문에 초기에 Schema를 잘 설계해야 한다. 테이블의 구조와 데이터 타입 등을 사전에 정의하고, 테이블끼리 어떤 관계를 가지느냐에 따라 테이블을 나눌지 말지를 결정할 수 있어야 한다.
관계 종류는 크게 4가지가 있다.
- 1:1 관계
- 1:N 관계
- N:N 관계
- self referencing 관게
1:1 관계
하나의 레코드가 다른 테이블의 레코드 한개와 연결된 경우이다.
phone_id는 외래키(foreign key)로써, Phonebook 테이블의 phone_id와 연결되어 있다. 각 전화번호가 단 한 명의 유저와 연결되어 있고, 그 반대도 동일하다면, User 테이블과 Phonebook 테이블은 1:1 관계이다.
근데 1:1 관계는 자주 사용하지 않는다. 1:1로 나타낼수 있는 관계라면 User 테이블에 phone_id를 넣기보다 그냥 직접 phone_number를 저장하는게 나을 것이다.
1:N 관계
하나의 레코드가 서로 다른 여러 개의 레코드와 연결된 경우이다.
이 구조에서는 한 명의 유저가 여러 전화번호를 가질 수 있다. 근데 여러 명의 유저가 하나의 전화번호를 가질 수는 없다. 이런 관계가 관계형 데이터베이스에서 가장 많이 사용된다.
N:N 관계
여러 개의 레코드가 다른 테이블의 여러 개의 레코드와 관계가 있는 경우이다. N:N 관계를 위해서 스키마를 디자인할 때에는, Join 테이블을 만들어 관리한다. 1:N 관계와 비슷하지만, 양방향에서 다수의 레코드를 가질 수 있다.
예를 들어, 여러 개의 여행 상품이 있고 여러 명의 고객이 있으면, 고객 한명은 여러 개의 여행 상품을 구매할 수 있고 여행 상품 하나는 여러 명의 고객이 구매할 수 있다. 이런 관계가 N:N관계인데, N:N관계를 표현하려면 위 처럼 다대다 관계를 위한 테이블을 만들어서 연결시켜 준다. 이러한 테이블을 조인 테이블이라고 한다.
자기참조 관계(Self Referencing Relationship)
때로는 테이블 내에서도 관계가 필요하다. 에를 들어 추천인이 누군인지 파악하고 싶을 때 사용할 수 있다.
User테이블 안에서 recommend_id는 user_id와 연결되어 있다. 한명의 유저는 한명의 추천인을 가질 수 있다. 근데 여러 명이 한 명의 유저를 추천인으로 등록할 수 있다. 이 관계는 1:N 관계와 유사하다고 생각할 수 있다. 그러나 일반적으로 일대다 관계는 서로 다른 테이블의 관계를 나타낼 때 표현하는 방법이다.
3. Sprint과제 복기!🧐
데이터베이스와 연결하는 부분에서 많이 애를 먹었다. 주어진 과제에서 보면 데이터베이스를 연결하는 코드는 이미 다 짜여져있다는데 나는 왜 연결이 안되는가???
Error: the string "ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client" was thrown, throw an Error :) 이런 에러가 떴고, 해결하려고 찾아보니 이 문제는 "caching_sha2_password"를 소화하지 못해서 생기는 오류라고 한다. 그래서 클라이언트 프로그램에서 사용할 수 있도록 유저의 패스워드 Plugin을 바꿔주란다.
어떻게 하냐?
mysql에 접속해서 아래와 같이 입력하면
mysql> SELECT Host,User,plugin,authentication_string FROM mysql.user;
이렇게 뜨는 것을 볼 수 있을 것이다. 저기 plugin 부분을 수정해 주어야 한다. 아래처럼 작성하면 수정해줄 수 있다.
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourpassword';
yourpassword를 따라치지말고 본인의 패스워드를 설정해주는 것이니까 mysql에 접속할 때 사용할 본인 패스워드를 입력해주면 된다.
입력을 해주고
plugin이 저렇게 바뀌었다면 이제 잘 될 것이다.
그 다음 schema.sql에서 요구사항에 맞는 content테이블을 생성해주어야 한다.
CREATE TABLE `content` (
`id` int PRIMARY KEY AUTO_INCREMENT,
`title` varchar(255) not NULL,
`body` varchar(255) not NULL,
`created_at` timestamp not NULL DEFAULT CURRENT_TIMESTAMP,
`userId` int,
FOREIGN KEY (`userId`) REFERENCES `user` (`id`)
);
그 다음 현재 있는 데이터베이스에 존재하는 모든 테이블 정보를 보기위한 SQL을 작성해야 한다. 아래처럼 작성해주면 learnmysql 데이터베이스에 존재하는 모든 테이블 정보를 볼 수 있다.
const PART3_1 = `SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'learnmysql'`;
위 처럼 작성하면 use database_name 데이터베이스가 선택되어 있지 않아도 볼 수 있고, 데이터베이스가 선택되어 있다면
SHOW TABLES
위처럼 간단하게 작성해서 테이블 정보를 볼 수 있다.
다음은 user테이블의 구조를 보기위한 SQL, content 테이블의 구조를 보기위한 SQL을 작성하면 된다.
const PART3_1 = `DESCRIBE user`;
const PART3_2 = `DESCRIBE content`;
이렇게 해주면 오늘 과제는 모두 통과가 된다.
'코드스테이츠 수강 TIL > Section 3' 카테고리의 다른 글
56, 57일차 [데이터베이스] MVC (0) | 2021.10.16 |
---|---|
55일차 [데이터 베이스] 관계형 데이터베이스3 (0) | 2021.10.13 |
53일차 [데이터베이스] 관계형 데이터베이스1 (0) | 2021.10.09 |
52일차 [자료구조/알고리즘2] 중복순열, 순열, 조합 (0) | 2021.10.09 |
51일차 [자료구조/알고리즘] Greedy Algorithm (0) | 2021.10.07 |