我试图找出NoSQL KVP或文档数据库中的外键和索引的等价物.由于没有关键表(添加标记两个对象之间关系的键),我真的很难过如何能够以对普通网页有用的方式检索数据.
假设我有一个用户,该用户在整个网站上留下了很多评论.我能想到跟踪用户评论的唯一方法是
将它们嵌入用户对象(这似乎没用)
创建并维护一个user_id:comments
值,其中包含每个注释的键列表[注释:34,注释:197等...]以便我可以根据需要获取它们.
然而,采用第二个例子,当你使用它来跟踪其他东西时,你很快就会遇到一块砖墙,例如一个名为"active_comments"的密钥,其中可能包含3000万个ID,这使得查询每个页面只需知道一些TON积极评论.它也很容易出现竞争条件,因为很多页面可能会同时尝试更新它.
如何在NoSQL数据库中跟踪以下关系?
所有用户的评论
所有有效评论
所有帖子标有[keyword]
俱乐部的所有学生 - 或学生所在的所有俱乐部
或者我错误地想到了这个?
关于如何以"NoSQL方式"存储多对多关联的所有答案都减少到同样的事情:冗余地存储数据.
在NoSQL中,您不会根据数据实体之间的关系设计数据库.您可以根据要对其运行的查询来设计数据库.使用与用于非规范化关系数据库相同的标准:如果数据具有内聚性更重要(考虑以逗号分隔列表而不是规范化表格中的值),那么就这样做.
但是这不可避免地优化了一种类型的查询(例如,任何用户对给定文章的评论),而牺牲了其他类型的查询(给定用户对任何文章的评论).如果您的应用程序需要同等优化两种类型的查询,则不应该非规范化.同样,如果您需要以关系方式使用数据,则不应使用NoSQL解决方案.
非规范化和冗余存在风险,冗余数据集将彼此不同步.这被称为异常.使用规范化关系数据库时,RDBMS可以防止异常.在非规范化数据库或NoSQL中,编写应用程序代码以防止异常成为您的责任.
有人可能会认为,对于NoSQL数据库来说,做一些防止异常的艰苦工作会很棒.有一种范式可以做到这一点 - 关系范式.