데이터베이스와 ORM(Object-Relational Mapping)에서 관계는 테이블 간의 연결을 나타냅니다.
이에 대한 세가지의 기본 유형에 대해 설명드리고자 합니다.
외래 키는 한 테이블의 필드가 다른 테이블의 기본 키를 참조하는 것을 의미합니다.
외래 키를 사용하여 두 테이블 사이의 일대다
, 다대일
관계를 설정할 수 있습니다. 예를 들어 "주문테이블"과 "손님테이블"이 있을 때 각 주문은 각 손님에게 속하므로 주문테이블에는 손님테이블의 기본키를 가지는 외래키가 있을 수 있습니다. 이렇게 구성되었을 시 각 주문이 각 고객에게 연결되어 고객테이블을 참조할 수 있습니다.
일대일은 한 테이블의 각 레코드(테이블의 행)가 다른 테이블의 하나의 레코드에만 연결되는 경우를 나타냅니다.
예를 들어 "유저테이블"과 "프로필 테이블"이 있을 때 각 유저는 하나의 프로필만 가질 수 있으며, 각 프로필은 하나의 유저에게만 속할 수 있습니다.
다대다는 한 테이블의 여러 레코드가 다른 테이블의 여러 레코드에 연결될 수 있음을 나타냅니다. 일반적으로 이러한 관계는 중간 또는 연결 테이블을 사용해 관리합니다.
예를 들어 "학생테이블"과 "수업테이블"이 있을때, 한 학생은 여러 수업을 들을 수 있고 한 수업은 여러 학생을 수용할 수 있습니다. 이러한 관계에서 학생과 수업 그리고 수업과 학생 사이를 연결하는 "등록테이블"을 만들어 관리할 수 있습니다.
장고 모델에서 ManyToManyField
를 사용해 다대다 관계를 표현할 수 있습니다.
위에 예시를 들었던 학생(Student), 수업(Course), 등록(Enrollment) 테이블을 예시로 코드를 작성해보겠습니다.
from django.db import models
class Student(models.Model):
name = models.CharField(max_length=100)
class Course(models.Model):
title = models.CharField(max_length=100)
students = models.ManyToManyField(Student, through='Enrollment')
class Enrollment(models.Model):
student = models.ForeignKey(Student, on_delete=models.CASCADE)
course = models.ForeignKey(Course, on_delete=models.CASCADE)
date_enrolled = models.DateField()
final_grade = models.CharField(max_length=2)
학생과 수업모델을 정의하고 수업모델의 students필드에 ManyToManyField를 사용해 두 모델 사이에 다대다 관계를 형성했습니다.
수업모델의 students필드는 학생모델을 참조하고 through='Enrollment'
를 이용해 등록모델을 중간 테이블로 지정하고 있습니다.
등록모델은 ForeignKey
를 사용해 학생과 수업모델에 대한 참조를 갖게되어 각 등록이 특정 학생과 특정 수업에 연결되어 있음을 나타냅니다.