DB : Many to many relationships

2024. 4. 9. 20:04Web, Django, DB

  • Many to many relationships (N:M , M:N)

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

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

서로가 서로에게 종속되어있지 않은 관계!

 

⇒ Django 에서는 ‘ManyToManyField’ 로 중개 모델을 자동으로 생성

 

  • ManyToManyField( )

M:N 관계 설정 시 사용하는 모델 필드

 

  • ‘through’

중개 테이블에 추가 데이터를 사용해 M:N 관계를 형성하려는 경우에 사용

 

  • M:N 관계 주요 사항들

M:N 관계로 맺어진 두 테이블에는 물리적인 변화가 없다.

ManyToManyField 는 중개 테이블을 자동으로 생성한다.

ManyToManyField 는 M:N 관계를 맺는 두 모델 어디에 위치해도 상관 없다. (다만 필드 작성 위치에 따라 참조와 역참조 방향이 달라짐을 주의)

N:1 은 완전한 종속 관계였지만, M:N 은 일방적인 종속 관계가 아니다.

 

  • ManyToManyField의 대표 인자 3가지
  1. ‘related_name’ 역참조 시 사용하는 manager name을 변경한다. 이름을 변경하면 이전의 역참조 매니저 이름은 쓸 수 없게 된다.
  2. ‘symmetrical’ 관계 설정 시 대칭 유무를 설정한다. (기본 값 = True) ManyToManyField 가 동일한 모델을 가리키는 정의에서만 사용한다. True 일 경우, 관계를 시작하는 모델 (=source 모델)의 인스턴스가 관계의 대상이 되는 모델(=target 모델) 의 인스턴스를 참조하면 자동으로 target 모델 인스턴스도 source 모델 인스턴스를 참조하여 대칭을 이루도록 한다. ex) 팔로우를 하면 자동으로 맞팔로우가 된다.
  3. ‘through’ 사용하고자 하는 중개 모델을 지정한다. 추가 데이터를 M:N 관계와 연결하려는 경우에 활용한다.

 

  • M:N 관계에서의 대표 methods

add( ) → 지정된 객체를 관련 객체 집합에 추가한다. (이미 존재하는 관계일 경우 관계가 복제되지 않음)

remove( ) → 관련 객체 집합에서 지정된 모델 객체를 제거한다.

 

  • Many to many relationships

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

(양쪽 모두에서 N:1 관계를 가진다)

 

  • .exists( )

QuerySet에 결과가 포함되어 있으면 True를 반환하고 결과가 포함되어 있지 않으면 False를 반환한다.

큰 QuerySet에 있는 특정 객체를 검색할 때 유용하다.

 

  • Fixtures

Django가 데이터베이스로 가져오는 방법을 알고 있는 데이터 모음

⇒ 데이터가 데이터베이스 구조에 맞추어 작성되어있다.

⇒ 프로젝트의 데이터베이스에 초기 데이터를 제공하기 위해 사용한다.

⇒ Fixtures 파일 기본 경로 : Django는 설치된 모든 앱의 디렉토리에서 fixtures 폴더 이후의 경로로 fixtures 파일을 찾아 load 한다.

Fixtures 파일은 직접 만들지 말고 반드시 dumpdata 명령어를 사용하여 생성하자

 

  • fixtures 관련 명령어
  1. dumpdata = 생성 : 데이터베이스의 모든 데이터를 추출 ex) python manage.py dumpdata —indent 4 앱이름.모델클래스이름 > 이름(보통 모델이름).json
  2. loaddata = 로드 : Fixtures 데이터를 데이터베이스로 불러오기 ex) python manage.py loaddata articles.json users.json comments.json

 

  • loaddata 순서 주의사항

만약 loaddata 를 한번에 실행하지 않고 별도로 실행한다면 모델 사이의 관계에 따라 load 순서가 중요해질 수 있다.

각 모델에서 다른 모델을 외래 키로 참조할 경우 참조 대상인 모델이 먼저 load 되어야 오류가 발생하지 않는다.

 

  • loaddata 시 encoding codec 관련 에러가 발생하는 경우

2가지 방법이 있다.

  1. dumpdata 시 추가 옵션 작성 python -Xutf8 manage.py dumpdata 이하생략
  2. 메모장으로 다시 저장 → 메모장으로 json 파일을 열고 다른 이름으로 저장할 때 인코딩을 UTF8로 선택하여 저장한다.

 

  • improve query

같은 결과를 얻더라도 DB 측에 보내는 query 개수를 줄여 query 문을 개선하는 것

⇒ 요약 : SELECT 한번에 잘 가져오는 것이 중요하다!!

 

  • annotate

SQL의 GROUP BY를 사용한다.

 

  • select_related

SQL의 INNER JOIN을 사용한다.

(1:1 또는 N:1 참조 관계에서 사용)

 

  • prefetch_related

M:N 또는 N:1 역참조 관계에서 사용한다.

SQL이 아닌 Python을 사용한 JOIN을 진행

 

다만, 최적화보다 중요한 것은 필요한 데이터를 잘 가져오는 것이다.

섣부르게 최적화에 집착하지 말 것.

먼저 정확도를 확보하고 그 이후에 효율을 챙기자!

'Web, Django, DB' 카테고리의 다른 글

Django : REST API (추가)  (0) 2024.04.16
Django : REST API  (1) 2024.04.13
DB : Many to one relationships (추가)  (0) 2024.04.04
DB : Many to one relationships  (0) 2024.04.03
SQL  (0) 2024.04.02