MongoDB - 存储和读取数据的最佳方式

时间:2016-12-25 17:53:01

标签: php mongodb database

我有一个Mongo数据库。

我有两个系列:

  1. 用户
  2. 帖子
  3. 用户发送帖子但问题在这里。哪种方式更好?

    1. 仅将用户_id存储在帖子后面(POST CREATOR)。
    2. 将(_id,name,username,...)等用户信息存储在帖子后面。
    3. 在第一种方法中,我们需要从集合USERS中获取用户信息。

      在第二种方法中,我们需要更新用户发送的所有帖子数据仅当用户更新个人资料信息时。

      哪个更好?

4 个答案:

答案 0 :(得分:4)

在MongoDB中将一个文档嵌入另一个文档是正常的。我认为第二种方式更好,因为:

1-你不必手动考虑关系,以便更清洁

2-选择第一种方式添加一个或多个额外查询(性能问题)

答案 1 :(得分:4)

要了解应用的最佳方式,请问自己以下问题:

a)对用户集合的写入(更新)查询是高还是低? (可能很低)

b)后期合并的读取查询的nr是高还是低? (可能很高)

c)(用户)数据一致性有多重要?

非规范化是MongoDB中的常用方法。 如果写入的nr与读取的nr相比较少,则通过嵌入数据对数据进行非规范化将产生更好的读取性能,但写入性能会降低,因此需要在更多位置写入。需要注意的是,可能会出现数据不一致的情况,因为在mongodb中,只有在单个文档上写入时,写入才不是原子的。

通过选择解决方案#1,您对帖子的读取速度会变慢,因为这需要对用户集合进行其他读取查询。数据一致性得到保证,您也可以获得更大的灵活性。

通过选择解决方案#2,您可以更快地读取帖子,因为一切都在那里,嵌入,您在一个查询中拥有它。但是您的用户查询更新速度会变慢。在此解决方案中,不保证数据一致性,但在稍后可以处理更新不一致时,这在某些应用程序中可能不是一个大问题。 在这里,您只能嵌入您需要的用户数据部分,而不是全部,例如只有用户名(和_id),如果您只需要用户名在帖子上显示它。

如果你有一个包含大量帖子的非常大的数据集,并且用户集合的更新次数较少,那么对帖子集合和用户数据的大量读取可能包含可能发生的不一致,并且它们不具有批评性的重要性,可以在以后修复,在性能方面,更好的解决方案是#2。

有关架构设计的有趣文章,您可以在here中找到它。

答案 2 :(得分:3)

你应尽可能避免MongoDB中的关系。

我建议你使用第二种方法。

答案 3 :(得分:2)

当然,读取请求不仅仅是编辑请求。

因此,如果您使用第一种方法,则必须添加一些查询以从集合中读取数据,并降低读取性能。

确保第二种方法更好。