gpt4 book ai didi

azure - Dynamodb 中的分区

转载 作者:行者123 更新时间:2023-12-02 23:19:37 25 4
gpt4 key购买 nike

对于已经使用 dynamo db 的应用程序,从 Azure 的 DocumentDB (Cosmos db) 后台迁移到 AWS DynamoDB。

我对 DynamoDB 上的分区键感到困惑。

据我了解,分区键用于在数据增长时将数据隔离到不同的分区,但是许多人建议使用主键作为分区键,例如用户 ID、客户 ID、订单 ID。在这种情况下,我不确定如何获得更好的性能,因为我们有很多分区。因此一个查询可能需要在多个服务器中执行。

举个例子,如果我想开发一个 Multi-Tenancy 系统,我将使用单个表来存储所有租户的数据,但使用租户 ID 进行分区。我将按照下面在文档数据库中提到的那样进行操作。

1)存储数据

使用以下架构创建对象。

Primary key: Order Id
Partition key: Tenant id

2) 检索租户的所有记录

SELECT * FROM Orders o WHERE  o.tenantId="tenantId"

3) 根据租户的 id 检索记录

SELECT * FROM Orders o WHERE o.Id='id' and o.tenantId="tenantId"

4) 检索租户的所有记录并排序

 SELECT * FROM Orders o WHERE  o.tenantId="tenantId" order by o.CreatedData
//by default all fields in document db are indexed, so order by just works

如何在 dynamo db 中实现相同的操作?

最佳答案

终于我找到了如何正确使用 dynamodb。感谢 [@Jesse Carter],他的评论对于更好地理解 dynamo db 非常有帮助。我现在正在回答我自己的问题。

与其他 NoSQL 数据库相比,DynamoDB 有点困难,因为术语太困惑,下面我提到了针对一些常见场景的简化 dynamodb 表设计。

主键

在 dynamo db 中,主键不需要是唯一的,我知道与所有其他产品相比,这非常令人困惑,但这是事实。主键(在 dyanmodb 中)实际上是“分区键”。

发现 1

您始终需要提供主键作为查询的一部分

场景 1 - 键值存储

假设您要创建一个包含 Id 和多个其他属性的表。您也仅根据 Id 属性进行查询。在这种情况下,Id 可以是主键。

|---------------------|------------------|
| User Id | Name |
|---------------------|------------------|
| 12 | value1 |
| 13 | value2 |
|---------------------|------------------|

我们可以将用户 ID 作为“主键(分区键)” Create Table - Users

场景 2

现在假设我们要存储用户的消息,如下所示,我们将通过用户 ID 进行查询以检索用户的所有消息。

|---------------------|------------------|
| User Id | Message Id |
|---------------------|------------------|
| 12 | M1 |
| 12 | M2 |
| 13 | M3 |
|---------------------|------------------|

“用户 ID”仍然是该表的主键。请记住 dynamodb 中的主键不需要每个文档都是唯一的。消息Id可以是排序键

Create Table - UserMessages

那么什么是排序键。

排序键是分区内的一种唯一键。分区键和排序键的组合必须是唯一的。

本地创建表

如果您使用的是 Visual Studio,您可以安装 AWS tool kit for Visual Studio 在您的计算机上创建本地表进行测试。

enter image description here

注意:上图添加了更多术语!

哈希键、范围键。 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)。然后我们将根据Message id创建一个全局索引。

关于azure - Dynamodb 中的分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46270663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com