본문 바로가기
First step/web depeloper step1

django _ORM은 뭘까 , 정규화는 뭘까

by Joshua21 2021. 11. 21.

ORM이란
Object Relational Mapping, 객체-관계 매핑

객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말한다.
객체 지향 프로그래밍은 클래스를 사용한다
객체 모델과 관계형 모델 간에 불일치가 존재한다.
ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결한다.

객체를 통해 간접적으로 데이터베이스 데이터를 다룬다.

 

django 튜토리얼간에 했던 models안에 class로 각 데이터 테이블의속성을 만들어서 해당 테이블이 어떤 column을 가질지 작성해두고 database와 models 사이에 서로 다른 언어로 구성되어있음에도 서로 데이터를 주고 받을수 있도록 컴퍼일 해주는 것으로 이해했다. 장고의경우 편의 기능으로 migtration을 지원해서 나같은 초보도 직접 ORM해주기위해 많은 코드를 작성하지 않더라고 간단하게 할수있게 되어있었다.

 

ORM의 장점은 객체지향적인 코드로 직관적이고 가독성이 좋다. 재사용및 유지보수에 편리하다

단점으로는 사용하기는 편하지만 설계하는데 매우 신중히 해야하고 복잡성이 커질수록 설계가 어려워진다.

 

django orm을 사용할때 Query 갯수를 줄일수 있는 방법은 뭐가 있을까

select_related, prefetch_related는 하나의 QuerySet을 가져올 때, 미리 related objects들까지 다 불러와주는 함수이다.

 

select_releated

객체가 역참조하는 single object(one-to-one or many-to-one)이거나, 또는 정참조 foreign key 일 때 사용하거나

각각의 lookup마다 SQL의JOIN을 실행하여 테이블의 일부를 가져오고, select .. from에서 관련된 필드들을 가져올때 사용할수 있다.

 

객체가 정참조 multiple objects(many-to-many or one-to-many)이거나, 또는 역참조 Foreign Key일때 사용한다

참고할만한 사이트 https://django-orm-cookbook-ko.readthedocs.io/en/latest/index.html

 

장고 ORM 요리책 — Django ORM Cookbook 2.0 documentation

© Copyright 2018, Agiliq Revision 159ade05.

django-orm-cookbook-ko.readthedocs.io

 

정규화(Normalization)

 정규화는 테이블 간에 중복된 데이타를 허용하지 않는다, 중복된 데이터를 허용하지 않음으로써 무결성(Integrity)를 유지할 수 있으며, DB의 저장 용량 역시 줄인다 라는 목표를 가지고있다.

제 1 정규화 (비정규형 -> 1NF)

제1 정규화란 테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것
1) 반복 그룹이 존재하면 안된다. 2) 모든 행은 식별자로 완전하게 구분되어야 한다.

 제 2 정규화 - 부분함수 종속 제거

제2 정규화란 제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다. 여기서 완전 함수 종속이라는 것은 기본키의 부분집합이 결정자가 되어선 안된다는 것을 의미한다.

Key가 아닌 값들은 모두 key에 종속 되어야한다 즉,

1) key가 아닌 컬럼(속성)은 key 컬럼이에 종속 되어야 한다.
2) key가 아닌 컬럼(속성)은 key 컬럼에! 종속 되어야 한다. 
따라서 복합키 일때만! 제 2정규형의 조건이 된다.
 

제 3정규화 - 이행적 함수 종속 제거

제3 정규화란 제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것이다. 여기서 이행적 종속이라는 것은 A -> B, B -> C가 성립할 때 A -> C가 성립되는 것을 의미한다.
필요 충분 조건 : 제 2정규형을 만족하고, 테이블 내의 모든 속성이 키에만 의존하며 다른 후보키에 의존하지 않는다.즉,

1) 모든 key가 아닌 컬럼(non-key)은 key 컬럼(속성)에 완전히 종속 되어야 한다.
2) 모든 non-key 컬럼은 key 컬럼(속성)에만 종속 되어야 한다.