Azure Cosmos DB建模

时间:2017-12-27 16:52:15

标签: azure data-modeling azure-cosmosdb

我打算为了自己的目的保存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中的记录数量可能会无限增长,因此本文档将变得非常庞大且难以处理。

接下来我想到分成单独的文档,但不确定这是否也是要走的路。所以我此刻有点迷失。

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

这是事实部分:

  1. 每个加密硬币只有一个文档,并且以15分钟的间隔在文档中嵌入定价信息是行不通的。 Cosmos DB的文档大小限制为2MB。如果你采用嵌入策略,你将会超过这个大小限制。此外,你是对的,更大的文件更难以使用,并导致更高的RU费用来检索。

  2. 在NoSQL中,一般来说,重复数据不一定是罪魁祸首。您需要考虑如何检索数据以及需要使用哪些信息。这一点尤其重要,因为关系数据库中不存在关系连接。

  3. 现在对于完全意见部分:

    • 考虑一个加密硬币文档,其中包含您需要跟踪的每个硬币的一般信息。您实际上甚至可能不需要此文档。

    • 将时间序列数据存储为单独的文档。由于上述文档大小限制,您实际上必须采用这种方式,并且时间戳读数的数量没有上限。

    • 对于作为每个时间戳的一部分存储的1小时,24小时和7天的回顾聚合,您可以使用聚合函数进行查询,并在每次编写新条目时按时间戳设置这些属性。鉴于您只存储了100种不同的加密货币,并且您的时间戳每15分钟一次,这是可行的。

    Ryan CrawCour和David Makogon在第9频道的

    There's a great video处理Cosmos DB中的建模数据,我发现这个数据非常有用。

答案 1 :(得分:-1)

这是一篇很好的文章,总结了非关系世界中数据建模的最佳实践https://docs.microsoft.com/en-us/azure/cosmos-db/modeling-data

HTH