在 DynamoDB 中使用 json 作为排序键/分区键值是一种好的做法吗?

laa*_*haa 5 amazon-web-services nosql amazon-dynamodb

尝试为 DynamoDB 表定义架构。两个以上的值决定一行。

放置这些键值的一种潜在解决方案是让排序键包含多个值。正如此处指定的那样。

受这种方法的启发,我认为不使用简单的分隔符将值连接在一起,而是使用 JSON 或对象的任何其他字符串表示形式(例如:Jackson 翻译的字符串)作为排序键的值应该能够实现类似的目标并且易于转换。

但是,我担心这样做 - 添加排序键的长度 - 会降低 DynamoDB 的性能吗?使用复杂的字符串作为排序键可以吗?

小智 2

TL;DR:对于排序键,您可以使用任何字符串(在字节限制内)来区分主键中的记录。但如果你聪明的话,你可以更好地利用它进行排序和过滤。


密钥长度有限制:

  • 分区键:12048字节
  • 排序键:11024字节

我不知道根据主键和排序键的长度有任何显着的性能差异。我确信确保性能是 AWS 设置这些特定限制的部分原因。

从技术上讲,您应该可以使用任何字符串作为密钥,包括 JSON。但是,根据您打算如何查询表,您可能需要考虑对排序键进行更巧妙的安排。

例如,如果您的排序键包含名字和姓氏,则最终可能会得到如下 JSON:

{"LastName":"Doe","FirstName":"John"}
{"FirstName":"Jane","LastName":"Doe"}
Run Code Online (Sandbox Code Playgroud)

JSON 本身并不关心名称字段的顺序,因此如果您不对 JSON 添加额外的约束,则可能会很难查询姓氏为“Doe”的所有记录。

您链接的文档暗示了您可能遵循的排序键模式示例:

LASTNAME#Doe#FIRSTNAME#John
LASTNAME#Doe#FIRSTNAME#Jane
Run Code Online (Sandbox Code Playgroud)

startsWith现在您可以使用条件“ ”轻松查询姓氏为 Doe 的所有记录LASTNAME#Doe#FIRSTNAME#。您的记录也会自然地按姓氏、名字排序。

当您想要查找记录的名字和姓氏时,不必解析该字符串,为了方便起见,您可以通过为“FirstName”和“LastName”添加单独的字段来复制记录中的内容。

因此,您的完整记录可能如下所示:

{"LastName":"Doe","FirstName":"John"}
{"FirstName":"Jane","LastName":"Doe"}
Run Code Online (Sandbox Code Playgroud)