2016-12-25 97 views
4

我有一个Mongo数据库。MongoDB - 存储和读取数据的最佳方式

我有两个集合:

  1. 用户
  2. 帖子

用户发送一个职位,但问题就在这里。哪种方法更好?

  1. 只存储用户_id在帖子(POST CREATOR)后面。
  2. 将用户信息(如_id,名称,用户名等)存储在帖子的后面。

在第一种方法中,我们需要从集合USERS中获取用户信息。

在第二种方法中,我们需要更新用户发送的所有帖子数据仅当用户更新配置文件信息时。

哪个更好?

+0

存储关系数据的最佳方式是将其存储在关系数据库中。 – Federkun

+0

@Federkun你是说第一种方法更好? – Ghorbanzadeh

+0

因此,你已经同意第一选择去了。而且,根据我也是第一好 –

回答

3

你应该尽量避免MongoDB中的关系。

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

4

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

1 - 你不必考虑手动关系,使得其更清洁

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

4

要找出您的应用程序的最佳途径,问问自己这些问题:

一)被写(更新)查询用户收集高或低的NR? (可能很低)

b)读后查询的nr是否为高或低? (可能很高)

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

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

通过选择解决方案#1,您将在帖子上读取速度较慢,因为需要对用户集合进行其他读取查询。数据一致性得到保证,并且您也获得更多灵活性。

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

如果您有一个非常大的数据集,其中包含大量的帖子,并且用户收集的更新较少,则对帖子收集和用户数据的大量读取可能包含可能发生的不一致,并且这些不一致很重要,可以稍后修复在性能方面更好的解决方案是#2。

关于模式设计的一篇有趣的文章,你可以在here找到它。

2

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

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

确保第二种方法更好。