问题标签 [amazon-dynamodb-data-modeling]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1201 浏览

amazon-dynamodb - 在 DynamoDB 中建模关系数据(嵌套关系)

实体模型:

在此处输入图像描述

我已阅读有关在 DynamoDB 中创建建模关系数据的 AWS 指南。我的访问模式很混乱。

访问模式

因此,我将关系实体数据建模为指导。

如果我只有 UserID 和 TestCaseId 作为参数,我怎么能得到 TestCase Detail 并验证 UserId 是否有权限。

我考虑过将复杂的分层数据存储在单个项目中。喜欢这个的东西

问题:这种情况下最好的方法是什么?如果您能给我一些关于这种方法的建议,我将不胜感激(鞠躬)

0 投票
3 回答
5653 浏览

amazon-web-services - DynamoDB - AWS 上的事件存储

我正在 AWS 上设计一个 Event Store,我选择了 DynamoDB,因为它似乎是最好的选择。我的设计似乎相当不错,但我面临一些我无法解决的问题。

**该设计

事件由该对唯一标识(StreamId, EventId)

  • StreamId:和aggregateId一样,意思是一个Event Stream对应一个Aggregate。
  • EventId:一个递增的数字,有助于将排序保持在同一事件流中

事件保留在 DynamoDb 上。每个事件映射到表中的单个记录,其中必填字段是 StreamId、EventId、EventName、Payload(可以轻松添加更多字段)。

partitionKey 是 StreamId,sortKey 是 EventId。

将事件写入事件流时使用乐观锁定。为此,我使用了 DynamoDb 条件写入。如果已经存在具有相同(StreamId,EventId)的事件,我需要重新计算聚合,重新检查业务条件,如果业务条件通过,最后再次写入。

事件流

每个事件流由 partitionKey 标识。查询所有事件的流等于查询 partitionKey=${streamId} 和 0 到 MAX_INT 之间的 sortKey。

每个事件流标识一个且只有一个聚合。如前所述,这有助于使用乐观锁定处理同一聚合上的并发写入。这也可以在重新计算聚合时提供出色的性能。

活动发布

利用 DynamoDB Streams + Lambda 的组合发布事件。

重播事件

这是问题开始的地方。将每个事件流仅映射到一个聚合(这导致拥有大量事件流),没有简单的方法可以知道我需要从哪些事件流中查询所有事件。

我正在考虑在 DynamoDB 中的某处使用一个额外的记录,它将所有 StreamIds 存储在一个数组中。然后我可以查询它并开始查询事件,但如果在我重播时创建了一个新流,我会丢失它。

我错过了什么吗?或者,我的设计是否完全错误?

0 投票
2 回答
383 浏览

java - DynamoDB 如何查询强一致性的非键属性?

我在 DynamoDB 中有下表:

我的问题是:我需要查询某个年龄之间的所有人,例如年龄 > 18 AND 年龄 < 45。

但是,我的查询需要强一致性,因此,我不能使用全局二级索引。

在这种情况下,最好/可能的解决方案是什么?

0 投票
1 回答
5613 浏览

amazon-dynamodb - DynamoDB 每个项目的生存时间

我需要使具有不同生存时间配置的项目过期。在某些情况下,表中的项目也不会在某些情况下过期。在 Cassandra 中,我们可以在记录级别写入时设置生存时间。在 DynamoDB 中,我只能在表级别看到 TimeToLive 配置(我也可能是错的。)但在项目级别看不到。

  1. 有没有办法在做 putItem 时在项目级别设置 TTL 或
  2. 在对整个系统影响最小的情况下删除记录的最佳做法是什么?

如果无法在项目级别设置 TTL,我想退回到第二个选项。

0 投票
2 回答
326 浏览

aws-lambda - Lambda 与 DynamoDB 在具有超过 500000 个不同值的表分区键上触发

我们目前正在设计一个 dynamodb 表来存储某些文件属性。有2个主要列

  1. 日期:- 这包含 YYMMDD 格式的日期,例如:-20190618
  2. 文件名:- xxxxxxxxxxxx.json

目前分区键是日期,排序键是文件名。我们预计每天大约有 500000 个具有不同文件名的文件(这可能会随着时间的推移而增加)。文件名每天都会重复相同,即典型模式如下所示

日期 文件名 20190617 abcd.json 20190618 abcd.json

我们有一系列基于Date和 dynamodb 触发器的查询。查询运行良好。目前我们正在观察的是并发 lambda 执行的数量限制为 2,因为我们是按日期分区的。在尝试提高 lambda 的并发性时,我们遇到了 2 个解决方案

1)参考以下链接(https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-sharding.html),一个想法是为日期字段添加固定数量的随机后缀,即(20190617.1 到 20190617.500)将数据分成 500 个分区,每个分区 1000 条记录。这将确保一定程度的并发性,并且查询的更改也很小

2)第二个选项是更改表的分区如下分区键:- 文件名和排序键:- 日期。这将导致大约 500000 个分区,(可以增加)。对于按日期查询,我们需要添加一个 GSI,但我们将在 Lambda 中实现更多并发

我们还没有创建一个有 500000 个分区(可以增加)的表。任何机构都有这样的经验......如果是这样,请发表评论

任何帮助表示赞赏

0 投票
1 回答
75 浏览

amazon-dynamodb - 具有初始状态的流

我想公开订阅或“粘性查询”之类的内容:目标是查询 DynamoDB 并通过 API Gateway 中的 WebSockets API 返回结果。好吧,每当 DynamoDB 以某种方式发生更改时,查询都会受到影响(我想我可以为此使用 Streams),我想通知客户端。如何确保客户端获得初始列表和所有更新?我想确保客户端在创建订阅后和返回初始结果列表之前不会错过任何更新......

0 投票
1 回答
36 浏览

amazon-web-services - 寻找将分层文档放入 DynamoDB 的最佳方式

我一直在使用常规 SQL 数据库,现在想使用 AWS 服务开始一个新项目。我希望后端数据存储是 DynamoDB,我想要存储的是分层文档,就像我学到的所有编程技巧的说明手册,可以通过 React 前端提取和调用。

因此数据将采用 Python -> 类 -> 常规 -> “类文本墙上的信息”之类的格式

有时会有多个子目录。

未来的计划将是能够添加新的子文件夹,将数据移动到不同的文件夹,“竖起大拇指”,以及最终拥有对彼此数据的读取访问权限的多帐户。

我知道如何在 SQL DB 中执行此操作,但之前从未使用过 NoSQL,我认为这将是一个很好的起点。

我也在考虑如何对分区进行排序,我怀疑这个辅助程序会增长到多个集群,但我知道使用 NoSQL 你必须提前规划布局。

如果 NoSQL 非常适合这种类型的数据,请告诉我。这主要用于练习和练习 AWS 系统。

0 投票
2 回答
38 浏览

amazon-dynamodb - DynamoDB Schema - 对建筑物内的位置进行建模

在这里是 DynamoDB 的新手。我需要找出建筑物内不同位置的 DynamoDB 模式。此外,我需要能够识别分配给每个位置的计算机。这些位置嵌套在其他位置内。例如,

  • 1号楼
    • A翼
      • 1楼
        • A节
          • 办公室 1
            • 电脑A
            • 电脑B
          • 办公室 2
            • 电脑A
        • B节
          • 办公室 1

... 等等。

访问模式:

  • 显示建筑物中的所有位置(翼、楼层、部分等)
  • 显示特定位置
  • 显示分配到特定位置的所有计算机
  • 显示特定计算机的位置

我在想什么:

我最初想创建这样的东西:

我知道这是错误的思考方式,但我想不出任何其他方式。

对建筑物的部分、办公室等位置进行建模的最佳方法是什么?

0 投票
1 回答
1524 浏览

python - 在不使用主分区键的情况下查询 DynamoDB 中的所有数据

我对 DynamoDB 很陌生。我想查询一定时间范围内的所有数据。

column = "timerange" 是主排序键
column = "name" 是主分区键。

我想在 2 个时间范围内获取所有数据。

这是我的查询。

这给了我一个错误ClientError: An error occurred (ValidationException) when calling the Query operation: Query condition missed key schema element:搜索互联网后,我发现您需要在查询中包含主分区键,因此我尝试了https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition 中的 Contains 方法。 html

我显然不完全理解。

如何获取给定时间范围 [a,b] 内的所有数据?

0 投票
1 回答
131 浏览

amazon-web-services - DynamoDB 过滤:使用过滤器表达式扫描列表类型中的单个条目

我正在尝试为我的 DynamoDB 表构建一个过滤器表达式,以便在 javascript lambda 函数的扫描中使用。我的表模式有一个名为的字段,该字段dateRange具有以下结构(这只是一个示例,可能有任意数量的元素,并不总是 4 个):

在此处输入图像描述

我想返回表中第一个date字符串dateRange大于某个固定日期的所有项目。这是可能的吗?如果可以,FilterExpression会是什么样子?我基本上在寻找类似的东西FilterExpression: "#dateRange[0] >= :fixedDate