Wecode - Foundation 1 (부트캠프)/Westagram (Mysql, Node.js, Express)

[MySQL로 Database 만들기] 1. DDL, DML 사용 (ERD 연결)

JBS 12 2023. 9. 4. 21:56

이후 프로젝크 3차 하면서 sql 공부하면서 채우게 된 

 

[SQL복습 ] 과제

https://pm-developer-justdoit.tistory.com/70 Foundation 2 과제 - sns posting 게시물 CRUD [포스팅 생성, 조회, update, 삭제] ** westagram을 만들 건데 백엔드는 기능만 만드는 것. [백엔드가 넣을 기능들] Express를 이용

pm-developer-justdoit.tistory.com


1번 데이터베이스 만들기, 각 테이블 만들기

스키마 = 데이터베이스 

여러 테이블들이 모인 거 = 데이터베이스 

 

뭐가 테이블이고 데이터베이스이고, 이름 읽을 줄 알아야 

과제 1. 아래 제공된 ERD(Entity Relational Diagram)를 참고하여 MySQL Server 내에 “westagram” 이름의 스키마를 생성한 후에, DDL을 사용하여 “westagram” 스키마 내에 users, posts, comments, likes 테이블 객체를 구현합니다.

늘 글은 어려워보이는데, 알고나면 쉽다

 

문제파악부터. 1. 스키마 치고 DB 만들고

2. create table 하라는구나 (DDL - create, 어쩌구) 


erd 읽기- 관계 파악 

  • 발이 여러개면 '다'
  • 발이 하나면 '일' 

 

얘는 양쪽에 발이 여러개니까 '다대다'

한명의 사용자가 likes도 여러개 post도 여러개 가능, 여러명의 사용자가 likes, posts 가능 (다대다)

 

 

 

users의 pk 하나를 comments table의 fk 로 받는 것 (comments에게는 users 가 외부니까) 

1 : 다 


 

전체적인 순서 흐름만 잡으면 이렇다. 

 

create database "westagram"; 

use westagram;

create table "users";

create table "posts";

create table "comments";

create table "likes";

 

show tables;


코딩 

 

 

 

CREATE TABLE users( 

id INT NOT NULL AUTO_INCREMENT, 

name VARCHAR(50) NOT NULL,  

email VARCHAR(200) NOT NULL, 

password VARCHAR(200) NOT NULL, 

created_at TIMESTAMP NOT NULL DEFAULT NOW(), 

updated_at TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP, 

PRIMARY KEY (id) );

 

대소문자 상관없음, 시각화 (팀 할 떈 대문자 해야

<user> user table에서는 fk 가 없다

 

create table likes (
    -> id INT NOT NULL AUTO_INCREMENT,
    -> user_id INT NOT NULL,
    -> post_id INT NOT NULL,
    -> PRIMARY KEY(id)

    -> FOREIGN KEY (post_id) REFERENCES posts(id)  

    -> FOREIGN KEY (user_id) REFERENCES users(id)  #comments 테이블의 primary키 가져오는데, comments 테이블에서 참고해라  맞는지 확인 

    -> );

 

<likes> likes 테이블 fk에 user_id, post_id 가 있다, 이게 바로 fk // users 와 posts 테이블에서는 pk

 

create table posts (
    -> id INT NOT NULL AUTO_INCREMENT,
    -> title VARCHAR(100) NOT NULL,
    -> content VARCHAR(3000) NULL,
    -> user_id INT NOT NULL,
    -> created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    -> updated_at TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP,
    -> PRIMARY KEY(id)

    -> FOREIGN KEY (user_id) REFERENCES users (id)  

    -> );

 

<posts> posts 테이블의 fk에 있는 user_id 를 보면 됨. // user_id를 fk로 받음, user 테이블의 pk로 받음 // 화살표가 comments 테이블로도 가지만, fk가 아닌 이유는, posts의 pk를 comments fk로 주는 것 (comments 의 fk에 post_id가 있음) // 화살표가 pk에 있는지 fk에 있는지 봐야 함!&nbsp; fk에 있는 다른 테이블_id를 볼 것!


create table comments (
    -> id INT NOT NULL,
    -> content VARCHAR(3000) NOT NULL,
    -> user_id INT NOT NULL,
    -> post_id INT NOT NULL,
    -> created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    -> updated_at TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP,
    -> PRIMARY KEY(id)

    -> FOREIGN KEY (user_id) REFERENCES users (id)  

    -> FOREIGN KEY (post_id) REFERENCES posts (id)  

    -> );

 

<comments> fk에 있는 다른 테이블 user_id, post_id 이 fk이다. --> Posts 테이블의 pk, users의 pk 임

 

1번에서는 행과 렬, 목차만 잡은 거고,(회색)

2번에서 표 안에 들어갈 데이터 채워주기 (흰색)

         
         
         

2번 데이터 추가

추가는 insert into 사용 

과제 2.
MySQL의 DML(Data Manipulation Language)를 사용하여, 각 테이블에 data를 추가합니다. 반드시 아래에 제공되는 예제 데이터를 사용할 필요는 없습니다. 자유롭게 만들어주세요.

문제파악부터.  테이블에 데이터 추가하라네 -> insert into 써야 하고. (DML)

 

형태 

insert into [tablename] (목차1, 목차2, 목차3) values ("값1", "값2", "값3");

insert into [tablename] (목차1, 목차2, 목차3) values ( ("값1", "값2", "값3"), ("값1", "값2", "값3") );

 

INSERT INTO users (name, email, profile_image, password)               

VALUES ( ("Rebeca", "Rebeca@email.com", "image_1", "@@#"),                  #name email profile_image password 이렇게 한 줄 씩 하는 거/ name 한꺼번에, email 한꺼번에 이런 식이 아니라. 

("Reb", "Reb@email.com", "image_2", "@@1#"),

("ca", "ca@email.com", "image_3", "@@#2"),

("Ka", "Ka@email.com", "image_4", "@@#3") );

 

데이터 추가한 users table 한번 보기

mysql> SELECT * FROM users;           

 

 

cf. mysql> SELECT name FROM users;        #만약에 name만 보고 싶으면 Rebeca,Reb,ca,Ka

심화버전:   ("Rebeca", "Rebeca@email.com", "image_1", "@@#") 한줄 보고 싶으면,
select * from users; 로 모두 추출 후에, limit 사용

위에서 만든 mysql database로 아래 과제가 연결된다. 

 

1)

 

[Express 초기 환경세팅/ TypeORM 설치] **(주황색)

-Westagram Backend Project - 1. Express 초기 환경 설정 Express 설치 / 적용 nodemon 설치 / 적용 cors 설치 / 적용 dotenv 설치 / 환경 변수 적용 morgan 설치 / 적용 https://www.notion.so/wecode/Node-Express-da9ab2a0a3a64f75aedb1723

pm-developer-justdoit.tistory.com

 

2)

 

 

[Express 초기 환경세팅] 2. database 연결- dbConnection 설정

-Westagram Backend Project - TypeORM 설치 및 적용 dbConnection 정상 작동 확인 아래 링크에서 진행했던 TypeORM 설치에서 이어져서, [Express 초기 환경세팅/ TypeORM 설치] **(주황색) -Westagram Backend Project - 1. Express

pm-developer-justdoit.tistory.com

3)

https://pm-developer-justdoit.tistory.com/37