오히려 좋아..

상황이 나쁘게만 흘러가는 것 같을 때 외쳐보자.. .

궁금한 마음으로 포트폴리오 보기

Technology/DB

[MongoDB] 스키마 디자인 패턴 1: 버킷 패턴(Bucket Pattern)

junha6316 2022. 2. 24. 09:00

https://www.mongodb.com/blog/post/building-with-patterns-the-bucket-pattern

 

Building with Patterns: The Bucket Pattern | MongoDB Blog

Streamlining your Travel Needs with Lambus and MongoDB Traveling can be a hassle. Ok, that’s putting it mildly (to say the least). But what if traveling didn’t have to be so difficult? Lambus is the all-in-one travel platform that is designed to put yo

www.mongodb.com

하나의 센서에서 들어오는 여러 데이터가 쌓이는 상황이라고 가정해보자. 몽고DB에 저장되는 Document 형태는 아래와 같다.

{
   sensor_id: 12345,
   timestamp: ISODate("2019-01-31T10:00:00.000Z"),
   temperature: 40
}

{
   sensor_id: 12345,
   timestamp: ISODate("2019-01-31T10:01:00.000Z"),
   temperature: 40
}

{
   sensor_id: 12345,
   timestamp: ISODate("2019-01-31T10:02:00.000Z"),
   temperature: 41
}

이런식으로 데이터를 저장했을 때 데이터와 인덱스 사이즈가 문제가 된다. 센서ID와 timestamp 에 인덱스를 걸었을 떄 중복된 데이터에 대해서 인덱스를 걸기 때문에 문제가 되는 것이다. 이런 상황에서 버킷 패턴을 적용하면 아래와 같다.

{
    sensor_id: 12345,
    start_date: ISODate("2019-01-31T10:00:00.000Z"),
    end_date: ISODate("2019-01-31T10:59:59.000Z"),
    measurements: [
       {
       timestamp: ISODate("2019-01-31T10:00:00.000Z"),
       temperature: 40
       },
       {
       timestamp: ISODate("2019-01-31T10:01:00.000Z"),
       temperature: 40
       },
       … 
       {
       timestamp: ISODate("2019-01-31T10:42:00.000Z"),
       temperature: 42
       }
    ],
   transaction_count: 42,
   sum_temperature: 2413
}

measurement 라는 엔트리 안에 해당 센서에서 들어온 측정값을 모두 넣어주는 것이다. 즉 measurement라는 통(버킷) 안에 모두 넣어주는 것이다. measurement 안의 측정값의 개수는 transaction_count를 이용해 정하고 데이터가 들어가거나 나갈때마다 transaction_count를 가감해주는 방식으로 구현했다. 밑에 있는 sum_temperature는 measurement에 들어있는 측정된 온도를 모두 합친 값으로 이후에 통계값으로 사용하기 위해 이런식으로 구현했다.

 

몯고 DB의 하나의 도큐먼트는 16MB 초과할 수 없기 때문에 시작시간과 종료시간을 설정해 구현했으며 데이터를 로깅하는 resolution에 따라서 하나의 도큐먼트에 저장할 기간을 산정하면된다.

'Technology > DB' 카테고리의 다른 글

[MongoDB] aggregate explain  (0) 2022.09.16
[DB] 트랜잭션 격리 수준  (0) 2021.07.28