2

假设我正在建立一个像 eBay(或其他东西)这样的市场,例如,

使用如下所示的数据(伪代码):

public class Item {
    Double price;
    String geoHash;
    Long startAvailabilty; // timestamp
    Long endAvailabilty; // timestamp
    Set<Keywords> keywords;
    String category;
    String dateCreated; // iso date
    String dateUpdated; // iso date
    Integer likes;
    Boolean isActive;
}

假设我想构建一个“查询”来过滤项目,给出以下内容:

项目与字段数据(标题、价格、时间戳范围)以及一些文本(描述)一起存储。然后我需要根据以下内容进行过滤:

  • 价格范围(如100-200)
  • 位置(例如以 GeoHash 前缀开头)
  • 在给定的毫秒时间戳之间(例如,每条记录都有一个开始和结束日期)——例如项目的有效期
  • 有一个给定的关键字(每条记录在存储之前都有一个关键字数组)
  • 有一个给定的类别
  • 有创建日期和更新日期(这很常见)
  • 有一个给定的关键字文本(我认为这是不可能的,因为这是一个全文搜索)

我想根据以下内容订购结果:

  • 点赞数优先(每条记录存储点赞数)
  • 最新或最近创建的第一个
  • 仍然处于活动状态(每条记录是否处于活动状态都有一个布尔值)

这应该如何建模/存储在键值数据库中,以便可以使用上面给定的查询来检索它?那就是不使用任何模式(无模式)

4

1 回答 1

1

当您拥有需要以多种不同方式获取相同信息的访问模式(例如,按标签获取、按日期获取、按类别获取等)时,您将与 DynamoDB 进行一场艰苦的战斗。通过巧妙的数据建模,您可以在可以支持的访问模式上取得相当大的进展。但是,作为键/值存储,搜索并不是 DynamoDB 的最佳选择。

解决问题的一种常见方法是使用专门用于搜索的工具,例如ElasticSearch。您仍然可以将数据存储在 DynamoDB 中,但使用 ElasticSearch 来支持您的搜索需求。AWS 甚至有一篇关于这个主题的文章,其中描述了如何使用 DynamoDB 流来保持 ElasticSearch 索引是最新的。

虽然可能仅在 DynamoDB 中支持此访问模式列表,但这会很痛苦(而且可能很昂贵)。我建议找到一个专门为搜索而构建的解决方案。

于 2021-03-17T15:29:49.740 回答