在 DynamoDB 中使用 json 作为排序键/分区键值是否是良好做法?



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

放置这些键值的潜在解决方案是让排序键包含多个值。正如这里指定的。

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

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

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


密钥长度有限制:

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

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

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

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

{"LastName":"Doe","FirstName":"John"}
{"FirstName":"Jane","LastName":"Doe"}

JSON本身并不关心名称字段的顺序,因此,如果不对 JSON 施加其他约束,则可能会使查询具有 LastName "Doe" 的所有记录变得困难。

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

LASTNAME#Doe#FIRSTNAME#John
LASTNAME#Doe#FIRSTNAME#Jane

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

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

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

{
"PK":"some-primary-key",
"SK":"LASTNAME#Doe#FIRSTNAME#John",
"FirstName":"John",
"LastName":"Doe"
}

最新更新