DataBase

[DB]ERD 설계

Y0un9Ki 2024. 4. 11. 18:14
728x90
반응형

오늘은 강사님이 보내주신 유튜브를 보면서 ERD에 대해서 어떻게 공부를 해야하는지에 대해서 블로그를 작성해 보려고 한다.

 

필자가 세미 프로젝트를 진행하면서 서버와 API를 짜면서 데이터베이스 Django에서는 model이라고 하는데 이것을 어떻게 짜야할까를 고민했었었다. 하지만 아직 웹을 만들고 model을 만드는데 짜임새가 있지 않고 ERD에 대한 지식도 없었기에 세미 프로젝트를 했을 때에는 그냥 일단 만들었다.

 

#User의 model

class User(AbstractBaseUser, PermissionsMixin):

    # These fields tie to the roles!
    ADMIN = 1
    MANAGER = 2
    COMMON_USER = 3

    ROLE_CHOICES = (
        (ADMIN, 'Admin'),
        (MANAGER, 'Manager'),
        (COMMON_USER, 'common_user')
    )
    
    class Meta:
        verbose_name = 'user'
        verbose_name_plural = 'users'
    # Roles created here
    uid = models.UUIDField(unique=True, editable=False, default=uuid.uuid4, verbose_name='Public identifier')
    username = models.CharField(unique=True, blank=False, max_length=10, 
                                help_text = '이름을 입력해주세요')
    location = models.CharField(max_length=100, blank=True)
    role = models.PositiveSmallIntegerField(choices=ROLE_CHOICES, blank=True, null=True, default=3)
    date_joined = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField(default=True)
    is_deleted = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    created_date = models.DateTimeField(default=timezone.now)
    modified_date = models.DateTimeField(default=timezone.now)
    
# Post의 model

class Post(models.Model):
    id = models.AutoField(primary_key=True, null=False, blank=False)
    user = models.ForeignKey(User, blank=True, null=True, on_delete = models.CASCADE)
    title = models.TextField(blank=True)
    content = models.TextField(blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    # comment = models.TextField(blank=True, null=True)    
    class Meta:
        ordering = ['id']
        
    def __str__(self):
        return self.title
    
class Comment(models.Model):
    id = models.AutoField(primary_key=True, null=False, blank=False)
    post = models.ForeignKey(Post, null=False, blank=False, on_delete=models.CASCADE)
    user = models.ForeignKey(User, null=False, blank=False, on_delete=models.CASCADE)
    comment = models.TextField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    
    class Meta:
        ordering = ['id']
        
    def __str__(self):
        return self.comment


    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['location']

    objects = CustomUserManager()

    def __str__(self):
        return self.username

# notice의 model

class Notice(models.Model):
    id = models.AutoField(primary_key=True, null=False, blank=False)
    user = models.ForeignKey(User, on_delete = models.CASCADE)
    title = models.CharField(max_length = 9999, blank=True, null=True)
    content = models.TextField(max_length=9999, blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    
    class Meta:
        ordering = ['id']
        
    def __str__(self):
        return self.title

 

지금보면 맞게 잘 짯지만 아주 쉬운 서비스에 대해서 만들었기 때문에 누구라도 이정도의 DB설계는 할 수 있었을 것이다.

 

하지만 DB에 대해서 배우면서 능력있는 백앤드 개발자는 기획단계에서부터 ERD에 대해서 설계를 잘 해놔야 하며 추후에 추가될 기능을 위해서 미리 ERD를 짜놓을 줄 도 알아야 하는것을 개발자 친구가 실제 현업에서 일을 하면서 느겼다고 알려주었다. 꼭 ERD를 잘하는 개발자가 되어야 한다고 조언까지 해주었다.

 

ERD의 정의를 한번 보자.

 

ERD : ERD란 어떤 시스템의 데이터베이스 구조를 모델링할 때 이를 구성하는 고유한 특성을 가지는 개체(Entity)의 속성(Attribute)과 이들 간의 관계(Relationship)를 네트워크 형태의 구조로 나타낸 도식이다.Entity Relationship Diagram로 개체 관계도라고 불린다.

 

ERD의 블로그를 쓰면서 참고한 유튜브 영상이다.

https://www.youtube.com/watch?v=jsOPr3QfMW0

 

 

ERD는 어떠한 것이 있고 Entity와 Relationship, Attribute에는 무엇이 들어가는지 예시를 보면서 쉽게 이해해보자.

 

  • Entity : 사람, 물체, 개념(계정)
  • Relationship : Entity - Entity을 연결해주는 관계
  • Attribute : 사람 - 키, 몸무게, 성별 Entity의 속성을 알려주는 값이다.

ERD 식별자

주식별자(Primary Identifier)

  • 엔티티에 소속된 인스턴스들을 구별하는 기준역할을 하며 고유한 값을 갖는 속성이다.
  • 주식별자는 유일성, 최소성, 불변성, 존재성의 특징을 갖는다.
  • 주식별자는 하나가 아닌 여러 속성일 수 있다.(복합키)
  • 엔티티의 속성 중 주식별자 속성이 없다면 새로운 속성을 만들어줘야한다.(인위적 주식별자)
  • Primary Key(pk)라고 불린다.

외래식별자(Foreign Identifier)

  • 관계가 있는 두 엔티티를 부모, 자식 엔티티로 구분한 후 부모의 주식별자와 공통 속성이 자식에게도 존재한다면 그것을 상속한다는 표시를 하기 위해 외래식별자로 지정을 한다.
  • 자식 엔티티에 부모 엔티티 주식별자 공통 속성이 없을 경우 자식에게 속성을 추가한 후 외래식별자로 지정한다.
  • Foreign Key(fk)라고도 불린다.

엔티티 간의 관계

  • 상호 관계가 있는 두 엔티티 중에서 어느 쪽의 정보가 먼저 생성되는가에 따라 결정이 된다.
  • 상속을 받는 엔티티인 자식 엔티티는 부모 엔티티가 존재해야 존재할 수 있다.

참여도

  • 참여도에는 필수(Mandatory), 선택(option) 두가지로 존재한다.
    • 필수이면 작대기, 선택이면 동그라미 이다. 이것은 나중에 그림으로 보여줘야지
  • 어떤 기준이 되는 엔티티가 있을 때 반드시 대응되는 엔티티가 있다면 필수, 없거나 존재 할 수도 있다면 동그라미를 선택한다.

카디널리티

  • 2개의 엔티티 간 관계에서 엔티티에 속해 있는 인스턴스들을 수적으로 표현 한것이다.
  • 인스턴스가 1대1로 대응된다면 ' I '로 표시하고, 1대 N으로 대응된다면 ' ⪪ '로 표시한다.

 

ERD 표기법(관계)

가장 기본적으로 사용되는 관계를 나타내는 표시 들이다.

 

ERD 표기법(식별 - 비식별 관계)

식별관계

  • 1대N관계에서 외래 식별자가 자식 엔티티의 주식별자의 일부가 되는 관계이다.
  • PFK로 표시된다.
  • 자식 - 부모 관계처럼 1대1, 1대N 관계로 관계가 맺어질  때 부모엔티티를 상속받아서 FK로 받을 때 밑에 그림과 같이 실선으로 기호가 그려진다.
  • 부모 테이블에 데이터가 존재해야만 자식 테이블에 데이터를 입력하고 존재 할 수 있게된다.

비식별관계

  • 1대N관계에서 외래 식별자가 자식 엔티티의 주식별자 역할을 하지 못하고 단순히 새로운 속성으로 추가 되는 관계
  • FK로 표시된다.
  • 비식별 관계는 점선으로 표시가 된다.
  • 위에 PFK와 FK의 차이는 FK의 위치가 PK와 같은 위치에 있는 가를 보면 된다.
  • 부모 테이블에 데이터가 존재하지 않아도 자식 테이블에 독립적으로 데이터가 존재 할 수 있다.
    • 부모 테이블에 대한 의존성이 낮기에 자유로운 수정과 생성이 가능해진다.

이정도로 ERD의 설명은 마치고 실습을 진행해보았다.

 

위에 유튜브에서 기본적인 앨범함을 만드는 웹사이트를 피그마에 어떤 식으로 만들지에 대한 기획안을 보고 ERD를 작성해 보았다.

 

피그마의 사이트는 밑에 링크로 남겨놓겠다.

https://www.figma.com/file/RH28eMZbqITvcDLdTXfXeF/%ED%8F%AC%ED%86%A0%EC%95%A8%EB%B2%94?type=design&node-id=56-1391&mode=design

 

Figma

Created with Figma

www.figma.com

 

필자는 ERD를 작성하는데 ERD CLOUD라는 웹사이트를 사용하며 여기에 내가 만들어 놓은 ERD가 있다.

https://www.erdcloud.com/d/Brxur2PzX8Ls4tx62

 

앨범ERD(유튜브)

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

www.erdcloud.com

 

필자가 만든 ERD이다.

필자가 사용하는 ERD Cloud에서는 Primary Key(pk)가 노란색 키모양, Primary Foreign Key(pfk)가 파란색 모양을 하고 있다.

 

유튜브에서 강사님이 피그마를 보고 짠 ERD는 아래에 그림과 같다.

 

Share라는 기능은 생각을 하지 못했는데 Share라는 기능까지 고려를 해서 ERD를 만들어 놓은 것을 볼 수 있었다.

 

아직까지 필자도 ERD짜는 것에 익숙치가 않고 요즘 계속 이커머스에 사이트를 보고 여기에 ERD는 어떻게 만들어져 있을까 고민하고 그 사이트를 보고 필자가 한번 ERD를 짜보고 있다.

 

아마 다음 블로그는 나이키 사이트를 보고 ERD를 짜는 블로그를 쓸거 같다.

 

이것으로 ERD의 설명과 실습을 해보았다. 다음에는 다른 이커머스 사이트를 보고 혼자서 ERD를 작성하고 블로그에 올려 보아야겠다.

 

 

----------------------------------------------------------------------------------

 

도움이 아주 많이된 블로그가 있어서 적어 놓았다. 진짜로 설명이 너무 잘되어있어서 정리하고 이해하는데 많은 도움이 되었다.

https://blog.naver.com/amy518/222653861510

 

엔티티 관계도(ERD)

ERD (Entity - Relationship Diagram) ERD란, 개체 관계도라고도 불리며 요구분석사항에서 얻어낸...

blog.naver.com

 

 

@@++

728x90
반응형