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

最佳答案

通常,如果您的项是由三个或更多属性唯一标识的,您可以连接属性值并形成一个复合字符串键,您可以在dynamo tbale中将其用作散列键。
如果需要在散列键上创建索引,或者需要在条件表达式中使用属性,则可以将属性从散列键反复制到项上的单独属性中。
关系数据库的规则一般形式不一定适用于nosql数据库,事实上,通常首选非规范化模式。
为了扩展这一概念,在设计关系数据库模式以使用规范化形式时,这是典型的(而且通常是可取的)。其中一个规范化的表单规定,不应复制表示数据库中相同“事物”的数据。
我将使用一个例子,它只有两部分的关键,但你可以进一步扩展它。
假设您正在设计一个包含美国地理信息的表。在美国,邮政编码由5位数字和另外4位数字组成,这些数字可以细分地区。
在关系数据库中,可以使用以下架构:

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

复合主键Zip, Plus4
这是完美的,因为zip和plus4的组合保证是唯一的,并且您可以针对该表回答任何查询,而不管您是同时拥有zip和额外的plus4代码,还是只有zip。你还可以很容易地得到一个邮政编码的所有plus4码。
如果您想在dynamo中存储相同的信息,您可以创建一个名为“zip plus4”的散列键,该散列键的类型为string,由与plus4代码(即60210-4598)连接的邮政编码组成,然后还可以在项目上存储两个以上的属性,一个是邮政编码本身,另一个是plus4本身。因此表中的项可能具有以下属性:
  ZipPlus4 | Zip     |  Plus4   |  CityName   |  Population
-----------+---------+----------+-------------+---------------
  String   | String  |  String  |  String     |  Number

上面的ZipPlus4将是表的哈希键。
注意,在上面的例子中,可以使用哈希键“zip”和范围键“plus4”,但是正如您所看到的,当您有两个以上的部分时,您需要一些不同的东西。

10-08 11:33