你如何跟踪NoSQL中的记录关系?

Xeo*_*oss 110 database-relations nosql

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

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

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

然而,采用第二个例子,当你使用它来跟踪其他东西时,你很快就会遇到一块砖墙,例如一个名为"active_comments"的密钥,其中可能包含3000万个ID,这使得查询每个页面只需知道一些TON积极评论.它也很容易出现竞争条件,因为很多页面可能会同时尝试更新它.

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

  • 所有用户的评论
  • 所有有效评论
  • 所有帖子标有[keyword]
  • 俱乐部的所有学生 - 或学生所在的所有俱乐部

或者我错误地想到了这个?

Bil*_*win 163

关于如何以"NoSQL方式"存储多对多关联的所有答案都减少到同样的事情:冗余地存储数据.

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

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

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

有人可能会认为,对于NoSQL数据库来说,做一些防止异常的艰苦工作会很棒.有一种范式可以做到这一点 - 关系范式.

  • "如果你需要以关系方式使用数据,你不应该使用NoSQL解决方案" - 那么运行NoSQL的其他人如何逃脱呢?在第一次设计应用程序时,您怎么能知道查询数据的所有方法?Fox的例子,我可能想要最近的评论,用户的评论,标签评论,给定帖子的评论,标记为垃圾评论的评论,有效评论,评价最高的评论等. (18认同)
  • 确切地说 - 正如NoSQL的拥护者所声称的那样,"它只是起作用"并非如此.要么你做了一堆分析,提前为您的关系数据模型,或者你做了一堆分析,提前为您的最优先的疑问,或者您做了一堆昂贵的重构整个项目为您找出设计的零件前面没有得到足够的分析. (13认同)
  • @ M98,啊,你发现了这个战略的弱点.您必须了解需要更新的所有位置,然后在应用程序中编写代码以在更新任何位置时更新所有位置.祝好运! (3认同)
  • *非规范化*关系数据库存在同样的问题. (2认同)