首页 > 解决方案 > Cosmos db 用户 ID/电子邮件作为分区键

问题描述

我在为存储用户数据的分区键选择最佳(合成)值时遇到了难题。

用户文档有: - id (guid) - 电子邮件(用于登录,例如) - 个人资料数据

有两种主要类型的查询:

  1. id通过(大多数查询)寻找用户
  2. email通过(登录和一些管理员查询)寻找用户

我想避免跨分区查询。

如果我选择idpartitionKey合成字段),那么登录查询将是跨分区的。另一方面,如果我选择email然后如果用户更改电子邮件 - 这是一个问题。

我在想的是在集合中引入新类型。就像是:

userId: guid,
userEmail: “email1”,
partitonKey: “users-mappings”

然后我可以将User文件本身作为:

id: someguid,
type: “user”,
partitionKey: “user_someguid”,
profileData: {}

这样当用户登录时,我首先检查映射类型/分区email,获取guid然后检查实际User文档guid

此外,这种方式可以在不影响分区的情况下更改电子邮件。

这是一种有效的方法吗?有什么问题吗?我错过了什么吗?

标签: azure-cosmosdb

解决方案


如您所知,在查询 Cosmos DB 时,Fan-out 应该是最后一个查询选项,尤其是在登录等大容量操作时。另外,大数据的 RU 成本会显着提高。

在 Cosmos DB SQL API 中,一种模式是使用合成分区键。您可以通过连接 id 和写入时的电子邮件来组成合成分区键。此模式适用于提供灵活性的无数查询场景。

像这样的东西:

{
  "id": "123",
  "email":"joe@abc.com",
  "partitionKey":"123-joe@abc.com"
}

然后在阅读时,执行以下操作:

SELECT  s.something
FROM    s
WHERE   STARTSWITH(s.partitionKey, "123")
        OR
        ENDSWITH(s.partitionKey, "joe@abc.com")

您还可以使用 SUBSTRING() 等...

使用上述方法,您可以通过他们的id电子邮件搜索用户,并且仍然使用分区键的效率,从而最大限度地降低查询 RU 成本并优化性能。


推荐阅读