gpt4 book ai didi

azure - Azure Cosmos DB 建模

转载 作者:行者123 更新时间:2023-12-03 00:50:21 25 4
gpt4 key购买 nike

我计划保存来自 CoinMarketCap API 的记录为了自己的目的。我想每 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 都没有改变,因此记录只是更新,而不是聚合。我想这正如预期的那样。

因此,为了确保记录已聚合,我将模型重写为这样。

[
{
"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 的引用,以使其具有唯一性。

这工作正常,但我认为这是一些重复的数据(例如名称和符号),我认为有双重看起来很糟糕。但也许文档数据库世界就是这样?

我也考虑过这样的模型。

[
{
"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 中的记录数量可能会无限增长,因此该文档将变得非常大且难以处理。

接下来我考虑拆分成单独的文档,但不确定这是否是可行的方法。所以我现在有点迷失。

有什么建议吗?

最佳答案

以下是事实部分:

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

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

现在是完整的意见部分:

  • 考虑一个加密货币文档,其中包含有关您需要跟踪的每种货币的一般信息。您实际上可能根本不需要这份文件。

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

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

There's a great video Ryan CrawCour 和 David Makogon 在第 9 channel 上报道了处理 Cosmos DB 中的建模数据的内容,我发现这对我理解这一点非常有帮助。

关于azure - Azure Cosmos DB 建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47995838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com