[英]Modelling Azure Cosmos DB
我打算為了自己的目的保存CoinMarketCap API的記錄。 我想每15分鍾在前100個加密硬幣上保存價格信息,我想將它保存在Azure Cosmos DB中。
由於我是文檔db的整個概念的新手,我需要一些幫助建模文檔。
首先我開始使用這個模型。
[
{
"id": "bitcoin",
"name": "Bitcoin",
"symbol": "BTC",
"rank": "1",
"price_usd": "573.137",
"price_btc": "1.0",
"24h_volume_usd": "72855700.0",
"market_cap_usd": "9080883500.0",
"available_supply": "15844176.0",
"total_supply": "15844176.0",
"percent_change_1h": "0.04",
"percent_change_24h": "-0.3",
"percent_change_7d": "-0.57",
"last_updated": "1472762067"
},
{
"id": "ethereum",
"name": "Ethereum",
"symbol": "ETH",
"rank": "2",
"price_usd": "12.1844",
"price_btc": "0.021262",
"24h_volume_usd": "24085900.0",
"market_cap_usd": "1018098455.0",
"available_supply": "83557537.0",
"total_supply": "83557537.0",
"percent_change_1h": "-0.58",
"percent_change_24h": "6.34",
"percent_change_7d": "8.59",
"last_updated": "1472762062"
},
...
]
但由於每次寫入數據庫時id都沒有改變,因此記錄只是更新,而不是聚合。 我想這是預期的。
因此,為了確保記錄匯總,我將模型重寫為此。
[
{
"id": <timestamp>_bitcoin
"identifier": "bitcoin",
"name": "Bitcoin",
"symbol": "BTC",
"rank": "1",
"price_usd": "573.137",
"price_btc": "1.0",
"24h_volume_usd": "72855700.0",
"market_cap_usd": "9080883500.0",
"available_supply": "15844176.0",
"total_supply": "15844176.0",
"percent_change_1h": "0.04",
"percent_change_24h": "-0.3",
"percent_change_7d": "-0.57",
"last_updated": "1472762067"
},
{
"id": <timestamp>_ethereum
"identifier": "ethereum",
"name": "Ethereum",
"symbol": "ETH",
"rank": "2",
"price_usd": "12.1844",
"price_btc": "0.021262",
"24h_volume_usd": "24085900.0",
"market_cap_usd": "1018098455.0",
"available_supply": "83557537.0",
"total_supply": "83557537.0",
"percent_change_1h": "-0.58",
"percent_change_24h": "6.34",
"percent_change_7d": "8.59",
"last_updated": "1472762062"
},
...
]
在這里,我添加了一個帶有時間戳的單獨id
,並引用了舊id,以使其唯一。
這工作正常,但我認為這是一些重復的數據(例如名稱和符號),我認為看起來很糟糕。 但也許這就是db world文檔中的情況?
我也想過這樣的模型。
[
{
"id": <timestamp>_bitcoin
"identifier": "bitcoin",
"name": "Bitcoin",
"symbol": "BTC",
"rank": "1",
"price_history": [{
"price_usd": "573.137",
"price_btc": "1.0",
"24h_volume_usd": "72855700.0",
"market_cap_usd": "9080883500.0",
"available_supply": "15844176.0",
"total_supply": "15844176.0",
"percent_change_1h": "0.04",
"percent_change_24h": "-0.3",
"percent_change_7d": "-0.57",
"last_updated": "1472762067"
]}
},
{
"id": <timestamp>_ethereum
"identifier": "ethereum",
"name": "Ethereum",
"symbol": "ETH",
"rank": "2",
"price_history": [{
"price_usd": "12.1844",
"price_btc": "0.021262",
"24h_volume_usd": "24085900.0",
"market_cap_usd": "1018098455.0",
"available_supply": "83557537.0",
"total_supply": "83557537.0",
"percent_change_1h": "-0.58",
"percent_change_24h": "6.34",
"percent_change_7d": "8.59",
"last_updated": "1472762062"
]}
},
...
]
但由於沒有選擇將新記錄添加到price_history
而不重寫整個文檔,這不是一個好主意。 此外,由於price_history
的記錄price_history
可能會price_history
增長,因此本文檔將變得非常龐大且難以處理。
接下來我想到分成單獨的文檔,但不確定這是否也是要走的路。 所以此刻我有點失落。
有什么建議么?
這是事實部分:
每個加密硬幣具有單個文檔並且以15分鍾的間隔在文檔中嵌入定價信息是不可行的。 Cosmos DB的文檔大小限制為2MB。 如果你采用嵌入策略,你將會超過這個大小限制。 此外,你是對的,更大的文件更難以使用,並導致更高的RU費用來檢索。
一般來說,在NoSQL中,重復數據不一定是罪魁禍首。 您需要考慮如何檢索數據以及需要使用哪些信息。 這一點尤其重要,因為關系數據庫中不存在關系連接。
現在對於完全意見部分:
考慮一個加密硬幣文檔,其中包含有關您需要跟蹤的每個硬幣的一般信息。 您實際上甚至可能不需要此文檔。
將時間序列數據存儲為單獨的文檔。 由於上述文檔大小限制,您實際上必須采用這種方式,並且時間戳讀數的數量沒有上限。
對於作為每個時間戳的一部分存儲的1小時,24小時和7天回顧聚合,您可以使用聚合函數進行查詢,並在每次編寫新條目時按時間戳設置這些屬性。 鑒於您只存儲了100種不同的加密貨幣,並且您的時間戳每15分鍾一次,這是可行的。
Ryan CrawCour和David Makogon在第9頻道播放了一個很棒的視頻 ,它處理了Cosmos DB中的建模數據,我發現這個數據非常有用。
這是一篇很好的文章,總結了非關系世界中數據建模的最佳實踐https://docs.microsoft.com/en-us/azure/cosmos-db/modeling-data
HTH
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.