Amazon dynamodb 为GSI确定Dynamo DB中的分区密钥

Amazon dynamodb 为GSI确定Dynamo DB中的分区密钥,amazon-dynamodb,Amazon Dynamodb,我是DynamoDB的新手,我发现很难考虑如何确定分区密钥。我正在使用我的用例的浓缩版本: 我有一个布尔值=>B的属性 对于给定的ID,我需要返回它的所有数据。ID是X或Y属性。对于给定的ID,如果B为true,我需要读取属性X,否则为Y 当插入表格时,我知道B的值,因此我可以根据它的值在X或Y中填充它 然而,在获取时,我只得到一个ID,我需要确定它是否存在于列X或列Y中(我不会在输入中获取B的值) 在RDBMS中,我可以运行一个查询,如select*from选项卡,其中(B==true&&X=

我是DynamoDB的新手,我发现很难考虑如何确定分区密钥。我正在使用我的用例的浓缩版本:

我有一个布尔值=>B的属性 对于给定的ID,我需要返回它的所有数据。ID是X或Y属性。对于给定的ID,如果B为true,我需要读取属性X,否则为Y

当插入表格时,我知道B的值,因此我可以根据它的值在X或Y中填充它

然而,在获取时,我只得到一个ID,我需要确定它是否存在于列X或列Y中(我不会在输入中获取B的值)

在RDBMS中,我可以运行一个查询,如
select*from选项卡,其中(B==true&&X==ID)| |(B==false&&Y==ID)


我认为在DynamoDB中创建一个GSI将是在Dynamo中解决这个问题的方法。然而,我无法找到解决这个问题的最佳方法。我能得到一些建议吗

我不确定是否正确获得了您的用例,但为什么不在插入行时基于值B交换目标列呢

考虑以下输入:

+-----+------+--------+
|  X  |  Y   |   B    |
+-----+------+--------+
| ID1 | ID2  |  true  |
+-----+------+--------+
| ID3 | ID4  |  true  |
+-----+------+--------+
| ID5 | ID6  |  false |
+-----+------+--------+
| ID7 | ID8  |  false |
+-----+------+--------+
如果像这样存储值会怎么样:

+-----------+-------------------------+
|  id       |      opposite id        |   
|(hash key) | or whatever you call it | 
+-----------+-------------------------+
| ID1       |        ID2              | 
+-----------+-------------------------+
| ID3       |        ID4              | 
+-----------+-------------------------+
| ID6       |        ID5              | 
+-----------+-------------------------+
| ID8       |        ID7              | 
+-----------+-------------------------+
这样,当通过IDXXX值获取项目时,您需要对单个列
id
执行查询



UPD:注意,如果您的用例允许具有相同id的多个记录,您将需要另一个字段作为范围键。无论您是否交换如上所示的列,这都是正确的。

根据AWS DynamoDB博客文章:

选择正确的DynamoDB分区键是 设计和构建可扩展且可靠的应用程序 发电机B.

什么是分区键?

DynamoDB支持两种类型的主键:

分区键:也称为哈希键,分区键由单个属性组成。DynamoDB中的属性在 在其他数据库系统中创建字段或列的方法很多

分区键和排序键:被称为复合主键或散列范围键,这种类型的键由两个属性组成。这个 第一个属性是分区键,第二个属性是 排序键。以下是一个例子:

为什么我需要分区密钥?

DynamoDB将数据存储为属性组,称为项。项目 与其他数据库系统中的行或记录类似。发电机 根据主键值存储和检索每个项,主键值 必须是唯一的。项目分布在10 GB的存储单元中, 称为分区(DynamoDB内部的物理存储)。每张桌子 有一个或多个分区,如图2所示。更多 有关详细信息,请参阅DynamoDB中的了解分区行为 开发者指南

DynamoDB使用分区键的值作为内部 散列函数。哈希函数的输出决定了 存储项的分区。每个项目的位置都是 由其分区键的哈希值确定

具有相同分区键的所有项存储在一起,并且 复合分区键按排序键值排序。发电机 如果集合大小变大,将按排序键分割分区 超过10GB

分区键建议

使用高基数属性。这些属性具有 每个项目的不同值,如电子邮件id、员工编号、, customerid、sessionid、ordered等等

使用复合属性。尝试将多个属性组合到一起 如果符合您的访问模式,则形成唯一密钥。例如 考虑使用Cuffer-ID+CudiTiD+国家代码的订单表 分区键和订单日期作为排序键

当读取流量较大时,缓存常用项。 缓存充当低通过滤器,防止异常读取数据 来自淹没分区的流行项目。例如,考虑一张表格 它包含产品的交易信息。一些交易预计将被取消 在黑色星期五或圣诞节等大型销售活动中比其他活动更受欢迎 网络星期一

将预先确定范围内的随机数/数字添加到写重中 用例。如果您希望分区键有大量写入, 使用附加前缀或后缀(预定义的固定数字 范围,比如1-10),并将其添加到分区键中。例如 考虑一张发票交易表。单个发票可以包含 每个客户有数千笔交易


阅读更多@

以防万一,您是否有同时指定X和Y的记录?@xtx是的,可能有指定X和Y的情况。但如果B为真,则只需读取X。对于给定的ID,布尔B是否可以同时获取
true
false
值(对于不同的记录)?@xtx否,ID将为真或假