【问题标题】:How to design a social network with CosmosDB gremlin API?如何使用 CosmosDB gremlin API 设计社交网络?
【发布时间】:2017-10-11 18:42:34
【问题描述】:

我想使用 CosmosDB Gremlin API 构建一个社交网络,但我无法理解如何选择一个好的分区键。

为简单起见,假设我们的应用程序仅包含用户,这些用户可以关注其他用户(Instagram 风格),并且用户可以创建他们可以将其关注者放入的群组(Google Plus 圈子风格)。

假设图形数据库有这些顶点:

  • 应用用户
  • 追随者组

并具有以下关系:

  • AppUser - 拥有 -> FollowerGroup
  • AppUser - 关注 -> AppUser
  • AppUser - belongsTo -> FollowerGroup

我认为 appUserId 将是分区键的理想候选者。这样,与该用户相关的所有内容(帖子、图片等)都将保存在同一个分区中。

我的困境在于关注其他用户。如果分区键是 appUserId,那么每个用户的数据将被拆分到自己的分区中。这对于满足跨分区分布写入和均匀分布数据的规则非常有用。

但是当我想查询时会发生什么,比如说用户关注的所有人,以及获取他们的状态。假设我正在关注 20 个人。获取该数据的查询必须跨越 20 个分区才能检索所有数据。这不遵循查询应从同一分区中提取以获得最佳性能的规则。

谁能给我一个更好的分区键来使用?还是更好的数据建模方式?

【问题讨论】:

  • 将您的 PartitionKey 设为“PartitionKey”或“Key”之类的通用名称,并让您的应用程序在插入时对其进行设置,以便您可以优化不同的读/写模式

标签: partitioning azure-cosmosdb gremlin


【解决方案1】:

这是社交网络的经典问题,已被多次提及。网上有很多资源可供阅读。

本质上,对于横向扩展图,很难避免查询跨分区。

最终的设计选择将取决于 1.你打算处理什么规模 2. 您的查询工作负载(例如,所有查询)。如果您了解所有查询及其频率,则可以优化您的分区策略。

【讨论】:

  • 感谢您的链接。我得去看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
相关资源
最近更新 更多