Skip to content

2024.07.11 백엔드 ERD 회의

재우 edited this page Jul 11, 2024 · 2 revisions

회의 전 초기 ERD

회의 토픽

extension을 따로 테이블로 분리할 것인가?

(찬성) 분리하자 📌

  • extension은 연결된 language가 존재한다.
  • (데이터무결성) 이를 매번 snippet에 입력된 extension에 연결된 language를 찾아서 추가해야한다.
  • (데이터무결성) 분리하지 않았을 때, 수정 시 수정 오류가 발생할 가능성이 크다.
  • 정규화 된 테이블이라고 생각한다.

(반대) 분리하지 말자


language를 따로 테이블로 분리할 것인가?

(찬성) 분리하자 📌

  • (데이터무결성) 분리하지 않았을 때, 수정 시 수정 오류가 발생할 가능성이 크다.
  • enum을 썼을 경우, 배포를 다시 해야한다.

(반대) 분리하지 말고 enum을 쓰자


varchar의 크기 설정 방식은?

1. 255자 최대 크기로 설정하자 📌

  • varchar는 가변 길이 문자열이기 때문에 varchar의 값은 최대 길이를 의미하는 것이다.
    • 크게 해도 차지하는 메모리는 사용된 문자열 길이
  • 255 이상은 가변 문자열이기 때문에 성능 이슈가 생기긴함
  • 길이를 제한하는 크기로 할 경우, 요구사항 변경이 생겼을 때 프로그램 설정이 아니라 데이터베이스 설정이 변경되어야한다.
  • 길이 제한은 DB 단이 아니라 프로그래밍 단에서 잡아주면 되지 않을까?

2. 요구 사항에서 제한하는 크기로 설정하자

ex. 템플릿 제목은 127자일 때 varchar(127)

  • 요구 사항과 DB를 동등하게 제한을 두고 싶다

template의 대표 snippet은 어떻게 설정할 것인가?

1. representative_snippet 테이블 생성

  • 장점
    • 초기 테이블 세팅에 null 이 존재하지 않는다
  • 단점
    • 결국엔 JPA 이용 시 문제 발생할 수 있지 않을까? (어려움 존재)

2. template 테이블에 ‘대표 snippet’ 필드 추가

  • 장점
    • 간단하다
  • 단점
    • 순환 참조가 발생한다. (snippet이 template를 참조, template도 snippet을 참조)
    • 초기 테이블 세팅에 null이 존재한다

3. snippet 테이블에 ‘order’ 필드 추가 → 1번째 order가 대표

  • 장점
    • 간단하다
    • 초기 테이블 세팅에 null 이 존재하지 않는다
  • 단점
    • 첫 번째 snippet이 대표가 아닐 수도 있다 (매우 중요)
  • 해당 사항은 대표 snippet을 설정하는 필드가 아닌 기본 필드여야 할 것 같다.

4. snippet 테이블에 ‘대표 파일 여부’를 필드 추가

  • 장점
    • 초기 테이블 세팅에 null 이 존재하지 않는다
  • 단점
    • 검색 시 snippet을 다 확인해야 하는 성능 이슈
      • 인덱싱으로 설정할 수 있다

회의 최종 결과

Screenshot 2024-07-11 at 2 21 09 PM

table member {
  id BIGINT [pk, increment]
  email VARCHAR(255) [unique, not null]
  password VARCHAR(255) [not null]
  nickname VARCHAR(255) [not null]
  created_at TIMESTAMP
  modified_at TIMESTAMP
}

table template {
  id BIGINT [pk, increment]
  member_id BIGINT [not null, ref: > member.id]
  title VARCHAR(255) [not null]
  created_at TIMESTAMP
  modified_at TIMESTAMP
}

table snippet {
  id BIGINT [pk, increment]
  template_id BIGINT [not null, ref: > template.id]
  extension_id BIGINT [not null, ref: - extension.id]
  filename VARCHAR(255) [not null]
  content TEXT [not null]
  order INT [not null]
  created_at TIMESTAMP
  modified_at TIMESTAMP
}

table representative_snippet {
  template_id BIGINT [pk, ref: - template.id]
  snippet_id BIGINT [not null, ref: - snippet.id]
  created_at TIMESTAMP
  modified_at TIMESTAMP
}

table language {
  id BIGINT [pk, increment]
  name VARCHAR(255) [NOT NULL]
  created_at TIMESTAMP
  modified_at TIMESTAMP
}

table extension {
  id BIGINT [pk, increment]
  language_id BIGINT [not null, ref: - language.id]
  name VARCHAR(255) [not null]
  created_at TIMESTAMP
  modified_at TIMESTAMP
}

데이터 관리

DB

  • 실행 DB
  • 로컬 DB
  • 테스트 DB

로컬 서버에서 초기 데이터 관리 방법

  • language table은 data.sql 이용
  • yml 파일 이용
  • main/develop 브랜치에는 옮기지 말자 (yml 설정에서 data.sql 사용을 지워라)
    • 어차피 배포 시에는 초기 한번만 사용할 sql 문이니, github에 문서를 올리지 말자

시안 예시

⚡️ 코드zap

프로젝트

규칙 및 정책

공통

백엔드

프론트엔드

매뉴얼

백엔드

기술 문서

백엔드

프론트엔드

회의록


Clone this wiki locally