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