确定Dynamo DB for GSI中的分区键

时间:2017-03-16 02:33:04

标签: amazon-dynamodb

我是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中解决此问题的方法。但是,我无法找到解决这个问题的最佳方法。我可以得到建议吗?

2 个答案:

答案 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中的属性类似于   许多其他数据库系统中字段或列的方法。

     

分区键和排序键:这种键称为复合主键或哈希范围键,由两个属性组成。该   第一个属性是分区键,第二个属性是   排序键。这是一个例子:

enter image description here

  

为什么我需要分区密钥?

     

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

     

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

     

具有相同分区键的所有项目都存储在一起,并且用于   复合分区键,按排序键值排序。 DynamoDB   如果集合大小变大,将按排序键拆分分区   超过10 GB。

enter image description here

  

分区键的建议

     

使用高基数属性。这些属性具有   每个项目的不同值,如电子邮件ID,employee_no,   customerid,sessionid,ordered等等。

     

使用复合属性。尝试将多个属性合并到   如果符合您的访问模式,则形成唯一密钥。例如,   考虑使用customerid + productid + countrycode作为的订单表   partition key和order_date作为排序键。

     当有大量读取流量时,

缓存热门项目。   缓存充当低通滤波器,防止异常读取   来自沼泽分区的热门商品。例如,考虑一个表   有产品交易信息。预计会有一些交易   在黑色星期五或者黑色星期五等重大销售活动中比其   网络星期一。

     

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

阅读更多@ Choosing the Right DynamoDB Partition Key