Azure宇宙数据库建模

Azure宇宙数据库建模,azure,data-modeling,azure-cosmosdb,Azure,Data Modeling,Azure Cosmosdb,我正计划为自己的目的保存来自的记录。 我想每15分钟保存前100个加密硬币的价格信息,并将其保存在Azure Cosmos DB中 因为我对文档数据库的整个概念还不熟悉,所以我需要一些帮助来建模文档 首先,我从这个模型开始 [ { "id": "bitcoin", "name": "Bitcoin", "symbol": "BTC", "rank": "1", "price_usd": "573.137",

我正计划为自己的目的保存来自的记录。 我想每15分钟保存前100个加密硬币的价格信息,并将其保存在Azure Cosmos 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并不是每次写入DB时都会更改,所以记录只会更新,而不会聚合。我想这是意料之中的

因此,为了确保记录被聚合,我将模型改写为这个

[
    {
        "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"
    },
    ...
] 
但是,如果不重写整个文档,就无法将新记录添加到
price\u history
,这不是一个好主意。此外,由于
price\u history
中的记录数量可能会无限增长,因此该文档将变得非常庞大,难以处理

接下来,我考虑将文档拆分为单独的文档,但也不确定这是否是一种方法。所以我现在有点不知所措


有什么建议吗?

以下是事实部分:

  • 每个加密硬币都有一个文档,并且每隔15分钟在文档中嵌入定价信息是不可行的。Cosmos DB的文档大小限制为2MB。如果您追求嵌入策略,您将突破该大小限制。此外,您还可以说,更大的文档更难处理,并且检索时会产生更高的RU费用

  • 一般来说,在NoSQL中,数据的重复不一定是一个大罪。您需要考虑如何检索数据以及需要处理哪些信息。这一点尤其重要,因为关系数据库中不存在关系连接

  • 现在让我们来看看完整的意见部分:

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

    • 将时间序列数据存储为单独的文档。实际上,由于前面提到的文档大小限制,您必须这样做,并且时间戳读取的数量没有上限

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


    在Ryan CrawCour和David Makogon的第9频道,该频道处理Cosmos DB中的建模数据,我发现这对我了解这一点非常有帮助

    这是一篇很好的文章,总结了非关系世界中数据建模的最佳实践


    HTH

    您能否详细说明每种加密货币聚合定价信息(如果有)的要求?或者,您只需要记录每个时间戳在过去一小时、一天和一周内的百分比变化?我想保留历史数据以便对其进行分析。一个例子是回到过去,检查新闻对价格变化的影响,或其他类似情况。我还想玩Azure机器学习,为了使用它,我需要一些数据来分析。感谢您抽出时间回答我的问题。我得出了几乎相同的结论,并将研究一个用于加密信息的文档,以及一个用于所有价格快照的文档集合,每个快照都有一个单独的文档。也会看看视频,很棒的提示!我认为第9频道的视频中已经介绍了这一点,但您也可以使用一种混合模式:保留Rob描述的单个摘要文档和许多时间序列价格文档。但是,还要在摘要文档中以嵌套数组的形式编写最后的x(比如10)个时间序列文档。@MichaelFinger,这是一个很好的观点。不过,这确实需要一点簿记才能完成。考虑到文档检索的速度以及计算回溯指标后每个时间序列条目都是不可变的事实,我不知道在这种情况下是否有必要。我现在有两个集合,在ticker集合中,我保留了最后一个价格历史记录,因此,我可以始终仅查询一个文档以获取当前价格信息。如果我需要历史记录,所有历史数据都存储在一个单独的集合中。
    [
        {
            "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"
            ]}
        },
        ...
    ]