DynamoDB中如果一个item只能通过三个或更多的属性来唯一标识,如何选择主键?

How to choose the primary key in DynamoDB if the item can only be uniquely identified by three or more attributes?

如果项目只能由三个或更多属性唯一标识,那么DynamoDB中如何选择主键?或者这不是NOSQL数据库的正确使用方法?

通常,如果您的项目由三个或更多属性唯一标识,您可以连接属性值并形成一个复合字符串键,您可以将其用作 Dynamo tbale 中的哈希键。

如果您需要在它们上创建索引,或者如果您需要在条件表达式中使用它们,您可以将散列键中的属性删除重复项到项目的单独属性中。

关系数据库范式的规则不一定适用于 NoSQL 数据库,事实上,通常首选非规范化模式。

为了扩展这个概念,在设计关系数据库模式时使用规范化形式是典型的(并且通常是可取的)。其中一种规范化形式规定您不应在数据库中复制表示相同 "thing" 的数据。

我将使用一个只有两个部分的示例,但您可以进一步扩展它。

假设您正在设计一个包含美国地理信息的 table。在美国,邮政编码由 5 位数字和另外 4 位数字组成,可以细分区域。

在关系数据库中,您可以使用以下模式:

  Zip    |   Plus4   |  CityName     |  Population
---------+-----------+---------------+---------------  
 CHAR(5) |  CHAR(4)  | NVARCHAR(100) |  INTEGER

复合主键为Zip, Plus4

这是完美的,因为 Zip 和 Plus4 的组合保证是唯一的,您可以回答针对此 table 的任何查询,无论您是否同时拥有 Zip 和附加的 Plus4 代码,或者只有压缩。您还可以轻松获得邮政编码的所有 Plus4 代码。

如果您想在 Dynamo 中存储相同的信息,您可以创建一个名为 "ZipPlus4" 的散列键,它是字符串类型,由邮政编码和 Plus4 代码连接而成(即 60210-4598 ) 然后还在项目上存储另外两个属性,其中一个是邮政编码本身,另一个是 Plus4 本身。因此,您 table 中的项目可能具有以下属性:

  ZipPlus4 | Zip     |  Plus4   |  CityName   |  Population
-----------+---------+----------+-------------+---------------  
  String   | String  |  String  |  String     |  Number

上面的 ZipPlus4 将是 table 的哈希键。

请注意,在上面的示例中,您可以使用 "Zip" 的散列键和 "Plus4" 的范围键,但如您所见,当您有超过 2 个部分时,您需要不一样的东西。