TIL - 49 관계형 데이터 베이스

이동근·2021년 2월 13일
0

django

목록 보기
11/12

관계형 데이터 베이스에는 One To One, One To Many, Many To Many가 있다.

One To One(1:1)

A칼럼의 1개의 열과 B열의 1개의 열이 대응이 되는 구조로 가장 단순한 구조이다.

Aquery툴을 사용해서 만들게 되면 이런 형식 Category의 Menu_id column 단 한개만 관계를 가지고 있다.

Models.py

이런식으로 models.py에서 사용할 수도 있다.

1:1의 관계로 이루어지기 때문에 관계설정하는데 있어 크게 어려움을 가질 필요는 없다.

One To Many(1:N)

A열의 1개의 행과 B열의 다수의 행이 관계가 있는 형태이다.

Aquery 의 형태로 나누면 이렇게 할 수 있다.

Models.py

이런식으로 Drink,Nutirion필드를 보면 drink_id 1개당 Nutrition의 여러개의 열들이 대응이 되어 있다.

Foreign Key

Foreignkey.on_delete : Foreginkey가 참조하는 객체가 사라지게 되면 django는 on_delete인수로 지정된 SQl 제약조건의 동작들을 에뮬레이트 합니다. 그리고 그 다음에 원하는 행동을 적어주면 됩니다.
CASCADE : 계단식 삭제로 ForeginKey로 물려있는 객체도 삭제합니다.
PROTECT : 참조된 객체의 삭제를 방지합니다. ProtectError 발생
RESTIRCT : 그 자체로의 삭제는 방지하지만, CASCADE의 삭제는 지워진다.
SET_NULL : null_True로 나두게 되면 참조되어 있는 행이 삭제 되어도 null값으로 남아있다.
SET_DEFAULT : 마찬가지로 참조되어있는 행이 삭제될 시 default 값으로 변경
Related_Name : 관련개체에서 이 개체 까지의 관계에 사용할 이름입니다.

Many To Many

우선 Aquery로 만든 형태를 보면 이런식으로 하게 된다.

ManyToMany 필드는 M:M으로 이루어진 다대다 관계이다. 설명하면 한 개의 음료가 여러개의 알러지를 가질 수 잇고 한 개의 알러지는 여러개의 음료를 가질 수 있는 관계이다.

자칫 생각 하면 One To many와 헷갈릴 수 있다. 하지만 잘 생각 해보면 다르기 때문에 데이터베이스 모델링을 할때 생각을 잘 해봐야 할 것이다. (One To Many인지, Many To Many!!!!)

Aquery에서 Allergy_Drink는 중간테이블로서 Allergy와 drink를 ManyToMany로 연결하는 것을 도와 준다.

이런식으로 작성을 해주면 된다.

위의 사진에는 Allergy_Drink라고 중간 필드가 만들어 져 있는 것을 볼 수 있다.

이 중간에 중개해주는 필드를 관련해서 1)만들어도 되고 2)안 만들어도 된다.

Django는 Allergy_Drink와 같은 중개해주는 필드와 관련해서 '자동'으로 만들어 준다.

그럼 무슨 차이 일까?

중간필드에 우리가 원하는 데이터를 CRUD할수 있냐 없냐의 차이이다. 그래서 되도록이면 만드는 것을 추천한다.

그리고 또 한가지

ManyToManyField 속성은 연결되는 두 Field 간에 한 쪽에만 있어야 한다. 어느쪽이 주가 되는 지에 따라 주가되는 필드에 정의하는 것이 좋다.

그래서 Drink의 필드가 Allergy 필드보다 주가 되기때문에 Drink 에 allergy 필드를 만들었다.

속성

through : ManyToManyField가 사용할 model을 지정할 수 있게 해준다.
through_field : 연결된 필드에서 ManyToMany필드로 연결한 필드를 정의 해준다.

profile
하루하루 1cm 자라는 개발자

0개의 댓글