본문 바로가기
Memo/BootCamp : TIL

[Day 44] 관계형 데이터베이스 - 설계

by 달의 조각 2022. 8. 5.

학습 주제

 

데이터베이스 구조와 관계
스키마 디자인

 


 

새롭게 배운 내용

 

관계

  • 1:1 관계: 잘 사용되지 않는다
  • 1:N 관계: 가장 많이 사용된다
  • N:M 관계: Join 테이블을 만들어서 관리한다
    - 두 개의 테이블과 1:N(일대다) 관계를 형성하는 새로운 테이블로 N:N(다대다) 관계를 나타낼 수 있다
    - 조인 테이블을 위한 기본키는 반드시 있어야 한다
  • 자기참조 관계(Self Referencing Relationship)
  • 만약 외래키를 리스트 형식으로 관리하는 필드가 있다면, 어떤 문제가 발생할까?

 

스키마 디자인

CREATE TABLE post (
  num     int     PRIMARY KEY AUTO_INCREMENT,
  user_id varchar,
  FOREIGN KEY (user_id) REFERENCES user(id),
  media   blob NOT NULL,
  time timestamp
);

CREATE TABLE user (
  id int PRIMARY KEY AUTO_INCREMENT,
  name varchar NOT NULL,
  password varchar NOT NULL,
  post blob,
  FOREIGN KEY (post) REFERENCES post(num),
);

CREATE TABLE comment (
  user_id  varchar PRIMARY KEY,
  FOREIGN KEY (user_id) REFERENCES user(id),
  post_num int     NOT NULL,
  FOREIGN KEY (post_num) REFERENCES post(num),
  message  varchar AUTO_INCREMENT,
  time timestamp
);

CREATE TABLE like (
  post_num int     PRIMARY KEY,
  FOREIGN KEY (post_num) REFERENCES post(num),
  user_id  varchar PRIMARY KEY,
  FOREIGN KEY (user_id) REFERENCES user(id),
  count    int     AUTO_INCREMENT
);

CREATE TABLE hashtag (
  post_num int     PRIMARY KEY,
  FOREIGN KEY (post_num) REFERENCES post(num),
  user_id  varchar PRIMARY KEY,
  FOREIGN KEY (user_id) REFERENCES user(id),
  tag      varchar
);

CREATE TABLE following (
  id      varchar PRIMARY KEY,
  FOREIGN KEY (id) REFERENCES user(id),
  following_id  varchar
  FOREIGN KEY (following_id) REFERENCES user(id),
);

CREATE TABLE follow (
  id           varchar PRIMARY KEY,
  FOREIGN KEY (id) REFERENCES user(id),
  follow_id varchar
  FOREIGN KEY (follow_id) REFERENCES user(id),
);

 

🌳 라이브러리 vs. 프레임워크

라이브러리: 원하는 기능을 원하는 방식으로 사용 가능
프레임워크: 짜여진 구조 안에서 기능을 구현할 수 있어서 편리하지만 내부 구조를 알기 어렵다

 

🌳트랙잭션 속성 - Isolation(고립성)과 Durability(지속성)

Isolation에 대해 이해할 때 '트랜잭션이 동시에 실행될 때와 연속으로 실행될 때의 데이터베이스 상태가 동일해야 한다'의 의미가 아리송했는데, 계좌 이체를 예시로 단번에 이해했다.

계좌 A에서 계좌 B로 이체를 할 때, A에서의 인출과 B에 돈이 들어오는 행위는 연속적(한 번에)으로 일어나는 것처럼 보이지만, A에서 돈이 인출되고 B에 돈이 들어오는 과정이 각각 별개의 일이라고 이해하면 된다.

Durability의 경우는 통장에 월급이 들어왔다면 이 상태가 계속 지속되어야 한다는 것이다. 휘발되면 안 된다!

 

 

보강할 내용

 

🌿 System.arraycopy와 Arrays.copyOfRange의 차이

🌿 트랜잭션, ACID, CSP

🌿 정규화와 비정규화

🌿 CAP Theorem와 PACELC Theorem

🌿 CASCADE

🌿 수직적 확장과 수평적 확장

 

 

회고

 

💫 SQL 명령어를 외우기보다 데이터베이스 구조와 관계를 중점으로 공부하기
💫 관계형 DB와 비관계형 DB 모두 다룰 수 있으면 좋다!
💫 프로젝트 시 어떤 유형의 DB를 선택해야 하고, 선택한 이유에 대해서 분석해 볼 것
💫 스프링 프레임워크의 경우 고도로 추상화되어 있는데, 흐름을 이해해야 에러에 마주했을 때 대응할 수 있다

 

아침과 오후 라이브 강의 시간에 집중도를 높이기 위하여 다른 창을 켜 두지 않고 메모할 일이 생길 때에만 노션에 기록을 했다. 이전에 커리큘럼을 토대로 작성해 둔 일정표에 정리를 해 두니 보기도 좋아서 뿌듯했다. 확실히 기억해 두고 싶은 것들을 바로바로 메모를 하니까 내가 어떤 포인트를 중점으로 학습을 해야 하는지, 무엇을 더 공부해야 하는지, 그리고 어떤 부분에서 깊이를 가져야 하는가를 정리할 수 있어서 좋다.

오늘은 인스타그램 기능을 데이터베이스 스키마 디자인 하는 시간을 가졌다. 게시물 업로드와 댓글, 좋아요 기능 정도만 구성하는 것이었는데, 생각보다 서로 어떤 관계를 맺고 있는지 모호하게 느껴져서 쉽지 않았다. 아래와 같이 구성을 했지만 좋아요 기능에 유저의 아이디와 게시물의 번호가 모두 들어가야 하는지, 팔로우와 팔로잉 기능은 따로 두는 게 맞는지 모르겠다. 월요일에 굿모닝 세션 강의를 듣고 보강해야겠다.

 

★★★★★

댓글