首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DynamoDB中的数据库设计:书签存储

DynamoDB中的数据库设计:书签存储
EN

Stack Overflow用户
提问于 2017-05-07 11:27:24
回答 1查看 805关注 0票数 1

我感兴趣的是如何为给定的查询需求设置表和索引的最佳实践。我对分区和排序键或LSI和GSI辅助索引等相关概念有基本的理解,但在将它们放在一起并设计一个或多个表时遇到了问题,这些索引支持一个明显的示例。

我正在看的例子是一个“书签存储”,多个用户可以将书签存储到URL并用多个标记对这些书签进行注释。User有多个Urls (=书签)。每个Url都有一个日期,可以有一个或多个Tags

书签可能具有以下基本结构:

代码语言:javascript
运行
复制
{
  "user": "watQuadrat",
  "url": "http://stackoverflow.com",
  "date": 1494161436362,
  "tags": [ "forum", "programming" ]
}

目前,我最大的问题是如何设置表结构,以便能够适应查询数据的各种不同方式,例如:

  • 列出User的所有User,按用户使用标记的频率排序
  • 列出User的所有User,按字母顺序排序
  • 列出Url的所有Url,按为url分配此标记的频率排序
  • 列出与给定搜索字符串匹配的所有Tags,按使用标签的频率排序(例如搜索“商店”,按使用频率返回所有匹配的标签,如“购物”订单)
  • 列出User的所有User,按日期排序
  • 列出按日期排序的UserTag的所有Tag
  • 列出Tag的所有Tag,按标记分配给每个url的频率排序
  • 列出Url的所有Url,按日期排序

如何设计它,以便我能够以一种高效的方式执行所有这些查询?如果你想降低成本的话,你的设计会有什么不同吗?

EN

回答 1

Stack Overflow用户

发布于 2017-05-07 12:19:02

考虑到您所描述的场景,我将按照下面提到的方式设计该表。在这里,我假设一个用户只能从给定的url创建一个书签。此外,我还使用了一个名为TagCount的新派生属性,它表示该书签的标记数。

表结构

主分区键: UserID

主排序键: Url

本地二次指标

指数1

分区键: UserID

排序键:日期

指数2

分区键: UserID

排序键: TagCount

全球次级指标

指数1

分区键: Url

排序键:日期

指数2

分区键: Url

排序键: TagCount

使用此设计,您可以以下列方式执行查询。

  • 列出用户的所有标记,按计数排序 使用LSI用户LSI TagCount的查询
  • 列出Url的所有标记,按计数排序 使用GSI Url-TagCount的查询
  • 列出与给定字符串匹配的所有标记,按计数排序。 我想你说的字符串是属于url的。如果是这样的话,您必须执行扫描。
  • 列出用户的所有Urls,按日期排序 使用LSI用户LSI日期的查询
  • 列出用户的所有Urls和按日期排序的标记 使用过滤器表达式查询LSI用户tag日期表,用于搜索标记
  • 列出标签的所有Urls,按计数排序 你得在这里做个扫描
  • 列出Url的所有用户,按日期排序 查询GSI Url-日期

如果你担心成本的话。您可以根据预期的查询模式松散一些GSI。

更新1

考虑到更新的需求,由于有许多基于标记的查询,我认为应该有第二个表,其结构如下

主分区键: TagName主排序键: UserID

全球二级索引

分区键: UserID

排序键:类似于标签计数的使用派生属性,标记的总使用量。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43830928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档