본문 바로가기

DB 설계

데이터베이스(DB) 설계는 서비스의 데이터를 어떻게 저장하고 관리할지 정하는 과정입니다. 잘 설계된 데이터베이스는 데이터의 무결성을 보장하고, 검색 속도를 높이며, 확장하기 쉽습니다.

1. 데이터베이스란

데이터베이스는 데이터를 체계적으로 저장하는 공간입니다. 엑셀 시트를 떠올리면 이해하기 쉽습니다.

id제목내용작성자작성일
1첫 번째 글안녕하세요홍길동2025-01-01
2두 번째 글반갑습니다김철수2025-01-02

위와 같은 표 하나를 테이블(Table) 이라고 합니다. 데이터베이스는 이런 테이블들의 모음입니다.

  • 테이블(Table): 데이터를 저장하는 표
  • 행(Row): 하나의 데이터 레코드 (예: 하나의 게시글)
  • 열(Column): 데이터의 속성 (예: 제목, 내용, 작성자)
  • 기본키(Primary Key): 각 행을 고유하게 식별하는 값 (예: id)

2. 테이블 간의 관계

실제 서비스에서는 여러 테이블이 서로 연결되어 있습니다. 이 연결 관계를 이해하는 것이 DB 설계의 핵심입니다.

2.1 일대다 관계

일대다 관계 1:N는 가장 흔한 관계입니다. 하나의 레코드가 여러 개의 레코드와 연결됩니다.

  • 하나의 사용자가 여러 개의 게시글을 작성할 수 있음
  • 하나의 게시글에 여러 개의 댓글이 달릴 수 있음
  • 하나의 카테고리에 여러 개의 상품이 속할 수 있음

2.2 다대다 관계

다대다 관계 N:M는 양쪽 모두 여러 개와 연결될 수 있는 관계입니다. 중간 테이블이 필요합니다.

  • 한 학생이 여러 강좌를 수강하고, 한 강좌에 여러 학생이 등록
  • 한 게시글에 여러 태그, 한 태그가 여러 게시글에 사용

2.3 일대일 관계

일대일 관계 1:1는 하나의 레코드가 정확히 하나의 레코드와 연결됩니다.

  • 한 사용자는 하나의 프로필만 가짐

3. AI 네이티브 DB 설계

AI를 활용하면 복잡한 DB 설계도 빠르게 시작할 수 있습니다.

3.1 기본 프롬프트

나는 [서비스 종류]를 만들려고 해.
주요 기능은 다음과 같아:
- [기능 1]
- [기능 2]
- [기능 3]

Django 모델로 데이터베이스를 설계해줘.
각 모델의 필드와 관계를 설명해주고,
ERD(Entity Relationship Diagram)도 Mermaid로 그려줘.

3.2 블로그 서비스 예시

나는 개인 블로그를 만들려고 해.

[주요 기능]
- 사용자 회원가입, 로그인
- 게시글 작성, 수정, 삭제
- 카테고리별 게시글 분류
- 댓글 작성, 삭제

[URL 설계]
[앞서 진행한 URL 설계 내용 삽입]

Django 모델로 데이터베이스를 설계해줘.
각 모델의 필드와 관계를 설명해주고,
ERD도 Mermaid로 그려줘.

AI는 다음과 같은 설계를 제안할 것입니다.

User (사용자)

Django의 기본 User 모델을 사용하거나 확장합니다.

필드타입설명
idInteger기본키, 자동 증가
usernameCharField사용자 아이디
emailEmailField이메일 주소
passwordCharField비밀번호 (암호화)
created_atDateTimeField가입일

Category (카테고리)

필드타입설명
idInteger기본키, 자동 증가
nameCharField카테고리 이름
slugSlugFieldURL용 식별자

Post (게시글)

필드타입설명
idInteger기본키, 자동 증가
titleCharField제목
contentTextField내용
authorForeignKey(User)작성자 (1:N)
categoryForeignKey(Category)카테고리 (1:N)
created_atDateTimeField작성일
updated_atDateTimeField수정일

Comment (댓글)

필드타입설명
idInteger기본키, 자동 증가
contentTextField댓글 내용
authorForeignKey(User)작성자 (1:N)
postForeignKey(Post)게시글 (1:N)
created_atDateTimeField작성일

4. DB 설계 시각화 (ERD)

ERD(Entity Relationship Diagram)는 테이블 간의 관계를 시각적으로 표현합니다. Mermaid를 사용하면 쉽게 그릴 수 있습니다. 여러분은 AI가 생성한 ERD를 참고하여 데이터베이스 구조를 한눈에 파악하고 추가할 것을 고민하고, 필요하면 수정요청을 하여 완성도를 높여갈 수 있습니다. 예를 들어, '유저에는 프로필 사진이 있으면 좋겠다'라든지 '게시글에 태그 기능이 있으면 좋겠다' 같은 추가 요구사항을 반영할 수 있습니다. 중요한 포인트는 int나 string 같은 필드 타입을 이해하는 것이 아니라, 테이블에 있는 필드의 역할, 그리고 테이블 간의 관계를 이해하는 것입니다.

4.1 블로그 ERD

5. Django 모델로 구현하기

설계한 DB를 Django 모델로 구현하는 방법을 살펴보겠습니다. 역시나 AI가 코드를 거의 오류 없이 작성하기 때문에, 여러분은 모델이 어떤 파일에서 어떻게 구성되는지 이해하는 데 집중하세요.

5.1 블로그 모델 예시

# models.py
from django.db import models
from django.contrib.auth.models import User

class Category(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(unique=True)

    def __str__(self):
        return self.name

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

class Comment(models.Model):
    content = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f'{self.author}의 댓글'

5.2 주요 필드 타입

필드 타입설명예시
CharField짧은 문자열제목, 이름
TextField긴 문자열본문, 설명
IntegerField정수가격, 수량
DecimalField소수점 숫자정확한 가격
BooleanField참/거짓공개 여부
DateTimeField날짜와 시간작성일, 수정일
EmailField이메일사용자 이메일
ImageField이미지 파일프로필 사진, 상품 이미지
ForeignKey일대다 관계게시글의 작성자
ManyToManyField다대다 관계게시글의 태그들

5.3 관계 설정 옵션

# 일대다 관계 (ForeignKey)
author = models.ForeignKey(
    User,
    on_delete=models.CASCADE,  # 사용자 삭제 시 게시글도 삭제
    related_name='posts'        # 역참조 이름: user.posts.all()
)

# on_delete 옵션
# CASCADE: 함께 삭제
# SET_NULL: NULL로 설정 (null=True 필요)
# SET_DEFAULT: 기본값으로 설정 (default 필요)
# PROTECT: 삭제 방지 (에러 발생)