我是DynamoDB的新手,我发现很难想到我应该如何决定我的分区键。我正在使用我的用例的精简版本:
我有一个属性,它是一个布尔值=>乙 对于给定的ID,我需要返回它的所有数据。 ID是X或Y属性。对于给定的ID,如果B为真,我需要读取属性X,否则为Y.
插入表格时,我知道B的值,因此我可以根据它的值将其填入X或Y.
然而,在获取时,我只获得了一个ID,我需要弄清楚它是否存在于X列或Y列中(我不会在输入中获得B的值)。
在RDBMS中,我可以运行select * from tab where (B == true && X == ID) || (B==false && Y == ID)
之类的查询。
我认为在DynamoDB中创建GSI将是在Dynamo中解决此问题的方法。但是,我无法找到解决这个问题的最佳方法。我可以得到建议吗?
答案 0 :(得分:-1)
不确定我是否正确使用了您的用例,但为什么不在插入行时根据值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,则需要另一个字段作为范围键。无论您是否交换上面显示的列,都是如此。
答案 1 :(得分:-1)
根据每个AWS DynamoDB博客文章:Choosing the Right DynamoDB Partition Key
选择正确的DynamoDB分区密钥是其中的重要一步 设计和构建可扩展且可靠的应用程序 DynamoDB。强>
什么是分区键?
DynamoDB支持两种类型的主键:
分区键:也称为哈希键,分区键由单个属性组成。 DynamoDB中的属性类似于 许多其他数据库系统中字段或列的方法。
分区键和排序键:这种键称为复合主键或哈希范围键,由两个属性组成。该 第一个属性是分区键,第二个属性是 排序键。这是一个例子:
为什么我需要分区密钥?
DynamoDB将数据存储为属性组,称为项目。项目 类似于其他数据库系统中的行或记录。 DynamoDB 根据主键值存储和检索每个项目 必须是独一无二的项目分布在10 GB存储单元中, 称为分区(DynamoDB内部的物理存储)。每张桌子 有一个或多个分区,如图2所示。更多 信息,请参阅了解DynamoDB中的分区行为 开发者指南。
DynamoDB使用分区键的值作为内部的输入 哈希函数。哈希函数的输出确定了 将存储项目的分区。每个项目的位置是 由其分区键的哈希值确定。
具有相同分区键的所有项目都存储在一起,并且用于 复合分区键,按排序键值排序。 DynamoDB 如果集合大小变大,将按排序键拆分分区 超过10 GB。
分区键的建议
使用高基数属性。这些属性具有 每个项目的不同值,如电子邮件ID,employee_no, customerid,sessionid,ordered等等。
使用复合属性。尝试将多个属性合并到 如果符合您的访问模式,则形成唯一密钥。例如, 考虑使用customerid + productid + countrycode作为的订单表 partition key和order_date作为排序键。
当有大量读取流量时,缓存热门项目。 缓存充当低通滤波器,防止异常读取 来自沼泽分区的热门商品。例如,考虑一个表 有产品交易信息。预计会有一些交易 在黑色星期五或者黑色星期五等重大销售活动中比其 网络星期一。
从预定范围添加随机数/数字以进行重写 用例。如果您希望分区密钥的写入量很大, 使用额外的前缀或后缀(来自预定义的固定数字 范围,比如1-10)并将其添加到分区键。例如, 考虑一张发票交易表。单个发票可以包含 每个客户有数千笔交易。