如果项只能由三个或更多属性唯一标识,那么如何选择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”,但是正如您所看到的,当您有两个以上的部分时,您需要一些不同的东西。