Azure 发电机分区
来自Azure的DocumentDB(Cosmos db)背景到AWS DynamoDB,用于已经在使用dynamo db的应用程序 我对DynamoDB上的分区键感到困惑 据我所知,分区键用于在数据增长时将数据分隔到不同的分区,但是许多人建议使用主键作为分区键,例如用户Id、客户Id、订单Id。在这种情况下,我不确定如何实现更好的性能,因为我们有许多分区。因此,一个查询可能需要在多个服务器中执行 例如,如果我想开发一个多租户系统,我将使用一个表来存储所有租户的数据,但使用租户id进行分区。我将按照下面在文档数据库中提到的方法进行操作 1) 存储数据 使用以下模式创建对象Azure 发电机分区,azure,amazon-dynamodb,azure-cosmosdb,Azure,Amazon Dynamodb,Azure Cosmosdb,来自Azure的DocumentDB(Cosmos db)背景到AWS DynamoDB,用于已经在使用dynamo db的应用程序 我对DynamoDB上的分区键感到困惑 据我所知,分区键用于在数据增长时将数据分隔到不同的分区,但是许多人建议使用主键作为分区键,例如用户Id、客户Id、订单Id。在这种情况下,我不确定如何实现更好的性能,因为我们有许多分区。因此,一个查询可能需要在多个服务器中执行 例如,如果我想开发一个多租户系统,我将使用一个表来存储所有租户的数据,但使用租户id进行分区。我将
Primary key: Order Id
Partition key: Tenant id
2) 检索租户的所有记录
3) 按租户的id检索记录
4) 通过排序检索租户的所有记录
如何在dynamo db中实现相同的操作?请参见AWS文档中的说明 主键唯一地标识表中的每个项。主键可以是简单(分区键)或复合(分区键和排序键) 在存储数据时,DynamoDB将表项划分为多个分区,并主要基于分区键值分发数据。因此,要实现为表提供的全部请求吞吐量,请使工作负载均匀分布在分区键值上。跨分区分发请求键值跨分区分发请求 例如,如果一个表有非常少量的大量访问的分区键值,甚至可能只有一个非常频繁使用的分区键值,那么请求流量将集中在少量分区上——可能只有一个分区。如果工作负载严重不平衡,这意味着它过度地集中在一个或几个分区上,那么请求将无法达到总体配置的吞吐量水平。为了最大限度地利用DynamoDB吞吐量,请创建分区键具有大量不同值的表,并尽可能随机地以相当一致的方式请求值
这并不意味着您必须访问所有分区键值才能达到吞吐量水平;这也不意味着访问的分区键值的百分比需要很高。但是,请注意,当您的工作负载访问更多不同的分区键值时,这些请求将以更好地利用分配的吞吐量级别的方式分布在分区空间中。通常,随着表中访问的分区键值与分区键值总数的比率增加,您将更有效地利用吞吐量 我终于找到了正确使用dynamodb的方法。多亏了[@Jesse Carter],他的评论对更好地理解dynamo db非常有帮助。我现在回答我自己的问题 与其他NoSQL db的DynamoDB相比,DynamoDB有点困难,因为术语太容易混淆,下面我已经提到了一些常见场景的简化DynamoDB表设计 主键 在dynamo db中,主键不需要是唯一的,我理解这与所有其他产品相比非常混乱,但这是事实。主键(在dyanmodb中)实际上是“分区键” 结果1 在查询过程中,始终需要提供主键 场景1-关键值存储 假设要创建一个具有Id和多个其他属性的表。您还可以仅基于Id属性进行查询。在这种情况下,Id可以是主键
|---------------------|------------------|
| User Id | Name |
|---------------------|------------------|
| 12 | value1 |
| 13 | value2 |
|---------------------|------------------|
我们可以将用户Id设置为“主键(分区键)”
情景2
现在假设我们要存储用户的消息,如下所示,我们将按用户id查询以检索用户的所有消息
|---------------------|------------------|
| User Id | Message Id |
|---------------------|------------------|
| 12 | M1 |
| 12 | M2 |
| 13 | M3 |
|---------------------|------------------|
“用户Id”仍然是该表的主键。请记住dynamodb中的主键不需要每个文档都是唯一的。消息Id可以是排序键
那么什么是排序键呢。
排序键是分区中的一种唯一键。分区键和排序键的组合必须是唯一的
本地创建表
如果您使用的是Visual Studio,则可以安装AWS Visual Studio工具包,以便在计算机上创建本地表进行测试
注意:上图添加了更多术语!!。
散列键,范围键。dynamo db总是让人惊喜,不是吗?:)。实际上
(Primary Key = Partition Key = Hash Key) != Your application objects primary key
根据我们的第二个场景,“消息Id”假设是应用程序的主键,但是根据DynamoDB术语,用户Id成为实现分区好处的主键
(Sort key = Range Key) = Could be a application objects primary
局部二级索引
我们可以在分区中创建索引,这称为本地二级索引。例如,如果我们希望根据消息状态为用户检索消息
|------------|--------------|------------|
| User Id | Message Id | Status |
|------------|--------------|------------|
| 12 | M1 | 1 |
| 12 | M2 | 0 |
| 13 | M3 | 2 |
|------------|--------------|------------|
主键:用户Id
排序键:消息Id
二级本地索引:状态
全局二级索引
顾名思义,它是一个全局索引。如果我们希望基于id检索单个消息,而不使用分区键,即用户id,那么我们将基于消息id创建一个全局索引
据我所知,分区键用于在数据增长时将数据分隔到不同的分区,但是许多人建议使用主键作为分区键,例如用户Id、客户Id、订单Id。在这种情况下,我不确定如何实现更好的性能,因为我们有许多分区
在DynamoDB中使用分区键将数据分隔到不同的分区是正确的。但是分区键和项目接收的物理分区不是一对一映射。
分区的数量是根据您的RCU/WCU决定的,这样所有的RCU/WCU都可以被利用
在dynamo db中,主键不需要是唯一的。我理解这与所有其他公关相比是非常混乱的
(Primary Key = Partition Key = Hash Key) != Your application objects primary key
(Sort key = Range Key) = Could be a application objects primary
|------------|--------------|------------|
| User Id | Message Id | Status |
|------------|--------------|------------|
| 12 | M1 | 1 |
| 12 | M2 | 0 |
| 13 | M3 | 2 |
|------------|--------------|------------|