-
MongoDB - Data modeling (1)mongoDB 2022. 4. 14. 07:24
data modeling은 왜 필요할까? 무엇인가를 개발할 때 우리는 어플리케이션의 요구사항, 데이터베이스 엔진 성능 그리고 검색 패턴의 균형을 잘 맞춰야만 한다. 즉, 개발 도메인에 맞는 데이터 구조를 파악하고 이에 맞는 데이터베이스 엔진을 선택하고 또 이를 어떻게 사용할지 고려해야만 한다. 그럼 이제 mongoDB의 Data Modeling에 대해 알아보도록 하자.
Flexible Schema
mongoDB는 noSQL 데이터베이스로써 SQL( Data를 insert하기 전에 Table의 column 즉 Schema을 정해놔야 함)과 다르게 동일 collection의 document들의 schema가 동일할 필요가 없다. document의 특정 field를 삭제하거나 추가하려면 다른 작업이 필요없이 그냥 update나 insert만 하면 된다. 따라서 개발 초기에 어떤 data field를 사용할 지 완전히 정하지 못했을 때 좀 더 유연하게 사용할 수 있다.
예를 들어서 user 정보를 처음에는 name, email, gender 3개의 필드만 필요해서 3개의 field만 정의하고 사용했다. 그러다가 사용자 검증이 필요해서 token을 추가하게 되고 만약 여러 종류의 유저가 있다면 이 유저의 종류에 따라서 field가 달라진다 할지라도 전혀 문제가 되지 않는다. 단지 그냥 추가되면 추가된대로 빠지면 빠진대로 create, update를 하고 필요한 field만 read해서 사용하면 된다.
예를 들면 1. 회원가입을 한 user, 2. 비회원 user 이렇게 2 종류의 user가 있다고 가정해보자. 회원 가입을 한 user는 가입하기 위해서 name, email, gender의 정보를 기입했을 것이다. 하지만 비회원 user의 경우에는 그렇지 않다. 하지만 우리는 비회원 user의 정보도 관리해야 한다. 이 때 회원 가입을 한 user는 {name, email, gender} 의 값이 모두 있을 것이고 비회원 유저는 {unRegisteredUserId} 와 같은 비회원을 특정하기 위한 field가 있을 것이다. 이 때 우리는 하나의 collection 안에 두가지 종류의 유저를 field가 같지 않더라도 아무 문제 없이 저장할 수 있다.
만약 이렇게 너무 유연하게 되면 오탈자가 있거나 실수로 string type의 field에 number type을 넣는다던가 하는 실수가 있을 수도 있다. 이 때는 Schema Validation을 통해서 schema를 강제할 수도 있다.
Schema Validation — MongoDB Manual
Schema Validation — MongoDB Manual
Docs Home → MongoDB ManualMongoDB provides the capability to perform schema validation during updates and insertions.Validation rules are on a per-collection basis.To specify validation rules when creating a new collection, use db.createCollection() with
www.mongodb.com
Embedded Data
embedded data란 data간의 관계를 캡처한다. 즉 document가 값으로 document를 가질 수 있다. 이는 관계가 있는 data를 가져오기 위해서 다른 collection 또는 document를 조회할 필요 없이 하나의 document만으로 처리할 수 있게 해준다. 이해를 돕기 위해 RDB와 비교해보자.
만약에 홈쇼핑 시스템을 만든다고 가정해보자 그럼 Stuff 정보를 갖고 있는 collection (RDB에서는 Table) 고객 정보를 갖고있는 collection (RDB에서는 Table) 이렇게 2개의 collection이 있을 거라 예상할 수 있다.
RDB Table RDB는 위의 그림과 같이 id를 이용해서 서로를 가리키고 있다. 따라서 구매 정보만 보고 user의 정보와 stuff의 정보를 알 수 없다. 그럼 mongoDB에서 Embedded Data를 사용하면 어떻게 저장할 수 있을까?
// in stuff collection { "user":{ "id":1, "이름":"zzihyeon", "성별":"남" }, "stuff":{ "id":1, "이름":"삼겹살", "가격":10000, "판매자":"XX" }, "수량":3 }
이렇게 stuff collection의 document하나에 구매 당시의 snapshot을 남길 수 있다. 이를 통해 다른 2개의 collection을 조회하지 않고도 정보를 알 수 있다. 이는 one-to-on relationship이나 one-to-many relationship에서 사용한다.
물론 mongoDB에서도 RDB와 같이 Reference를 지원한다. 이제 이에 대해 알아보도록 하자.
참조: Data Model Design — MongoDB Manual
Data Model Design — MongoDB Manual
Docs Home → MongoDB ManualEffective data models support your application needs. The key consideration for the structure of your documents is the decision to embed or to use references.With MongoDB, you may embed related data in a single structure or docu
www.mongodb.com
References
위의 embedded data로 하나의 document의 다 넣은 것과 다르게 아래처럼 사용할 수 있다.
reference 이는 many-to-many relationship에서 사용한다.
이 때, 주문 목록 collection을 조회하면서 stuff, user를 id로 join처럼 사용할 수 있는 기능이 있다. pipeline stage를 통해서 가져올 수 있는데 $lookup과 $graphLookup을 사용하면 된다.
- $lookup: sharded되지 않은 동일 database 내에 있는 document를 outer join할 수 있다.
- $graphLookup: sharded되지 않은 동일 database 내에 있는 document를 recursive하게 search할 수 있다.
참조: Database References — MongoDB Manual
Database References — MongoDB Manual
Docs Home → MongoDB ManualFor many use cases in MongoDB, the denormalized data model where related data is stored within a single document is optimal. However, in some cases, it makes sense to store related information in separate documents, typically in
www.mongodb.com
'mongoDB' 카테고리의 다른 글
MongoDB - index (1) (0) 2022.04.17 MongoDB - Data modeling (2) (0) 2022.04.16 MongoDB - Read Concern (0) 2022.04.04 MongoDB CRUD - 어떻게 완화된 ACID (BASE) 인가? (0) 2022.03.28 Mongodb - database and collection (0) 2022.03.27