c# - 是否可以在 Azure Cosmos DB 中对可扩展的关注者/关注关系进行建模?

标签 c# azure nosql azure-cosmosdb scalability

假设我有一个如下所示的模型类:

public class Relationship
{
  public Guid PartitionKey { get; set; }

  public Guid Id { get; set; }

  public DateTime CreatedOn { get; set; }
}
  • PartitionKeyRelationship 容器的分区键,它由被关注者的用户 ID 表示。 (接收者)

  • Id 是容器的 id,它由关注其他用户的人的用户 id 表示。 (发件人)

该模型确保相同的Id不能添加到相同的PartitionKey,从而使得两个用户之间只能创建一次follower/following关系。它还使我能够轻松查找特定人员的所有关注者列表,这一点至关重要。

问题是每个逻辑分区的数据限制为 10 GB。考虑到实际的关系模型可能具有更多属性,并且在幕后发生自动索引,并且某些用户拥有数百万关注者,因此将达到此限制,并且无法允许新的关系相同的分区键。

如何在 Cosmos DB 上设计这一模型,使其真正具有可扩展性?

最佳答案

这里的标准方法是手动将数据分片到多个分区,通常使用 synthetic partition key由多个元素组合而成。

一个简单的策略是使用用户记录中的整数字段来跟踪用于存储所有关注者记录的“存储桶”数量,然后根据需要向每个存储桶分区发送查询。桶的数量可以随着数据的增长而增加。

例如,分区键将构造为[user_id]+[follower_bucket_count]。您还可以维护每个存储桶的计数以实现更高级的负载平衡,但这可能没有必要启动。

关于c# - 是否可以在 Azure Cosmos DB 中对可扩展的关注者/关注关系进行建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56120694/

相关文章:

c# - 为什么不调用此 C# 4.0 异步方法?

c# - 将子列表转换为父类型列表

azure - Azure SignalR 和 Azure 服务总线之间有什么区别

c# - 是否所有的局部变量都入栈

c# - 无法调用采用在不同程序集中定义的类型的参数的函数

c# - 使用 Selenium WebDriver.dll 的 Azure 函数

azure - 如何使用 Application Insight 的持久性 channel 防止丢失遥测事件?

javascript - 代码没有按顺序执行

mysql - 运行 MongoDB 所花费的时间

nosql - CouchDB 是 Membase 的良好持久层吗?