mongodb 多索引NoSQL数据库设计

gopyfrb3  于 2022-11-03  发布在  Go
关注(0)|答案(1)|浏览(139)

我有一个DynnamoDB/NoSQL/MongoDB问题。我来自一个RDBMS后台,正在努力为NoSQL DB设计一个正确的设计。如果有人能帮助我的话!
我有以下对象(用我的术语来说就是表):

  • 编辑
  • 使用者
  • 课程
  • 单位

我需要以下接入点,其中大多数都是可以实现的:

  • 获取/创建/更新和删除组织
  • 获取/创建/更新和删除用户
  • 获取/创建/更新和删除课程

我能做到。
问题是Users和Courses对象有多种检索数据的方法:

  • 电子邮件
  • 使用者名称

例如:列出课程上用户

  • 列出组织的用户
  • 列出组织的课程
  • 列出组织中的用户
  • 列出单位中用户

所有这些用户二级索引,我对它们有一点了解,但我有三级索引,但那可能是我的设计。
我来自关系方法论,对报告不太确定,如果我想搜索课程下尚未完成的所有用户(称之为状态标记),它将如何工作?
据我所知,我需要索引的everting我想搜索?
AWS DynamoDB是我的首选,但我也很乐意考虑另一种NoSQL。我意识到我需要更多关于NoSQL的教育,所以如果有人能提供好的文档和例子来帮助学习过程,那将是非常棒的。
此致
理查德德
我已经看了几个UDEMY视频,并一直Gooling了很多个星期(哦,并在这里检查“显然”)

ffvjumwh

ffvjumwh1#

注意事项

分区

在DynamoDB中,所有的东西都被组织在分区中,这些分区为您提供了对元素的基于散列的访问。

单表设计

不要将数据拆分到多个表中,这会使一切变得更困难,实际上限制了数据库的功能。

钥匙

dynamo中的键必须围绕你的访问模式来设计。这是最难的部分。
你有 Partition Key(Hash Key)-〉这个键每次都必须被精确地指定。你不能在不知道PK的情况下执行查询。这就是为什么把时间戳之类的东西放在PK中是个坏主意。

  • 排序(范围)键 * -〉这些键用于AWS文档中指定的查询。
    属性名称

在NoSQL中,数据库迁移非常困难,所以你必须为属性使用通用名称,它们不应该有任何意义。
例如,“UserID”是分区键的错误名称,“PK”是分区键的正确名称,所有键都是如此。

索引

您有两种类型的索引:局部索引和全局索引。

  • Local Indexes* 在创建表时创建一次,以后不能轻易更改。只能有几个。它们为您提供了一个额外的排序关键字。主要的好处是它们具有很强的一致性
  • 全局索引 * 可以在任何时候创建。它们为您提供了新的分区键和排序键,但最终是一致的。除非您有很好的理由使用本地索引,否则使用全局索引。

回到你的问题上来,如果我们以其中的一个表为例-- Users
用户可以这样插入器(例如)

PK               SK                   GSI1PK               GSI1SK
Username#john123 Email#jhon@gmail.com Email#jhon@gmail.com Username#john123  <User Data>

这样你就可以通过email和用户名来查询用户了。记住PK和SK必须是唯一的对。在这个例子中SK是免费的,可以用于其他访问模式(你没有提供)
另一种方法可能是复制数据

PK                   SK
Username#john123     Email#jhon@gmail.com  <user data>
Email#jhon@gmail.com Username#john123      <user data>

这样就避免了必须处理索引(有时索引可能很昂贵),但是必须手动保持用户数据的一致性。
更多阅读-〉https://www.alexdebrie.com/posts/dynamodb-single-table/

相关问题