我正在构建一个DynamoDB应用程序,最终将为大量(数百万)用户提供服务。目前该应用程序的项目模式很简单:
{
userId: "08074c7e0c0a4453b3c723685021d0b6", // partition key
email: "foo@foo.com",
... other attributes ...
}
当新用户注册时,或者如果用户希望通过电子邮件地址找到另一个用户,我们需要通过电子邮件而不是用户ID来查找用户。对于当前的模式,这很简单:只需使用一个全局二级索引和电子邮件作为分区键。
但是我们希望为每个用户启用多个电子邮件地址,并且DynamoDBQuery
操作不支持List
-类型的Key条件表达式
。所以我正在权衡几个选项,以避免每次用户注册或想要通过电子邮件地址查找另一个用户时进行昂贵的Scan
操作。
下面是我计划更改的内容,以便为每个用户启用额外的电子邮件。这是一个好方法吗?有更好的选择吗?
仍然可以使用相同的全局二级索引(使用分区键作为电子邮件)来查找主电子邮件地址和非主电子邮件地址。
如果用户想要更改其主要电子邮件地址,我们将交换“主要”和“非主要”项目中的值。(现在DynamoDB支持事务,这样做会比以前更安全!)
如果我们需要删除一个用户,我们必须删除该用户ID的所有项目。如果我们需要合并两个用户,那么我们必须合并该用户ID的所有项目。
相同的方法(具有相同userId
但不同排序键的新项目)可用于其他需要Query
-able的1-用户拥有多值数据
这是一个好方法吗?有更好的方法吗?