我是MongoDB的新手,我正在尝试学习NoSQL风格的数据库,并且想知道,我将如何在MongoDB命令行中编写多对多关系。例如,餐馆可以从一个或多个用户那里接收评论,而这些用户中的每个用户都可以对一个或多个餐馆进行评论。
餐馆: 评论ID,用户ID,评论
用户: 评论ID,餐厅ID,评论
我们将使用唯一的ID进行编码吗?
答案 0 :(得分:0)
如果您的系统假设要执行具有不同类型关系(联接)的查询,我建议重新设计它并转到相对数据库。
如果是Mongo,则必须手动管理关系。 您可以使用DBRef。但我强烈建议您避免使用它们。在许多框架(例如-Spring Data)中,DBRef可能会导致非最优子查询(它会针对结果集中的每个DBRef在一个周期中执行一次子查询)。
在您的情况下,我建议在每个实体中存储相关的主键(ID)列表,并根据需要通过您自己的IF对列表进行查询。
答案 1 :(得分:0)
使用NoSQL,主要要看的是您期望如何查询此数据。您希望尽可能避免关联,并且通常希望将数据封装在单个文档中。多对多关系通常会被除名,而A
拥有B
关系通常会以B
作为A
内的属性而结束。
看示例中的注释<->餐馆,在添加新注释时将comments
集合上放置一个restaurants
数组可能是有意义的。假设没有餐厅有太多评论(肯定可以解决!),这将使您能够在单个快速查询中获得所需的所有信息。
如果您还想按用户查找评论,则可以对每个用户的评论进行规范化处理,然后将其存储在用户身上,或者仅存储该用户评论过的餐厅的ID。
与传统的关系数据库相比,以这种方式存储数据无疑是更多的工作,并且灵活性较差,但是它确实允许快速查询和可扩展的体系结构