【发布时间】:2020-05-30 14:49:59
【问题描述】:
我需要创建一个至少如下所示的User 表:
public class User
{
public Guid Id {get; set;}
public string Username {get; set;}
public string EmailAddress {get; set;}
public DateTime CreatedOn {get; set;}
}
我目前正在将所有数据写入CosmosDB (SQL API)。问题是我需要为所有用户的Username 和EmailAddress 添加唯一索引策略。由于CosmosDB 的设计考虑了横向扩展,因此我需要对这个容器进行分区。如果这样做,我将无法跨分区强制执行唯一性。
目前,我的分区键是Id。如果我将分区键更改为Username 或EmailAddress,我担心更改这些字段可能会导致用户被删除(例如,如果用户名属于不同的分区,删除旧用户名和插入新用户名将是两个单独的事务,这意味着没有原子性。)。
对于这个问题有没有我想不到的CosmosDB 解决方案?我可以将此部分移至SQL Server,但随着时间的推移,我最终会维护一张大桌子。此外,由于我使用 Azure Functions 进行服务器处理,因此附带 EF DLL 会使应用程序变得不必要地大。
【问题讨论】:
-
您预计有多少用户?你不能把所有用户放在一个分区中吗?
-
这取决于应用程序的成功程度。一个分区可容纳 20 个演出。如果一切顺利,我预计将来我需要的容量会比这个容量多得多。现在,我将所有内容都保存在 SQL Server 中,但我不喜欢 EF dll 使我的无服务器应用程序变得太大。
-
另一个想法 - 您可以将电子邮件地址的域设置为 PartitionKey 吗?在这种情况下,所有 gmail 用户将进入一个分区,所有 hotmail 用户将进入另一个分区。
-
我认为这会导致分区策略不佳,因为超过一半的电子邮件是 gmail。理想情况下,分区键应该平均分配以实现高吞吐量(因此我使用了
Guid)。 -
使用 Guid,每个分区只有一个用户。这也是不可取的:)。
标签: sql-server azure azure-functions azure-cosmosdb