ManyToMany Relationships

SungjoonAn·2022년 2월 20일
0

Django

목록 보기
6/12
post-thumbnail

ManyToMany relationship 은 DB에 모델링을 할때 M:M(다수 : 다수)의 관계를 적용을 해야 할 때 쓰입니다. 예시로 쓰일 배우와 영화의 DB를 보면 배우와 영화 정보를 담고 있는 M2M (Many to Many)관계도 입니다.

Many_to_many_relationship

위의 Table를 보면 actors_movies라는 중간에 위치한 Table은 첫번째 id를 제외한 actor_id와 movie_id 둘다 foreign key로 actors table과 movies table을 정참조(reference)하고 있습니다.

위의 Table 구성을 토대로 models.py를 두가지로 만들수 있습니다. 하나는 FK (Foreign key)를 이용해서 만드는 models.py 그리고 다른 하나는 ManyToMany를 이용해서 만드는 models.py가 있습니다.

아래는 FK를 사용해서 만든 models.py입니다.

from django.db import models

class Actor(models.Model):
    first_name = models.CharField(max_length=45)
    last_name = models.CharField(max_length=45)
    date_of_birth = models.DateField()

    class Meta:
        db_table = 'actors'

class Actor_Movie(models.Model):
    actor = models.ForeignKey('Actor', on_delete = models.CASCADE)
    movie = models.ForeignKey('Movie', on_delete = models.CASCADE)

    class Meta:
        db_table = 'actors_movies'

class Movie(models.Model):
    title = models.CharField(max_length=45)
    release_date = models.DateField()
    running_time = models.IntegerField()


    class Meta:
        db_table = 'movies'

그리고 다음에 보여주는 models.py는 ManyToMany를 사용해서 만들었다.

from django.db import models

class Actor(models.Model):
    first_name = models.CharField(max_length=45)
    last_name = models.CharField(max_length=45)
    birth_date = models.DateField()
    movie = models.ManyToManyField('Movie')
    class Meta:
        db_table='actors'
    def __str__(self):
        return self.first_name + self.last_name

class Movie(models.Model):
    title = models.CharField(max_length=45)
    release_date = models.DateField()
    running_time = models.IntegerField()
    class Meta:
        db_table='movies'
    def __str__(self):
        return self.title

위와 같은 model를 사용하게 되면 일단 중간 class를 만들 필요 없이 좀 더 가시성이 좋은 model를 만들수 있다. ManyToManyField를 정의하면, 자동으로 두 테이블 사이의 관계를 관리해주는 중간 테이블을 생성이 된다. 첫 번째 model은 수동으로 유저가 직접 테이블과 만든거에 비하면 편의성 차이가 일단 나게 된다.

그렇기 때문에 중간 테이블은 유저가 작성한 model에는 없지만, DB를 확인하면 ManyToMany관계의 두 테이블 이름을 _로 이어준 별도의 테이블이 생성된 것을 볼 수 있다. 이 중간 테이블은 두 테이블의 id를 각각 필드로 가지고 있다. 그렇기 때문에 각 테이블에 데이터가 존재하지 않으면 중간 테이블에도 primary key가 존재하지 않는다.

0개의 댓글