Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database MongoDB-数据库设计与父级&;子女关系_Database_Mongodb_Database Design_Mongodb Query_Non Relational Database - Fatal编程技术网

Database MongoDB-数据库设计与父级&;子女关系

Database MongoDB-数据库设计与父级&;子女关系,database,mongodb,database-design,mongodb-query,non-relational-database,Database,Mongodb,Database Design,Mongodb Query,Non Relational Database,在我的应用程序中,我有数据库中的用户表和他们在论坛上的帖子 在每一篇文章中,我都有一个链接,指向写这篇文章的用户档案 现在,如果我从DB中删除该用户-我希望他的帖子保持不变,但带有一个属性,“该用户(作者)已被删除” 在这种情况下我应该如何治疗?用户可能会留下几千篇帖子,所以如果我想删除该用户,我需要选择他的所有帖子并逐个更新?这可能需要很长时间 如果我将用户标记为“disabled”(并且实际上不删除它),那么前端将需要为每个呈现的帖子发送大量额外的请求——这更糟糕 那么,如果移除父对象,我应

在我的应用程序中,我有数据库中的用户表和他们在论坛上的帖子

在每一篇文章中,我都有一个链接,指向写这篇文章的用户档案

现在,如果我从DB中删除该用户-我希望他的帖子保持不变,但带有一个属性,“该用户(作者)已被删除”

在这种情况下我应该如何治疗?用户可能会留下几千篇帖子,所以如果我想删除该用户,我需要选择他的所有帖子并逐个更新?这可能需要很长时间


如果我将用户标记为“disabled”(并且实际上不删除它),那么前端将需要为每个呈现的帖子发送大量额外的请求——这更糟糕

那么,如果移除父对象,我应该如何处理子对象呢


你觉得怎么样?可能有更好的方法吗?

您不能将用户信息和帖子放在一个集合中的同一个文档中,因为您将为不同的目的分别检索用户的详细信息和帖子,并且向用户文档中添加大量帖子是不可行的。因此,您使用两个不同的集合用户帖子所做的是正确的&在帖子集合中维护一个与用户相关的键字段(用户文档的唯一
用户id
\u id
)也是正确的

您可以避免将用户关系存储在帖子中&仅当帖子数量非常少时,才将所有帖子ID存储在用户集合中&而且这在所有情况下都不起作用。可以说,设计数据库实际上取决于数据库操作

我需要选择他所有的帖子并逐一更新

不,您不必逐个选择和删除,成功删除/禁用用户后,您可以使用过滤器(
userId
\u id
)在帖子上运行单个查询,以查找与特定用户相关的所有文档&添加一个名为
isUserDeletedOrDisabled:true
,因此,当您为应用程序的各个页面检索帖子时,通常在插入新的帖子文档时,您会避免检索那些带有标记
isUserDeletedOrDisabled
及其
true
的帖子-您不需要该标记。在用户更新后,用户返回后,您将使用
true
添加此字段并使其成为
false

例如,Mongo DB,其中连接两个表是昂贵的操作

我不认为使用连接两个集合的成本太高,这完全取决于您的数据集大小/索引/MongoDB配置。在键字段上有索引(如在用户相关字段上的帖子集合中加上isUserDeletedOrDisabled)。因此,对于大多数应用程序,如果配置得当,if应该可以正常工作


可以帮助您轻松地实现大多数日常需求,此外,您还可以检查查询性能并通过查看(或)提供的executionStats来改进查询性能。欲了解更多信息:

您不能将用户信息和帖子保存在同一文档的集合中,因为您将为不同的目的分别检索用户详细信息和帖子,而且向用户文档添加大量帖子也是不可行的。因此,您使用两个不同的集合用户帖子所做的是正确的&在帖子集合中维护一个与用户相关的键字段(用户文档的唯一
用户id
\u id
)也是正确的

您可以避免将用户关系存储在帖子中&仅当帖子数量非常少时,才将所有帖子ID存储在用户集合中&而且这在所有情况下都不起作用。可以说,设计数据库实际上取决于数据库操作

我需要选择他所有的帖子并逐一更新

不,您不必逐个选择和删除,成功删除/禁用用户后,您可以使用过滤器(
userId
\u id
)在帖子上运行单个查询,以查找与特定用户相关的所有文档&添加一个名为
isUserDeletedOrDisabled:true
,因此,当您为应用程序的各个页面检索帖子时,通常在插入新的帖子文档时,您会避免检索那些带有标记
isUserDeletedOrDisabled
及其
true
的帖子-您不需要该标记。在用户更新后,用户返回后,您将使用
true
添加此字段并使其成为
false

例如,Mongo DB,其中连接两个表是昂贵的操作

我不认为使用连接两个集合的成本太高,这完全取决于您的数据集大小/索引/MongoDB配置。在键字段上有索引(如在用户相关字段上的帖子集合中加上isUserDeletedOrDisabled)。因此,对于大多数应用程序,如果配置得当,if应该可以正常工作


可以帮助您轻松地实现大多数日常需求,此外,您还可以检查查询性能并通过查看(或)提供的executionStats来改进查询性能。更多阅读:

“如果我将用户标记为“禁用”(并且实际上不删除它),那么前端将需要为每个呈现的帖子发送大量额外的请求”为什么你这么认为?假设我在页面上有100个来自100个唯一用户的100篇帖子,那么我将需要为用户配置文件发送100个额外的GET请求,只是为了检查它们是否是activeNo,您只需对POST和用户使用一个联接查询——这仍然只是一个联接两个表的查询……例如,如果它不是关系数据库呢