【问题标题】:Duplicate Primary Key with Composite Key, DynamoDB具有复合键的重复主键,DynamoDB
【发布时间】:2013-12-19 05:11:30
【问题描述】:

快速问题,我是 NoSQL 数据库的新手,所以请原谅我对这个主题缺乏了解,但我想知道,如何在 DynamoDB 中使用主键和复合键的组合。以下面的例子为例。我可以使用相同的主键但使用不同的复合键来查询数据库吗?我想按数据排序,这样我就可以按日期或地区查询它,我还想保留一个包含账单 ID 和名称的地图。任何帮助表示赞赏。

【问题讨论】:

标签: java amazon-web-services amazon-s3 nosql amazon-dynamodb


【解决方案1】:

回答您的评论问题,您无法通过范围键快速查询。 您只能查询哈希键以获取日期列表。 也许您应该切换它并制作日期哈希,但是您无法查询范围。

在对 DynamoDB 进行建模时,您需要确保了解限制并相应地进行建模。

编辑回答评论 您可以有一个表,其中哈希是 clientId,范围是 billId。
这将帮助您查询客户的所有账单。如果您想在数据库中按类型过滤它们,您可以在 'type' 属性上添加local secondary index 并快速过滤它(请记住,我们仍在讨论二级查询。第一个是 clientId)。

另外请记住,您一次只能使用一个索引(范围键被视为一个索引)

【讨论】:

  • 如果我定期按范围查询,我会错过像发电机这样的数据库的性能优势吗?我想首先在 UI 上向用户显示账单名称列表,在用户选择他们想要使用的账单之后,我将从 DynamoDB 中检索该特定账单。如果我想按类型过滤它们会发生什么?我是否必须创建更多具有不同哈希键和范围组合的条目?例如hashKey: id=1233 range: type;paid
  • 不,如果数据均匀分布在散列键上,则可以保证优势。我将编辑我的答案以添加其他问题的架构
  • 还有一个问题。我假设当您创建一个表时,您必须为其分配一个哈希键和一个范围,您不能在同一个表上混合具有不同范围的哈希键。例如 hash=clientId 和 range=billId 或 hash=clientId 和 range=paid?。我认为这是二级索引的原因。
  • 这取决于你。如果范围键是 S(字符串) - 您可以在其上保存多个内容。例如 XXX#billId 和 YYY#paid 。如果 pair 对象和 billId 对象永远不会有相同的字符串,那么它们也可以在没有 XXX/YYY 的情况下混合使用,但我认为这是一种不好的模式,会导致弊大于利
  • 多表怎么样?,它被 AWS 认为是最佳实践,docs.aws.amazon.com/amazondynamodb/latest/developerguide/…。开始怀疑 NoSQL 数据库是否合适,我使用它是因为它可以很好地扩展,这将是主要原因。
猜你喜欢
  • 2017-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 2018-02-02
  • 2016-07-04
  • 2016-05-17
  • 2013-04-30
相关资源
最近更新 更多