데이터 분석 기술 블로그

DB에 대하여(11)_Many to many relationships (feat. Django) 본문

DB

DB에 대하여(11)_Many to many relationships (feat. Django)

데이터분석가 이채은 2024. 4. 28. 09:00

1. Many to many relationships (N:M or M:N)

한 테이블의 0개 이상의 레코드가 다른 테이블의 0개 이상의 레코드와 관련된 경우입니다.

양쪽 모두에서 N:1 관계를 가집니다.


1-1. M:N 관계의 역할과 필요성 이해하기

  • '병원 진료 시스템 모델 관계'를 만들며 M:N 관계의 역할과 필요성을 이해합니다.
  • 환자와 의사 2개의 모델을 사용하여 모델 구조 구상합니다.

2. N:1의 한계

의사와 환자 간 모델 관계 설정

한 명의 의사에게 여러 환자가 예약할 수 있다고 설계합니다.

# hospital/models.py

class Doctor(models.Model):
    name = models.TextField()
    
    def __str__(self):
        return f'{self.pk}번 의사 {self.name}'


class Patient(models.Mode):
    doctor = models.ForeignKey(Doctor, on_delete=models.CASCADE)
    name = models.TextField()
    
    def __str__(self):
        return f'{self.pk}번 환자 {self.name}'

의사와 환자 데이터 생성

2명의 의사와 환자를 생성하고 환자는 서로 다른 의사에게 예약합니다.

doctor1 = Doctor.objects.create(name='allie')
doctor2 = Doctor.objects.create(name='barbie')
patient1 = Patient.objects.create(name='carol', doctor=doctor1)
patient2 = Patient.objects.create(name='duke', doctor=doctor2)

doctor1
<Doctor: 1번 의사 allie>

doctor2
<Doctor: 2번 의사 barbie>

patient1
<Patient: 1번 환자 carol>

patient2
<Patient: 2번 환자 duke>


2-1. N:1의 한계 상황 (1)

1번 환자(carol)가 두 의사 모두에게 진료를 받고자 한다면 환자 테이블에 1번 환자 데이터가 중복으로 입력될 수밖에 없습니다.


2-2. N:1의 한계 상황 (2)

동시에 예약을 남길 수는 없을 까요?


2-3. N:1의 한계 상황 (3)

  • 동일한 환자지만 다른 의사에게도 진료 받기 위해 예약하기 위해서는 객체를 한 더 만들어 진행해야 합니다.
  • 외래 키 컬럼에 '1, 2'형태로 저장 및 참조하는 DB타입 문제로 불가능합니다.

그럼 예약 테이블을 따로 만들면 될 것 같습니다!