database-design - DynamoDB 单表设计中的分区键或排序键是否应该仅包含不太可能更改的字段?

标签 database-design nosql amazon-dynamodb

我看到了几个 DynamoDB 单表设计示例,其中分区键或排序键包含“名称”、“用户名”或“电子邮件地址”等值。考虑以下示例(来自 AWS 资源):

PK:HR-EMPLOYEE1, SK:约翰·史密斯

AWS GSI overloading table example

用户可以更改他的名字吗?

如果不是,更合适的 SK 定义是什么来允许此操作?

最佳答案

首先一个事实:主键无法更新。 (分区+排序键)。

回答您的问题,是的,如果名称是 sortKey,用户可以更改他/她的名称,但它会强制您替换当前条目。

这需要您进行额外的工作,处理所有引用并删除并创建新项目。 Dynamo 不具有行之间的引用完整性。 如果您认为在事务中执行此路径可能是个好主意。

正如您可能已经在一些视频和文档中看到的那样。排序键等于分区键是一种常见的做法。如果您创建一个反向 GSI,启用一组良好的访问模式(同时使用单表设计),这可能会在以后有所帮助。

      PK               SK                ATTRIBUTES
USER#SOME_HASH  USER#SOME_HASH   NAME - EMAIL - ETC

从这里开始,如果您需要对名称执行搜索,本地二级索引 (LSI) 就可以解决问题。我们通常做的事情是创建字符串的“slug”以进行更强大的搜索。

显然,GSI 也可以让您执行此搜索,您可以通过创建稀疏索引来完成它。

祝你编码愉快。

关于database-design - DynamoDB 单表设计中的分区键或排序键是否应该仅包含不太可能更改的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62965707/

相关文章:

mysql:选择所有被通知的人

sql - 在 MySQL 中对数据库表进行分区

mapreduce - 使用 map-reduce (Couchbase) 编写一个简单的组

python - 在 Python 中将 JSON 数据存储在 Aerospike 中

amazon-web-services - 如何在dynamodb中使用自动递增主键id

java - 如何在基于 Java 的 DynamoDB 应用程序中设置 TTL

mysql - 如何从 Mysql 中的不相关表强制执行外键约束?

SQL Server、LINQ-to-SQL 和表示容器类中的多个组件

lua - 如何向 Tarantool 空间添加新字段

python - DynamoDB 扫描函数返回正确的结果,但出现 DynamoDBResponseError