2017-12-27 478 views
1

我正計劃爲自己的目的從CoinMarketCap API保存記錄。 我想每隔15分鐘將價格信息保存在前100個加密硬幣上,我想將它保存在Azure Cosmos數據庫中。建模Azure Cosmos DB

由於im新的文檔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世界中的方式?

我也想過這樣的模型。

[ 
    { 
     "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中的記錄數量將無限制地增長,因此該文檔將變得非常龐大且難以處理。

接下來我想分解成單獨的文件,但不知道如果這是要走的路。所以我現在有點迷路了。

有什麼建議嗎?

+0

你能在你的每cryptocurrency聚集的價格信息(如果有的話)的要求詳細點嗎?或者是你只需要記錄每個時間戳最後一小時,一天和一週的百分比變化? –

+0

我想保留歷史數據以便分析它。一個例子就是及時檢查新聞對價格變化或其他類似情景的影響。還想玩Azure機器學習,並且爲了使用我需要的一些數據來分析。 – Martin

回答

4

這裏的事實部分:

  1. 具有每加密硬幣單一的文件,在15個分鐘的間隔在文檔中嵌入定價信息是不可行的。 Cosmos DB具有2MB的文檔大小限制。如果你追求嵌入策略,你將衝破這個大小限制。另外,你說得對,更大的文件更難以處理,並且會招致更高的RU費用。

  2. 在NoSQL中,一般來說,數據的重複不一定是主要的罪。您需要考慮如何檢索數據以及您需要使用哪些信息。這一點尤其重要,因爲關係數據庫中不存在關係連接。

現在的完全意見部分:

  • 考慮包含關於每個需要跟蹤的硬幣一般信息的加密文件的硬幣。你甚至可能不需要這個文件。

  • 將時間序列數據存儲爲單獨的文檔。由於前面提到的文檔大小限制,您實際上必須採用這種方式,並且時間戳讀數的數量沒有上限。

  • 對於存儲爲每個時間戳一部分的1小時,24小時和7天回溯聚合,您可以使用聚合函數進行查詢,並在每次編寫新條目時設置每個時間戳的這些屬性。鑑於您只存儲100種不同的加密貨幣,並且您的時間戳每15分鐘一次,這是可行的。

There's a great video第9頻道由Ryan CrawCour和大衛Makogon,隨着宇宙DB建模數據,我得到解決此我的頭的時候發現非常有幫助的交易。

+1

感謝您花時間回答我的問題。我幾乎得出了相同的結論,並將考慮爲加密信息創建一個文檔,併爲所有價格快照創建一個文檔集合,併爲每個快照創建一個單獨的文檔。還會看視頻,很棒的提示! – Martin

+1

我認爲它包含在Channel 9視頻中,但您也可以使用混合模型:按照Rob的描述保留單個摘要文檔和許多時間系列價格文檔。但是,也可以將最後一個x(比如說10個)時間系列文檔作爲嵌套數組寫入摘要文檔。 –

+1

@MichaelFinger,這是一個很好的觀點。它確實需要一些簿記才能完成。鑑於文檔檢索的速度以及在計算回溯指標後每個時間序列條目都是不可變的事實,我不知道在這種情況下是否有必要。 –

相關問題