Framework/Django

데이터 관계 모델 정리

JM Lee 2023. 5. 18. 12:48
728x90

두 번의 팀 프로젝트를 통해서 느낀 것은

응용이 부족했던 점이 가장 크고, 경험이 없기 때문이 컸지만

 

기본기에서 가장 부족했던 것이 바로 모델 관계 정리였다.

 

그래서 이번엔 지난 튜터님들의 실강을 복습하면서 다시금 정리해보게 되었다.

 

PK(Primary Key) 

  • Table에서 반드시 하나만 존재 (유일) 
  • 그래서 row의 값을 고유하게 식별 가능
  • 대개 정수형태, 번호 혹은 유일한 값

FK(Foreign Key)

  • 다른 테이블의 PK를 참조하는 컬럼
  • 타 테이블 PK 데이터 확보!

PK와 FK가 없을 시, 데이터가 중복되면서 불필요한 데이터들을 계속 가지게 된다.

그렇기 때문에 한 테이블 안에서 대표성을 띄고 있는 PK와 FK를 적극적으로 이용해줘야 한다.

 

OneToOneField : 예전 카카오 프로필은 User 한 명 당/한 개였다. 이러한 관계를 OneToOne이라고 한다.

                            일반적으로 장고에서는 부가 설명에 ForeignKey with unique=True 로 표현한다.

                            이런 경우에는 PK값과 타 테이블의 PK값(FK)이 동시에 들어올 일도 있으니 유념하기

 

아래 코드는 서로 같은 명령어다. 그러나 장고에서는 일반적으로 후자를 좀 더 추천한다.

user = models.ForeignKey(User, on_delete=models.CASCADE, unique=True)
user = models.OneToOneField(User, on_delete=models.CASCADE)

 

OneToManyField : 하지만 요즘 카카오 프로필은 User 한 명 당/여러 개의 프로필을 개설할 수 있다.                              일반적으로 이런 1 대 다 관계에서는 Foreign Key를 사용한다.

                              왜 사용하는 지를 알아야 하는데,  아래 테이블에서는 user의 id를 coin이 참조하기 때문.

ManyToManyField : 가장 중요함

class Pizza(models.Model):

    name = models.CharField(max_length=20)
    toppings = models.ManyToManyField('Topping')

class Topping(models.Model):

    name = models.CharField(max_length=20)

models.py에 적힌 테이블은 4개이지만, 실제 db에는 다음과 같이 5개가 적혀 있다.

그 이유가 무엇일까?

ManyToManyField는 양 테이블을 서로 연결해주는 중간테이블이 존재하기 때문이다.

 

중간테이블을 통해 OneToMany를 두 번 하는 효과를 얻을 수 있다.

1. 추가 정보 저장: 중간 테이블은 ManyToMany 관계에 추가적인 정보를 저장할 수 있다.

2. 중복 데이터 방지: 중간 테이블을 사용하면 두 테이블의 관계를 중복해서 생성하는 것을 방지할 수 있다. 중간 테이블을 통해 정확히 어떤 피자에 어떤 토핑이 들어가 있는지 알 수 있다.

3. 확장성: 중간 테이블을 사용하면 ManyToMany 관계를 더욱 유연하게 확장할 수 있다. 중간 테이블에 필드를 추가하거나 중간 테이블 자체를 확장하여 관계에 대한 다양한 속성을 저장할 수 있다.

 

강의에서 캡처한 사진. user와 hobby 사이에 user_user_hobby가 있다.

 

'Framework > Django' 카테고리의 다른 글

poetry 기본 명령어 모음  (0) 2023.06.07
Poetry 설치 및 기초 세팅  (0) 2023.06.07
DRF 심화과정 4주차  (0) 2023.04.23
DRF 심화과정 3주차  (0) 2023.04.23
장고 심화 1주차  (8) 2023.04.18