簡體   English   中英

如何設計NoSQL DB

[英]How to design this NoSQL DB

我正在嘗試為自己創建一個使用DynamoDB的簡單應用程序。 我從來沒有在高級上使用NoSQL,只是在這里和那里存儲值。

該應用程序是一個記錄器。 我將記錄一些內容,而Dynamo將記錄日期和日期。

例如,一個用戶今天記錄了很多東西,它只會說出今天的日期和logging_times:5

然后,我可以進行查詢以獲取過去一周/天/月等所有記錄時間的總和。

我的問題是您如何構建NoSQL數據庫來執行類似這樣的高效操作?

NOSQLdb的一些概念

  1. 寫操作應該在主鍵上平均分配。
  2. 讀取應該在主鍵上平均分配。

看着給定的問題和dyanamodb模式,顯而易見的事情是

將鍵logs作為主鍵,並將timestamp作為輔助鍵。 並做一個聚合使用

select * where pk=logs and sk is_between x and y

但這將違反這兩個概念。 我們總是在單個pk上書寫,並且總是從同一個pk讀取。

現在到這個特殊的問題,我們的PK應該足夠隨機(這樣就沒有熱鍵 )並且確定性就足夠(以便我們可以查詢)

在設計密鑰時,我們將不得不對應用程序進行一些假設。 假設我們決定每小時更新一次。 因此可以將2018年1月7日作為密鑰。 其中17表示17小時。 此密鑰是確定性的,但不夠隨機。 並且1月7日的每次更新或讀取都將大部分移至同一分區。 為了使密鑰隨機,我們可以使用像md5這樣的哈希算法來計算它的哈希。 假設經過哈希處理后,我們的密鑰變為1sdc23sjdnsd。 如果您正在查看表數據,這將毫無意義。 但是,如果您想知道2018年1月7日的事件計數,您只需對時間進行哈希處理並使用hashkey從dynamodb中獲取即可。 如果您想知道2018年1月7日的所有事件,則可以重復進行24次獲取並匯總計數。

現在,這種模式會出現問題

  1. 如果您決定從每小時更改為分鍾。

  2. 如果您的大多數查詢都是運行時,例如,請向我索取過去2,4,6天的所有數據。 這將意味着到數據庫的往返次數過多。 而且,這將浪費時間和成本。

經驗法則是, 在明確定義查詢模式時,出於性能原因,請使用NOSQL並存儲結果。 如果您嘗試在nosql上進行聯接或聚合查詢,則將根據您的技術選擇強制使用案例。

您還可以查看有關存儲時間序列數據的aws建議

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM