IoT 데이터 모델링
이 페이지의 내용
사물 인터넷(IoT)은 인터넷에 연결된 물리적 객체의 네트워크입니다. 센서와 같은 많은 디바이스가 데이터를 생성합니다.
이 데이터를 효율적으로 저장하고 조회하려면 버킷 패턴을 사용하면 됩니다.
버킷 패턴
IoT 데이터를 정리하는 일반적인 방법은 데이터를 버킷으로 그룹화하는 것입니다. 버킷은 특정 데이터 그룹을 정리하여 다음과 같은 도움을 줍니다.
과거 트렌드를 살펴보고,
미래 트렌드를 예측하고,
스토리지 사용량을 최적화하세요.
데이터를 그룹화하기 위한 일반적인 매개변수는 다음과 같습니다.
시간
데이터 소스(다중 데이터 집합이 있는 경우)
고객
데이터 유형(예시: 금융 데이터의 트랜잭션 유형)
참고
MongoDB 5.0 부터 시계열 컬렉션 은 Time Series 데이터 에 권장되는 컬렉션 유형입니다. 버킷 패턴 을 time series 컬렉션과 함께 사용하면 성능이 저하될 수 있으므로 사용하지 마세요 .
센서에서 얻은 온도 데이터를 저장하는 collection을 예로 들어보겠습니다. 센서는 매분 온도를 기록하고 temperatures
라는 컬렉션에 데이터를 저장합니다.
// temperatures collection { "_id": 1, "sensor_id": 12345, "timestamp": ISODate("2019-01-31T10:00:00.000Z"), "temperature": 40 } { "_id": 2, "sensor_id": 12345, "timestamp": ISODate("2019-01-31T10:01:00.000Z"), "temperature": 40 } { "_id": 3, "sensor_id": 12345, "timestamp": ISODate("2019-01-31T10:02:00.000Z"), "temperature": 41 } ...
이 접근 방식은 데이터 및 인덱스 크기 측면에서 확장성이 떨어집니다. 예를 들어 애플리케이션에 sensor_id
및 timestamp
필드에 대한 인덱스가 필요한 경우 센서에서 수신되는 모든 판독값을 인덱싱해야 성능을 개선할 수 있습니다.
문서 모델을 활용하여 특정 기간에 대한 측정값을 보관하는 문서에 데이터를 버킷할 수 있습니다. 매분마다 읽은 값을 시간 단위 그룹으로 버킷화하는 다음과 같은 업데이트된 스키마를 고려하세요.
{ "_id": 1, "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": 1783 }
이 업데이트된 스키마는 확장성을 개선하고 애플리케이션이 실제로 데이터를 사용하는 방식을 반영합니다. 사용자는 특정 온도 수치를 쿼리하지 않을 가능성이 높습니다. 대신 사용자는 한 시간 또는 하루 동안의 온도 동작을 쿼리할 가능성이 높습니다. 버킷 패턴은 데이터를 균일한 기간으로 그룹화하여 이러한 쿼리를 용이하게 합니다.
계산된 패턴과 버킷 패턴 결합
예제 문서 에는 두 개의 계산된 필드 transaction_count
및 sum_temperature
가 포함되어 있습니다. 애플리케이션에서 특정 시간 동안의 온도 합계를 자주 검색해야 하는 경우 총 합계를 계산하면 애플리케이션 리소스를 절약하는 데 도움이 될 수 있습니다. 이 계산된 패턴 접근 방식을 사용하면 데이터가 요청될 때마다 합계를 계산할 필요가 없습니다.
사전 집계된 sum_temperature
및 transaction_count
값을 사용하면 특정 버킷의 평균 온도(sum_temperature
/ transaction_count
)와 같은 추가 계산이 가능합니다. 사용자가 오후 2시 3분에 특정 온도를 쿼리하는 것보다 오후 2시에서 3시 사이의 평균 온도를 애플리케이션에 쿼리할 가능성이 훨씬 더 높습니다. 특정 값을 버킷 지정하고 사전 계산하면 애플리케이션이 해당 정보를 더 쉽게 제공할 수 있습니다.
MongoDB의 시간 표현
MongoDB는 기본적으로 시간을 UTC로 저장하며, 모든 현지 시간 표현을 이 형식으로 변환합니다. 수정되지 않은 일부 현지 시간 값으로 작동하거나 보고해야 하는 애플리케이션은 UTC 타임스탬프와 함께 구역을 저장하고 애플리케이션 로직에서 원래 현지 시간을 계산할 수 있습니다.
예시
MongoDB Shell에서는 현재 날짜와 UTC를 기준으로 한 현재 클라이언트 오프셋을 모두 저장할 수 있습니다.
var now = new Date(); db.data.insertOne( { date: now, offset: now.getTimezoneOffset() } );
저장된 오프셋을 적용하여 원래 현지 시간을 재구성할 수 있습니다.
var record = db.data.findOne(); var localNow = new Date( record.date.getTime() - ( record.offset * 60000 ) );