# DDIA 2장. 데이터 모델과 질의 언어 * 데이터 모델은 소프트웨어가 어떻게 작성됐는지 뿐만 아니라 해결하려는 문제를 어떻게 생각해야 하는지에 대해서도 지대한 영향을 미친다. ## 관계형 모델과 문서 모델 * SQL: 가장 잘 알려진 관계형 데이터 모델: * Table: 데이터는 관계로 구성된다. * Row: 각 관계는 순서 없는 튜플의 모음이다. * NoSQL: 관계형 모델을 뒤집으려는 가장 최신 시도: * 문서 모델은 뛰어난 확장성을 가진다. * 조인과 중복 데이터 처리에 대한 지원이 부족해 다대일(many-to-one) 관계 표현에 적합하지 않다. * OOP에서 데이터베이스 모델 객체 사이 전환 계층이 필요하다: * 이러한 모델 사이의 분리를 임피던스 불일치(impedance mismatch)라고 한다. > asdfasdf * 일각에서는 JSON 모델이 임피던스 불일치를 줄인다고 생각한다: ::: NOTE 자바스크립트라면 객체 리터럴이 JSON과 동일하니까 동의. 하지만 다른 언어에도 타당한지는 모르겠다. ::: * ORM으로 전환 계층의 코드를 줄일 수는 있지만 모델의 차이를 완벽히 숨기기는 힘들다. * 데이터 베이스의 정규화: * 정규화의 핵심은 중복을 제거하는 것. * 정규화에는 다대일 관계가 필요하다: * SQL에서는 테이블을 조인하면 된다. * 문서 모델에는 적합하지 않다. * 애플리케이션이 복잡해지면 엔티티(entity)가 필요해진다. ## 데이터를 위한 질의 언어 * SQL은 선언형 질의 언어다: * 선언형 질의 언어는 목표 달성을 위한 방법이 아니라 알고자 하는 데이터의 패턴을 지정하면 된다. * 선언형 언어는 일반적으로 명령형 API보다 간결하다. * 데이터베이스 엔진의 상세 구현이 숨겨져 있어 질의를 변경하지 않고도 데이터베이스 시스템의 성능을 향상시킬 수 있다. * IMS와 코다실은 명령형 코드를 사용해 데이터베이스에 질의한다: * 대부분의 프로그래밍 언어는 컴퓨터가 특정 순서로 특정 연산을 수행하게끔 지시하는 명령형 언어다. * 맵리듀스(MapReduce) 질의: * 여러 함수형 프로그래밍 언어에 있는 `map`과 `reduce` 함수를 기반으로 하는 모델. * 몽고DB에서 제한적으로 지원하며, 선언형 질의 언어와 명령형 질의 API의 사이에 있다고 할 수 있다. ## 그래프형 데이터 모델 * 다대다 관계를 구성하기에 효과적이다. * 그래프는 정점(vertex)과 간선(edge)으로 이뤄진다.