[MongoDB] Data Modeling
MongoDB 데이터 모델링
데이터 구조
앞서 이야기 했듯이 MongoDB Document는 정형화 되어있지 않고 다양한 모습을 띈다.
(‘MongoDB는 스키마를 정하지 못하는 것’은 아니다. MongoDB 역시 스키마를 미리 만들고 조건을 지정해 줄 수 있다.
다만 이는 RDBMS처럼 데이터베이스 서버측에서 만드는 스키마가 아니라 웹서버가 DB에 있는 문서들을 객체화해서 사용 할 수 있도록 설정해주는 것이다.)
따라 모델링 역시 서버에서 정형화되게 고유 구조만을 고려하기 보다는
애플리케이션이 해당 데이터를 어떻게 사용할지,
성능 특성 및 데이터 검색 패턴을 미리 고려해 균형을 맞추는 것이 좋다
데이터 관계
모델링을 설계하기 전 우리는 세가지 경우의 수를 미리 고려해야 한다
- One-to-One
- 1:1로 하나의 엔티티가 다른 하나의 엔티티에 연결되는 관계
- 1:1로 하나의 엔티티가 다른 하나의 엔티티에 연결되는 관계
- One-to-Many
- 하나의 엔티티가 다른 임의의 수의 데이터 엔티티에 연결되는
- 예시로 key의 값으로 중첩된 배열을 사용하는 관계
- 하나의 엔티티가 다른 임의의 수의 데이터 엔티티에 연결되는
- Many-to-Many
- 임의의 수의 데이터가 다른 임의의 수 데이터에 연결되는 관계
- 임의의 수의 데이터가 다른 임의의 수 데이터에 연결되는 관계
- One-to-Many와 Many-to-Many 같이 다수의 수를 참조 할 때 MongoDB는 두가지 기본적인 방법을 사용함
Embedding / Referencing
Embedding
- 관련 데이터를 가져와 문서에 삽입하는 방식
- 데이터 반정규화와 유사
- 함께 엑세스 되는 데이터를 조회 또는 저장할때 유용
- 데이터를 한번에 사용할 경우가 많을때 한번의 실행으로 가능하기에 빠른 퍼포먼스
- 데이터의 중복이 많아지면 메모리를 많이 사용
- 매번 모든 데이터가 필요없는 경우가 많을 때 불필요하게 큰 파일 크기
{
"_id" : ObjectId("573a1390f29313caabcf413b"),
"title" : "test",
"cast" : [
{"actor" : "actor1", "character" : "character1},
{"actor" : "actor2", "character" : "character2},
{"actor" : "actor3", "character" : "character3},
...
]
}
Referencing
- 다른 콜렉션의 문서를 참조하는 방식
- 데이터 정규화와 유사
- 변화가 잦을때 데이터의 일관성을 유지하기에 유용
- 문서의 크기를 작게 관리 할 수 있음
- 한번의 요청만으로 데이터를 불러올 수 없기에 퍼포먼스면에서 불리
- 다중 저장, 작업으로 추가 자원 및 읽기 성능에 비용이 발생할 수 있음
{
"_id" : ObjectId("573a1390f29313caabcf413b")
"title" : "test"
"cast" : [
ObjectId("654a1420f29313fggbwo718"),
ObjectId("654a1420f29313fggbwo719"),
...
]
}
- 따라서 무엇이 좋다 우열을 가릴 수 있는 것은 아니며 실제 서비스를 구현하는 환경 및 개발 인력, 서비스의 규모에 따라 고려해야 함