您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)MongoDB開(kāi)發(fā)系中什么是數(shù)據(jù)集設(shè)計(jì)分桶范式,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
數(shù)據(jù)集設(shè)計(jì)模式,MongoDB在官方文檔https://docs.mongodb.com/ecosystem/ 中的use cases部分提供了詳細(xì)的參考內(nèi)容。
分桶模式是MongoDB數(shù)據(jù)集設(shè)計(jì)的一種范式。
所謂分桶優(yōu)化,就是與其對(duì)每一條數(shù)據(jù)創(chuàng)建一個(gè)文檔,我們可以把某一個(gè)時(shí)間段內(nèi)的測(cè)量數(shù)據(jù)聚合到一起放到一個(gè)文檔內(nèi),利用MongoDB提供的內(nèi)嵌式數(shù)組或子文檔特性
我們知道許多傳感器數(shù)據(jù)都是時(shí)間序列數(shù)據(jù)。例如:風(fēng)傳感器,潮汐監(jiān)測(cè)以及位置追蹤等采集數(shù)據(jù)的無(wú)非這種類(lèi)型: Timestamp,采集器名稱/ID,采集值。對(duì)于時(shí)序類(lèi)型的數(shù)據(jù),我們可以采用一種叫做時(shí)間分桶的優(yōu)化策略。
簡(jiǎn)單的說(shuō) 時(shí)間序列就是各時(shí)間點(diǎn)上形成的數(shù)值序列,時(shí)間序列分析就是通過(guò)觀察歷史數(shù)據(jù)預(yù)測(cè)未來(lái)的值。采用分桶設(shè)計(jì)寫(xiě)入的數(shù)據(jù)集,元素更多的是采用時(shí)間作為排序元素,依次寫(xiě)入和讀取。
官方有一篇翻譯文章,專(zhuān)門(mén)敘述 分桶設(shè)計(jì)模式
基礎(chǔ)數(shù)據(jù)集如下
{
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
}
改進(jìn)后的文檔集如下
{
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
}
我們?cè)诔绦驅(qū)懭胛臋n時(shí),可以做一些簡(jiǎn)單的計(jì)算和整理,按時(shí)間分段,根據(jù)業(yè)務(wù)需要,將一個(gè)時(shí)間斷內(nèi)的大量文檔合并,避免數(shù)據(jù)使用時(shí)的隨機(jī)聚合和查詢。這樣的時(shí)間段,可以理解為桶。
在處理時(shí)間序列數(shù)據(jù)時(shí),知道2018年7月13日加利福尼亞州康寧市下午2:00至3:00的平均溫度通常比知道下午2:03那一時(shí)刻的溫度更有意義也更重要。通過(guò)用桶組織數(shù)據(jù)并進(jìn)行預(yù)聚合,我們可以更輕松地提供這些信息。
官方有一篇關(guān)于Iot使用場(chǎng)景的推薦文章 https://www.mongodb.com/customers/bosch,可以作為參考。
https://docs.mongodb.com/ecosystem/use-cases/storing-comments/ Hybrid Schema Design節(jié)點(diǎn)下說(shuō)明了評(píng)論中的分桶操作場(chǎng)景。
首先我們看數(shù)據(jù)集模式
_id: ObjectId(...),
discussion_id: ObjectId(...),
bucket: 1,
count: 42,
comments: [ {
slug: '34db',
posted: ISODateTime(...),
author: { id: ObjectId(...), name: 'Rick' },
text: 'This is so bogus ... ' },
... ]
}
我在數(shù)據(jù)集設(shè)計(jì)的文章中提到分桶模式的設(shè)計(jì)場(chǎng)景,主要用于時(shí)間序列的數(shù)據(jù)預(yù)處理和分塊存儲(chǔ)。時(shí)間序列也就是按照時(shí)間的先后排序,依次寫(xiě)入。分塊的標(biāo)準(zhǔn)可以是時(shí)間,比如一天,一個(gè)小時(shí),或者是評(píng)論數(shù)目。
Also, 100 comments is a soft limit for the number of comments per bucket. This value is arbitrary: choose a value that will prevent the maximum document size from growing beyond the 16MB BSON documentsize limit
,
以上總體含義是說(shuō)每個(gè)桶內(nèi)的元素個(gè)數(shù)不是固定的,是應(yīng)用開(kāi)發(fā)時(shí),根據(jù)實(shí)際情況評(píng)估后的一個(gè)度量。但是需要考慮MongoDB本身每個(gè)文檔最多16M的限制。
對(duì)于應(yīng)用程序來(lái)說(shuō),這樣的設(shè)計(jì)模式在寫(xiě)入操作是需要做一些簡(jiǎn)單的邏輯,來(lái)確定寫(xiě)入哪個(gè)桶,以及簡(jiǎn)單計(jì)算,如下
if bucket['count'] > 100:
db.discussion.update(
{ 'discussion_id: discussion['_id'],
'num_buckets': discussion['num_buckets'] },
{ '$inc': { 'num_buckets': 1 } } )
借助2019年MongoDB中國(guó)用戶大會(huì)的一張PPT更加清晰的認(rèn)識(shí)下分桶范式
buckets.png
文章中的觀點(diǎn)有不嚴(yán)謹(jǐn)之處,歡迎評(píng)論溝通。邊學(xué)習(xí),邊實(shí)踐,邊參考,邊改進(jìn),在問(wèn)題中成長(zhǎng)。
看完上述內(nèi)容,你們對(duì)MongoDB開(kāi)發(fā)系中什么是數(shù)據(jù)集設(shè)計(jì)分桶范式有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。