관계형 데이터베이스에서 데이터들간의 상호관련성을 표현하는 개념
one to one : 한 테이블의 레코드가 다른 한 테이블의 오직 한 레코드와 연관성을 가진다
ex) 하나의 커피는 하나의 영양성분표를 가질 수 있음
one to many : 한 테이블의 레코드가 다른 한 테이블의 여러 레코드와 연관성을 가진다
ex) 하나의 카테고리는 여러개의 음료를 가질 수 있음
many to many : 한 테이블의 레코드 들이 다른 한 테이블의 여러 레코드들과 연관성을 가진다
ex) 커피를 포함한 여러 음료들은 각각의 사이즈를 가질 수 있음
위와 같은 관계에서 category는 beverage에 대하여 one to many관계이다
django에서는 Foreignkey 사용을 통해 one to many 관계를 만들 수 있다
category에 속하는 beverage들을 다음과 같이 쿼리할 수 있다
# 정방향 참조
coffee = Category.objects.get(name='coffee')
Beverage.objects.filter(category=coffee)
# or
Beverage.objects.filter(category_id=coffee.id)
# 역방향 참조
coffee.category_set.all()
Category.objects.beverages.get(name='coffee').all()
# 테이블 클래스에서 접근하지 않으면 AttributeError가 발생한다
위와같은 관계에서 beverage는 nutrient와 one to one관계이다
django에서는 unique한 Foreinkey를 통해 다른 테이블을 참조하거나
models.OneToOneField()를 통해 선언할 수 있다
one to one 테이블은 하나의 테이블에 구성되어도 문제가 없으나
테이블을 나눔으로 인해서 쿼리문이 가벼워질 수 있다
위와같은 관계에서 beverage는 ingredient와 many to many관계이다
MtoM관계를 표현하기 위해서는 중간 테이블이 필요하며 위에서는 allergic_nutrient이다
django에서는 models.ManyToManyField()를 통해서 구현할수 있으나
중간 테이블에 추가적인 데이터를 선언하고 싶으면 위와 같이 직접 중간테이블을 선언해야 한다
many to many 관계가 가질 수 있는 데이터의 종류를 위 테이블을 예를 들어 설명하면
id가 1인 beverage 테이블의 레코드 coffee는 ingredient 테이블의 레코드
caffeine, milk와 동시에 관계를 가질 수 있다