프로젝트/PlaNa

DB 설계

vy00 2025. 6. 18. 15:59

1. 엔티티 설계시 명명 규칙

- PK

  • 테이블마다 id로 통일
  • prefix를 붙이지 않고 간결하
  • ex: user.id, product.id, schedule.id
SELECT u.id, u.name
FROM user u;

 

- FK

  • 참조 테이블명을 prefix로 붙여 작성
  • ex: user_id, saller_id, product_id

- 컬럼명 규칙

  • 컬럼명에는 테이블을 붙이지 않음
  • ex: title, price, created_at
  • 테이블이 다른 컬럼과 구분이 필요하면 별칭 사용

- 시간 관련

  • 날짜만 : *_date ( ex: birthd_date, join_date )
  • 시간만 : *_time ( ex: alarm_time )
  • 날짜 + 시간 : *_at ( ex: creaged_at, start_at, updated_at)
  • TIMESTAMP 타입 사용 권장 ( DATETIME보다 공간 효율 높음, 단 2038년까지 제한 있음)

2. DB 성능을 높이는 튜닝 기법

- 인덱스 튜닝

  • 목적 : 데이터 조회 속도 향상
  • 특정 컬럼에 인덱스를 걸어두명 DB가 전체 데이터를 훑지 않고 필요한 값을 빠르게 찾을 수 있다.
  • 적용 대상 : WHERE, JOIN, ORDER BY, GROUP BY
CREATE INDEX idx_user_email ON user(email);

 

 

- 쿼리 튜닝

  • 목적 : 불필요한 연산 제거로 쿼리 성능 개선
  • DB가 불필요하게 많은 데이터를 읽거나 복잡한 계산을 하지 않도록 쿼리를 최적화함
  • 개선방법 예시
--불필요한 서브쿼리 제거

-- 느림
SELECT name FROM user WHERE id IN (SELECT user_id FROM orders);

--  빠름 (JOIN으로 대체)
-- DISTINCT는 중복을 제거하고 유일한 값을 가져오는 것
SELECT DISTINCT u.name FROM user u JOIN orders o ON u.id = o.user_id;

 

-- 전체 데이터 훑게 됨
WHERE YEAR(created_at) = 2024

-- 인덱스 사용 가능
WHERE created_at BETWEEN '2024-01-01' AND '2024-12-31'

 

- 스키마 튜닝

  • 목적 : 테이블 구조 최적화로 저장 효율과 조회 속도 개선
  • 정규화 : 데이터를 중복 없이 구조화해서 데이터 무결성을 유지하고, 저장공간을 효율적으로 사용하는 설계방식
  • 정규화 방식 : 중복 데이터 제거, 테이블 나누기 ( 예: 사용자와 주소를 분리 )
  • 반정규화 : 성능을 위해 정규화된 데이터를 다시 합치거나 중복을 허용하여 조회 속도를 높이는 설계 방식
  • 반정규화 방식 : 조회 성능이 중요한 경우 일부 중복 허용 ( 예: 게시글 조회 시 user_name도 함께 보여야 할 경우, post테이블에 user_name 컬럼 추가 )
  • 쓰기보다 읽기가 훨씬 많다면 반정규화도 검토해볼만 하다.
  • 빈번한 JOIN은 성능 저하의 원인이 된다.

- 캐시 및 메모리 튜딩 ( Redis 활용)

  • 목적 : 자주 조회되는 데이터를 메모리에 저장해 DB 부담 완화
  • 캐시는 휘발성이지만 매우 빠르다.
  • DB에 요청하지 않고 미리 저장해둔 값을 반환함으로써 응답 속도 향상
  • 예: 로그인 후 사용자 정보, 인기 게시글 목록, 지역코드/ 공통 코드 등 자주 바뀌지 않는 데이터
KEY: user:1234
VALUE: { "name": "하늘", "level": 3, "token": "..." }
TTL: 3600초 (1시간)

 

- 파티셔닝 튜닝

  • 목적 : 테이블을 분리하여 특정 범위만 조회되도록 최적화
  • 하나의 테이블을 물리적으로 여러 조작(파티션)으로 나누어 쿼리 범위를 제한함
  • 종류 : Range 파티셔닝은 날짜 기준 분할 (예: 연도별), List 파티셔닝은 사용자 ID/ 지역코드 기준 분할
  • 예: 로그 데이터 테이블을 log_2023, log_2024로 분할하여 연도별 조회 성능 향상 -> WHERE year = 2024로 조회하면 전체 테이블이 아닌 해당 파티션만 검색

- 하드웨어 / 시스템 튜닝

  • 목적 : DBMS의 처리 성능 자체를 높임
  • 개선 방법 
    • SSD 적용: 디스크 I/O 속도 향상
    • 메모리 증설: In-memory 연산, 캐시, 버퍼 등 처리 효율 증가
    • 병렬 처리 설정: 다중 쿼리를 동시에 처리하도록 CPU 코어 최적화
    • DB 설정 조정