gpt4 book ai didi

nosql - 如何在 NoSQL 中跟踪记录关系?

转载 作者:行者123 更新时间:2023-12-03 04:40:22 26 4
gpt4 key购买 nike

我正在尝试找出 NoSQL KVP 或文档数据库中外键和索引的等效项。由于没有数据透视表(用于添加标记两个对象之间关系的键),我真的很困惑如何以对普通网页有用的方式检索数据。

假设我有一个用户,该用户在整个网站上留下了很多评论。我能想到的跟踪用户评论的唯一方法是

  1. 将它们嵌入到用户对象中(这似乎没什么用)
  2. 创建并维护一个 user_id:comments 值,其中包含每个评论的键 [comment:34、comment:197 等...] 的列表,以便我可以根据需要获取它们。

但是,以第二个示例为例,当您使用它来跟踪其他事物(例如名为“active_comments”的键,其中可能包含 3000 万个 id)时,您很快就会遇到困难,这使得它花费大量 查询每个页面只是为了了解一些最近的活跃评论。它还很容易出现竞争条件,因为许多页面可能会同时尝试更新它。

如何在 NoSQL 数据库中跟踪如下关系?

  • 用户的所有评论
  • 所有活跃评论
  • 所有带有[关键字]标签的帖子
  • 俱乐部中的所有学生 - 或学生所在的所有俱乐部

或者我是否错误地思考了这个问题?

最佳答案

关于如何以“NoSQL 方式”存储多对多关联的所有答案都归结为同一件事:冗余存储数据。

在 NoSQL 中,您不会根据数据实体之间的关系来设计数据库。您可以根据要对其运行的查询来设计数据库。使用与非规范化关系数据库相同的标准:如果数据的内聚性更重要(考虑以逗号分隔的列表而不是规范化表中的值),那么就这样做。

但这不可避免地会针对一种类型的查询(例如任何用户对给定文章的评论)进行优化,但会牺牲其他类型的查询(给定用户对任何文章的评论)。如果您的应用程序需要对两种类型的查询进行同等优化,则不应进行反规范化。同样,如果您需要以关系方式使用数据,则不应使用 NoSQL 解决方案。

非规范化和冗余存在冗余数据集彼此不同步的风险。这称为异常。当您使用规范化的关系数据库时,RDBMS 可以防止异常情况。在非规范化数据库或 NoSQL 中,您有责任编写应用程序代码来防止异常情况。

有人可能认为 NoSQL 数据库为您完成防止异常的艰苦工作会很棒。有一个范式可以做到这一点——关系范式。

关于nosql - 如何在 NoSQL 中跟踪记录关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4126811/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com