azure-cosmosdb - Cosmos db 用户 ID/电子邮件作为分区键
问题描述
我在为存储用户数据的分区键选择最佳(合成)值时遇到了难题。
用户文档有: - id (guid) - 电子邮件(用于登录,例如) - 个人资料数据
有两种主要类型的查询:
id
通过(大多数查询)寻找用户email
通过(登录和一些管理员查询)寻找用户
我想避免跨分区查询。
如果我选择id
(partitionKey
合成字段),那么登录查询将是跨分区的。另一方面,如果我选择email
然后如果用户更改电子邮件 - 这是一个问题。
我在想的是在集合中引入新类型。就像是:
userId: guid,
userEmail: “email1”,
partitonKey: “users-mappings”
然后我可以将User
文件本身作为:
id: someguid,
type: “user”,
partitionKey: “user_someguid”,
profileData: {}
这样当用户登录时,我首先检查映射类型/分区email
,获取guid
然后检查实际User
文档guid
。
此外,这种方式可以在不影响分区的情况下更改电子邮件。
这是一种有效的方法吗?有什么问题吗?我错过了什么吗?
解决方案
如您所知,在查询 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 成本并优化性能。
推荐阅读
- geoserver - WCS 2.0.1 不适用于 ESRI Javascript 3.33
- c# - C# AssignedSchedule 任务序列 SDK SCCM
- python - 如何在不将配置文件存储在 GitHub 上的情况下部署 python 项目?
- java - Dockerfile 无法复制指定的本地目录和文件
- javascript - 使用 typescript 或 javascript 将对象数组转换为字符串数组
- sql - 可以在 BigQuery 参数中使用在 IN () 内连接的变量,而无需使用 EXECUTE
- webpack - 如何配置 webpack-serve?
- java - JOOQ - 缺少方言
- sas - 如何在 SAS 程序中关闭 X 命令窗口?
- multithreading - 长时间无法连接到 MQTT 代理和 greenthreads 无法正常工作