你如何在NoSQL中跟踪记录关系?[英] How do you track record relations in NoSQL?

本文是小编为大家收集整理的关于你如何在NoSQL中跟踪记录关系?的处理方法,想解了你如何在NoSQL中跟踪记录关系?的问题怎么解决?你如何在NoSQL中跟踪记录关系?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我试图找出 NoSQL KVP 或文档数据库中外键和索引的等价物.由于没有关键表(用于添加标记两个对象之间关系的键),我真的很难理解如何以对普通网页有用的方式检索数据.

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

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

但是,以第二个示例为例,当您使用它来跟踪其他内容时,您很快就会碰壁> 查询每个页面只是为了了解一些最近的活跃评论.它也很容易出现竞争条件,因为许多页面可能会同时尝试更新它.

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

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

还是我想错了?

推荐答案

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

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

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

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

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

本文地址:https://www.itbaoku.cn/post/1793995.html