【问题标题】:How does dynamo DB stores data?dynamoDB 如何存储数据?
【发布时间】:2021-03-11 19:44:39
【问题描述】:

由于 Dynamodb 以键值对的形式存储数据,其中 key 是主键的类型,value 是与之关联的数据。我想知道 dynamo db 是否真正理解 value(json)?按 value I表示与键关联的 json 对象(RDBMS 中的一行)。dynamo db 是否理解有一些属性并且它要存储一些属性值?

上下文:我在 dynamo db 中有一个人表,它具有不同的属性,比如 100,其中一个是年龄,现在假设有一些要求我想根据年龄获取一些记录。如果 dynamo db 一个一个地读取每个条目然后读取它的记录并假设每个记录都很大,那么 dynamo db 是读取记录的整个数据还是可以在恒定时间内只访问年龄属性而不管记录的大小?

【问题讨论】:

  • 如果您扫描表并按年龄过滤,DynamoDB 将读取您的所有项目。如果您希望这样做高效,请创建一个以年龄为 GSI 排序键的 GSI,然后您的查询可以在您的 KeyConditionExpression 中包含 age BETWEEN 10 AND 20
  • 是的,我会这样做的。对于上面的问题,我只想知道是否在每个项目中,它会只读年龄属性吗?一旦有记录,它可以直接读取年龄吗?或者它需要读取整条记录才能读取年龄?就像一个人有不同的记录,假设它在记录x,它可以直接读取x的年龄还是需要读取整条记录才能知道x属性中的年龄在哪里?跨度>
  • 如果属性未键入,则 DynamoDB 会先读取项目,然后才能过滤该属性的给定值 afaik。如果它是键控的,那么 DynamoDB 可以简单地使用索引(包含值)。

标签: amazon-web-services nosql amazon-dynamodb system-design


【解决方案1】:

dynamo db 是否了解它要存储的一些属性和一些属性值?

不,它没有。

DynamoDB 是一种“宽列”样式的 NoSQL 数据库。虽然在表构建时没有在主键之外定义模式,但查询能力仅限于主键或二级索引。创建全局二级索引允许您查询其他属性值。也可以查询本地二级索引,但它们有点奇怪。请参阅here 以更好地比较两种二级索引类型。

如果您确实需要在属性内部进行查询,请查看 NoSQL 数据库的一些“面向文档”风格,其中MongoDB 是大多数人想到的一种。如果您已经嵌入 AWS 生态系统并且不想脱离它,AWS 提供 DocumentDB 作为由 AWS 管理的 MongoDB 兼容服务。

宽列和文档样式的数据存储有不同的优缺点。一般来说,宽列方法更适合以一致的成本和速度实现极高的可扩展性,而面向文档的方法随着您的数据访问模式随着时间的推移而提供更大的灵活性。选择最适合您需求的那一款。

【讨论】:

  • 实际上我正在阅读一篇博客,其中说,如果我们在非索引列上查询,那么它在 SQL 中比在 NO-SQL 中更快。因为 SQL 可以转到该特定列并扫描所有行并检查哪个满足条件。但是在没有 SQL 的情况下,它必须读取一行的整个记录​​,因为它无法通过 jsut 转到特定列来读取基于非索引的列。OS 我很困惑
  • 这是可扩展性和灵活性之间的选择。 DynamoDB 希望您能够预先表达大部分访问模式,但不必担心数据的结构。通过这样做,您可以获得一致的查询时间无论您的数据如何增长。关系数据库则相反:首先描述数据的结构,然后再找出访问模式。这使您可以根据需要引入新的访问模式,但随着数据的增长,访问时间会减慢。
【解决方案2】:

你不能那样做。始终检索整个项目,这就是您支付的费用。你可以做什么:

  • 使用 GSI,只指定您需要的属性,这样您只需为这些属性付费
  • 使用 ProjectionExpression,它只会从 db 返回指定的属性,因此您的网络使用量会更小。但它是在从 db 实际读取后应用的。因此,您仍然需要为检索整个项目付费

【讨论】:

  • ohh.So 如果我没有创建 GSI 并且我感兴趣的属性不是主键,那么没有办法读取这些记录吗?唯一的方法是在应用层进行全扫描并添加过滤逻辑?这对吗?我知道我问的是不切实际的,但只是想更多地了解 dynamo db。我的理解正确吗?
  • 不完全是。您总是需要为阅读整个项目付费。此外,如果您扫描,您会阅读整个表格并为此付费。 ProjectionExpression 位于 DynamoDB 层,您的应用程序将只接收指定的属性。但是您要为整件商品付费
猜你喜欢
  • 2020-05-30
  • 1970-01-01
  • 2017-10-26
  • 2019-07-08
  • 2020-06-20
  • 2016-10-31
  • 1970-01-01
  • 2022-11-16
相关资源
最近更新 更多