[英]How to design this NoSQL DB
我正在嘗試為自己創建一個使用DynamoDB的簡單應用程序。 我從來沒有在高級上使用NoSQL,只是在這里和那里存儲值。
該應用程序是一個記錄器。 我將記錄一些內容,而Dynamo將記錄日期和日期。
例如,一個用戶今天記錄了很多東西,它只會說出今天的日期和logging_times:5
然后,我可以進行查詢以獲取過去一周/天/月等所有記錄時間的總和。
我的問題是您如何構建NoSQL數據庫來執行類似這樣的高效操作?
NOSQLdb的一些概念
看着給定的問題和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次獲取並匯總計數。
現在,這種模式會出現問題
如果您決定從每小時更改為分鍾。
如果您的大多數查詢都是運行時,例如,請向我索取過去2,4,6天的所有數據。 這將意味着到數據庫的往返次數過多。 而且,這將浪費時間和成本。
經驗法則是, 在明確定義查詢模式時,出於性能原因,請使用NOSQL並存儲結果。 如果您嘗試在nosql上進行聯接或聚合查詢,則將根據您的技術選擇強制使用案例。
您還可以查看有關存儲時間序列數據的aws建議 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.