profile image

L o a d i n g . . .

728x90

이번 챕터에서는 데이터베이스에서 데이터를 표현하는 다양한 형태의 모델에 대해 살펴보려고 합니다. 

먼저, 관계형 데이터베이스의 데이터 모델부터 시작하여, 다양한 NoSQL 데이터베이스에서의 데이터 모델까지(document database, graph database) 다양한 형태의 데이터 모델에 대해 살펴볼 것입니다. 이러한 데이터 모델은 각각의 장단점을 갖고 있으며, 특정한 사용 사례에 적합한 데이터 모델을 선택하는 것이 중요합니다.

또한, 이번 챕터에서는 각 데이터 모델에 대한 쿼리 유형도 다룰 예정입니다. 관계형 데이터베이스의 경우 SQL을 사용하여 데이터를 검색하며, NoSQL 데이터베이스의 경우 각각의 데이터 모델에 맞는 쿼리 언어를 사용하여 데이터를 검색합니다.

데이터 모델링과 쿼리 유형에 대한 이해는 데이터베이스의 효율적인 운영과 유지보수에 중요한 역할을 합니다. 이번 챕터를 통해 데이터베이스에 대한 이해를 높이고, 적절한 데이터 모델과 쿼리 유형을 선택하는 데 도움이 되기를 바랍니다.

관계형 데이터 모델(Relational Model) 

관계형 데이터 모델(Relational Model)은 구조화된 테이블과 행을 이용하여 데이터를 효과적으로 표현하는 모델입니다. 이 모델은 간결한 인터페이스 뒤에 실제 데이터가 저장되고 조회되는 로직을 캡슐화함으로써 데이터 조작을 보다 쉽고 용이하게 합니다. 관계형 데이터 모델이 등장하기 전에 존재했던 다양한 데이터 모델은 다음과 같습니다. 

  • Hierarchical 모델은 트리 형태의 데이터 모델로 부모-자식 관계를 가지며, 하나의 부모는 여러 자식을 가지고, 하나의 자식은 하나의 부모와 관계를 가집니다.
  • Network 모델은 Hierarchical 모델에서 더 나아가 하나의 자식이 여러 부모와 관계를 가질 수 있습니다.
  • Object 데이터베이스 모델은 테이블, 로우, 칼럼이 아니라 객체 그 자체가 저장될 수 있도록 하는 데이터 모델입니다. 이 모델은 객체 지향 프로그래밍에 적합한 데이터베이스 모델입니다.
  • XML 데이터베이스 모델은 XML 형태로 데이터를 저장할 수 있는 데이터 모델입니다. 이 모델은 주로 문서 기반 데이터 처리에 적합합니다.

NoSQL(Not Only SQL) 

NoSQL 데이터베이스는 관계형 데이터베이스의 한계를 극복하기 위해 사용되며, 현재에는 다양한 유형의 NoSQL이 운영환경에서 사용됩니다. NoSQL은 크게 Key-Value, Document, Column-family, Graph 데이터베이스로 분류됩니다.

  • Key-Value 데이터베이스: 데이터를 key-value 형태로 저장하며, 단순하고 빠른 데이터 조회를 지원합니다. Redis, Amazon DynamoDB가 이에 해당합니다.
  • Document 데이터베이스: Document 단위로 저장되며, Json 또는 Bson의 형태로 저장됩니다. 각각의 Document는 다른 구조(schema)를 가질 수 있어 유연한 스키마 디자인과 복잡한 데이터 모델링을 지원합니다. MongoDB, Amazon DocumentDB가 이에 해당합니다.
  • Column-family 데이터베이스: 함께 접근되는 column을 묶은 Column-family 단위로 데이터가 저장되고 조회됩니다. 대용량 데이터 쓰기에 적합합니다. 이 모델은 분산 데이터베이스와 함께 사용되는 경우가 많습니다. Apache Cassandra, HBase가 이에 해당합니다.
  • Graph 데이터베이스: 데이터를 node(vertex)와 edge의 형태로 저장하며, 데이터 간의 관계를 자유롭게 지정할 수 있습니다. 이 모델은 네트워크 데이터나 연관 데이터 처리에 효과적입니다. Neo4j, Amazon Neptune이 이에 해당합니다.

관계형 데이터베이스의 가장 큰 단점은 애플리케이션에서 사용하는 도메인 객체를 데이터베이스에 있는 그대로 저장하지 못한다는 점입니다. 만약 하나의 도메인 객체가 서로 다른 객체와 관계를 맺는다면 관계형 데이터베이스에서는 각각의 객체에 대응되는 테이블을 만들고 이들을 외래 키를 통해 관계를 맺어야 합니다.

객체와 관계형 데이터베이스 간의 변환 과정에서 발생하는 어색함을 impedance mismatch라 하며, 이는 개발의 어려움을 야기합니다. 또한, 관계형 데이터베이스는 관련된 데이터가 지역성을 띄지 않는다는 단점도 있습니다. 이는 관련된 데이터가 뿔뿔이 흩어져 저장되어 효율적인 처리가 어렵다는 것을 의미합니다.

이러한 관계형 데이터베이스의 한계를 극복하기 위해 다양한 시도가 있었습니다. 대표적인 예시는 객체-관계 매핑(Object-Relational Mapping, ORM) 프레임워크를 사용하는 것입니다. ORM은 애플리케이션에서 사용하는 도메인 객체와 관계형 데이터베이스 간의 매핑을 자동으로 처리해 주는 프레임워크입니다. 이를 통해 impedance mismatch를 어느 정도 해결할 수 있지만 한계는 존재합니다. 그 외에도 다음과 같은 시도가 있었습니다. 

  • Google Spanner table interleaving, Oracle multi-table index cluster table 
    • 서로 다른 테이블이라도 연관된 데이터를 교차하여 저장하는 방식입니다. 이 방식은 한 번의 disk I/O로 최대한 많은 데이터를 가져올 수 있습니다. 해당 데이터는 관련된 데이터가 연속된 형태로 저장되기 때문에 한 번의 I/O만으로도 최대한 많은 관련 있는 데이터를 가져올 수 있습니다. 아래의 사진을 보면 Order와 Customer테이블의 데이터가 교차하여 저장됨을 볼 수 있습니다. 데이터가 저장된 위치가 서로 가깝다 보니 한 번의 I/O를 통해 필요한 데이터를 최대한 많이 가져올 수 있습니다. 

Oracle multi-table index cluster table

대표적인 문서형(document) 데이터베이스 MongoDB는 JSON의 형태로 데이터를 저장합니다. 만약 애플리케이션에서 사용하는 객체를 JSON의 형태로 표현했을 때, 객체의 특징과 다른 객체와의 관계가 직관적으로 표현될 수 있다면, 문서형 데이터베이스를 활용함으로써 impedance mismatch를 줄일 수 있습니다.

하지만 모든 상황에서 문서형 데이터베이스를 사용하는 것이 은탄환(silver bullet)은 아닙니다. 문서형 데이터베이스는 join 연산을 지원하지 않거나, 지원하더라도 관계형 데이터베이스에 비해 성능이 뒤쳐지기 때문에, 만약 document 간 관계가 많은 상황이라면 문서형 데이터베이스의 사용을 재고해보아야 합니다. 

관계형 데이터베이스 사용자가 문서형 데이터베이스를 처음 접할 때 자주 떠오르는 질문 중 하나는, 트랜잭션을 어떻게 수행할지에 대한 것입니다. MongoDB와 같은 대표적인 문서형 데이터베이스는 단일 document에 대한 작업에서 원자성을 보장합니다. 따라서 연관된 객체를 하나의 document에 저장하면 트랜잭션을 사용하는 것과 동일한 효과를 얻을 수 있습니다. MongoDB는 단일 document 외에도 multi-document에 대해 원자성을 보장하기 위해 트랜잭션을 지원합니다. 
https://www.mongodb.com/docs/manual/core/transactions/

 

Query Languages for Data 

다음으로는 데이터베이스에서 사용하는 다양한 쿼리 유형에 대해 살펴보겠습니다. 

SQL 

관계형 데이터베이스에서 사용하는 SQL은 명령형이 아닌 선언형입니다. 즉, SQL 쿼리는 데이터베이스 작업이 어떻게 동작해야 하는지 일일이 나열하는 것이 아니라 원하는 결과를 선언하고 실제로 어떻게 동작해야 하는지는 데이터베이스에 위임합니다. 이러한 선언형 SQL의 장점은 표준화된 쿼리를 사용할 수 있다는 것뿐만 아니라, 데이터베이스가 최적화를 위한 다양한 방법을 제공할 수 있다는 것입니다.

MapReduce 

MapReduce는 대용량 데이터를 다수의 컴퓨터에서 bulk 처리하기 위한 프로그래밍 모델입니다. MapReduce는 명령형 프로그래밍과 선언형 프로그래밍의 그 중간 어딘가에 위치합니다. MapReduce에서 가장 중요한 개념은 map과 reduce라는 함수입니다. Map 함수는 key-value 인자를 받아 이를 다음 단계로 넘겨줄 key-value로 변환합니다. Reduce 함수는 Map 함수로부터 전달받은 데이터를 목적에 맞게 더 작은 범주의 key-value 데이터로 변환하여 반환합니다. Map과 Reduce 함수는 pure function이어야 하며, 동일한 인자를 넣었을 때 동일한 결과를 반환하는 함수를 의미합니다.

Graph-like Data Models 

관계형 데이터베이스와 문서형 데이터베이스에서는 many-to-many 관계의 데이터 모델을 사용할 수 있지만, 활용면이나 성능적인 면에서 이에 대한 처리가 어려울 수 있습니다. 이를 해결할 수 있는 또 다른 데이터 모델로는 그래프 형태의 데이터 모델이 존재합니다. 그래프는 다음과 같은 요소로 구성됩니다:

  • Vertice(Node 또는 entity라고 부르기도 합니다)
  • Edge(Relationship 또는 arc라고 부르기도 합니다)

Graph에서는 서로 다른 타입의 vertice가 edge를 통해 관계를 형성할 수 있습니다. 또 다른 기능으로는 vertice와 edge에 다양한 데이터를 저장할 수 있어 기존의 관계형 데이터베이스와 문서형 데이터베이스에서 해결하기 어려웠던 문제를 해결할 수 있습니다.

Property graph

 

마무리 

이번 챕터를 통해 관계형 데이터베이스와 NoSQL 데이터베이스의 다양한 데이터 모델에 대해 살펴보았습니다. 애플리케이션에서 사용되는 객체의 사용 방식에 따라 적절한 데이터베이스를 선택하면 더욱 편리하게 작업할 수 있을 뿐 아니라, 성능적으로도 더 효과적인 결과를 얻을 수 있습니다.

Reference 

http://www.dba-oracle.com/oracle_tip_hash_index_cluster_table.htm

http://graphdatamodeling.com/Graph%20Data%20Modeling/GraphDataModeling/GraphDataModelingExplained.html

728x90
복사했습니다!