MongoDB - 具有父子关系的数据库设计
MongoDB - Database design with parent & child relationship
在我的应用程序中,我在 DB 中有 Users table,在论坛上有他们的 Posts。
在每个 post 上,我都有一个 link 到编写它的用户个人资料。
现在,如果我从数据库中删除用户 - 我希望他的 post 保留下来,但带有一个属性,即“此用户(作者)已被删除”。
这种情况应该怎么治疗?用户可能留下了数千个 posts,所以如果我想删除用户,我需要 select 他所有的 posts 并逐一更新它们?可能需要很长时间。
如果我将用户标记为“已禁用”(实际上并没有删除它),那么前端将需要为每个呈现的内容发送大量额外的请求 post - 这更糟。
那么如果我删除了父对象,我应该如何处理子对象?
你怎么看?可能有更好的方法吗?
您不能将用户信息和帖子放在一个集合的同一文档中,因为您将出于不同目的分别检索用户详细信息和帖子,并且向用户文档添加高 no.of 帖子是不可行的去做。所以你通过两个不同的集合 Users & Post 所做的是正确的 & In Post s 集合维护与 User 相关的单个键字段(用户文档的唯一 userid
或 _id
)也已正确完成。
您可以避免在 Posts 中存储 User 关系 & 只有当帖子是数量非常少,而且这在您的所有情况下都不起作用。要说设计数据库真的取决于你的数据库操作。
I need to select all his posts and update them one-by-one ?
不,您不必 select 一个接一个地删除,一旦成功 deleting/disabling 个用户,您将 运行 在 [=34= 上进行单个查询]Posts 使用 .updateMany() 和过滤器(userId
或 _id
)来查找与特定 User[=47 相关的所有文档=] & 添加一个名为 isUserDeletedOrDisabled : true
的新字段,因此当您检索应用程序的各个页面的帖子时,您将避免检索那些具有标志 isUserDeletedOrDisabled
及其 true
的帖子,一般来说在插入新的 Posts 文档时 - 您不需要该标志。在 User 更新后,您将使用 true
添加此字段并在用户返回后使其成为 false
..
for example Mongo DB where joining 2 tables is expensive operation ?
我认为使用 $lookup 加入两个集合并不昂贵,这完全取决于您的数据集 size/index/MongoDB 配置。在键字段上有索引(比如在 Posts 集合中 User 相关字段加上 isUserDeletedOrDisabled).因此,对于大多数应用程序来说,只要适当的配置就可以正常工作。
Aggregation can help you to achieve most of the daily needs with ease, additionally you can check your query performance & improve it by looking in executionStats provided by .explain() (or) $explain. For more read : query-optimization
在我的应用程序中,我在 DB 中有 Users table,在论坛上有他们的 Posts。
在每个 post 上,我都有一个 link 到编写它的用户个人资料。
现在,如果我从数据库中删除用户 - 我希望他的 post 保留下来,但带有一个属性,即“此用户(作者)已被删除”。
这种情况应该怎么治疗?用户可能留下了数千个 posts,所以如果我想删除用户,我需要 select 他所有的 posts 并逐一更新它们?可能需要很长时间。
如果我将用户标记为“已禁用”(实际上并没有删除它),那么前端将需要为每个呈现的内容发送大量额外的请求 post - 这更糟。
那么如果我删除了父对象,我应该如何处理子对象?
你怎么看?可能有更好的方法吗?
您不能将用户信息和帖子放在一个集合的同一文档中,因为您将出于不同目的分别检索用户详细信息和帖子,并且向用户文档添加高 no.of 帖子是不可行的去做。所以你通过两个不同的集合 Users & Post 所做的是正确的 & In Post s 集合维护与 User 相关的单个键字段(用户文档的唯一 userid
或 _id
)也已正确完成。
您可以避免在 Posts 中存储 User 关系 & 只有当帖子是数量非常少,而且这在您的所有情况下都不起作用。要说设计数据库真的取决于你的数据库操作。
I need to select all his posts and update them one-by-one ?
不,您不必 select 一个接一个地删除,一旦成功 deleting/disabling 个用户,您将 运行 在 [=34= 上进行单个查询]Posts 使用 .updateMany() 和过滤器(userId
或 _id
)来查找与特定 User[=47 相关的所有文档=] & 添加一个名为 isUserDeletedOrDisabled : true
的新字段,因此当您检索应用程序的各个页面的帖子时,您将避免检索那些具有标志 isUserDeletedOrDisabled
及其 true
的帖子,一般来说在插入新的 Posts 文档时 - 您不需要该标志。在 User 更新后,您将使用 true
添加此字段并在用户返回后使其成为 false
..
for example Mongo DB where joining 2 tables is expensive operation ?
我认为使用 $lookup 加入两个集合并不昂贵,这完全取决于您的数据集 size/index/MongoDB 配置。在键字段上有索引(比如在 Posts 集合中 User 相关字段加上 isUserDeletedOrDisabled).因此,对于大多数应用程序来说,只要适当的配置就可以正常工作。
Aggregation can help you to achieve most of the daily needs with ease, additionally you can check your query performance & improve it by looking in executionStats provided by .explain() (or) $explain. For more read : query-optimization