Django

ERD 설계, 구축_특강

끈끈 2023. 4. 5. 15:10

 

ERD
(Entity Relationship Diagram)

 

  • 와이어프레임(UI/UX) 구성 후 진행하면 편함
  • 나타낼/저장할 정보 파악 : 작성자, 제목, 태그, 조회수, 댓글, 좋아요, 작성일 등

 


 

데이터 모델링

 개념적 모델링

 

  • 데이터 간의 관계를 구상
  • 각 개체들간의 관계를 발견하고 표현
  • 간단 명료한 ERD 그리기

 

 

 논리적 모델링

 

  • 개념적 모델링의 구체화
  • 데이터 타입 명시
  • Key, 속성, 관계 표시

 

 

관계의 참여도

 

erdcloudd

 

반원 표시들은 1:N의 관계

 

외래키/ForeignKey

 

  • 1(부모 테이블):N(자식 테이블)의 관계에 사용
  • 하나의 테이블에 많은 column이 생겨야 하는 경우 매우 비효율적
  • ForeignKey(참조 모델(테이블), on_delete=개체 삭제시 수행동작, related_name=개체관계에서 사용할 이름, db_column=db상 필드 이름)
  • db_column은 지정해주지 않으면, Review 모델 안에 movie는 db에서 column명이 movie_id로 된다

 

on_delete 종류 : CASCADE, DO_NOTHING 추천

 

  • ForeignKey ERD 표현

 

  • 식별관계 (실선)

부모 테이블의 PK가 자식 테이블의 PK(Primary Key, 기본키) / FK(Foreign Key, 외래키) 가 되는 경우

부모가 있어야 자식이 생기는 경우

  • 비식별관계 (점선)

부모 테이블의 PK가 자식 테이블의 일반 속성이 되는 경우

부모가 없어도 자식이 생기는 경우

 

Many To Many

  • M:N의 관계
  • 논리적으로 표현은 가능, django - sqlite3처럼 manytomanyfield를 지원하는 경우 따로 테이블 생성이 필요 없음
  • 하지만, 해당 필드를 지원하지 않는 db 사용시 연결해 줄 테이블이 필요
  • ManyToManyField(참조 모델(테이블), related_name=개체관계에서 사용할 이름)

 

  • Many To Many ERD 표현

논리적으로만 표현

 

테이블을 추가하여 표현

 

물리적 모델링

 

  • 논리적 모델링 후 진행
  • 실제 데이터 베이스 테이블 생성
  • 필요한 column을 지정해주는 과정
  • Django에서 models.py 사용
  • makemigrations, migrate 과정

 

from django.db import models
from django.conf import settings

class Movie(models.Model): # 영화정보 저장 모델
    title = models.CharField(max_length=100)
    poster_URL = models.URLField(max_length=200)
    content = models.TextField()

class Review(models.Model): # 영화 Review 저장 모델
    movie = models. ForeignKey(Movie, on_delete=models.CASCADE) # movies 1:N의 관계 / model 삭제시 함께 삭제
    title = models.CharField(max_length=100)
    content = models.TextField()
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True, blank=True)
    updated_at = models.DateTimeField(auto_now=True, blank=True)
    like_users = models.ManyToManyFleld(settings.AUTH_USER_MMODEL, related_name='like_reviews') # 좋아요를 위한 M:N

class Comment(models.Model):
    review = models.ForeignKey (Review, on_delete=models.CASCADE) # review 댓글 위해
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    content = models.Charfield(max_length=300)

 


 

ERD 다이어그램 툴 추천 : ERD Cloud

 

https://www.erdcloud.com/

 

ERDCloud

Draw ERD with your team members. All states are shared in real time. And it's FREE. Database modeling tool.

www.erdcloud.com