簡體   English   中英

Azure Cosmos DB建模

[英]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增長,因此本文檔將變得非常龐大且難以處理。

接下來我想到分成單獨的文檔,但不確定這是否也是要走的路。 所以此刻我有點失落。

有什么建議么?

這是事實部分:

  1. 每個加密硬幣具有單個文檔並且以15分鍾的間隔在文檔中嵌入定價信息是不可行的。 Cosmos DB的文檔大小限制為2MB。 如果你采用嵌入策略,你將會超過這個大小限制。 此外,你是對的,更大的文件更難以使用,並導致更高的RU費用來檢索。

  2. 一般來說,在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.

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