可能重复:
How to represent the data for threaded comments(along with comment voting) in mongodb?
我来自mysql世界,并决定学习使用mongoDB。我即将开展的项目将通过多级评论和投票与Reddit.com相似。你能指导我一个很好的资源来了解如何使用mongodb构建应用程序吗?我理解基本文档存储的工作原理,但无法理解如何在一个文档中存储注释树和用户信息,并在有人更新其用户信息时更新它。所以基本上我正在寻找从mysql迁移到mongodb的指南。
非常感谢任何建议/指导。
答案 0 :(得分:9)
我发现有用的一些经验法则是:
如果一条信息只有一个逻辑副本,则应该在一个文档中(例如,如果您对帖子有评论,最简单的方法是将它们嵌入帖子中)
如果要将SQL中的数据非规范化到其他表中以避免连接等等,则在文档存储中应用相同的行为:从一个“主”位置反规范化到其他位置的副本。副本应被视为副本,而不是原始信息,因此可以用未来的非规范化操作覆盖它们。
如果您必须从多个位置访问一个规范的数据集(如用户帐户),请将引用存储为mongodb中的ObjectId
,然后对相关文档执行第二次查询。 必须在应用程序中知道第二个查询不是连接,并且不会锁定这两个文档以确保一致性,因此结果可能会出现不一致。 / p>
基本上,您应该将您的数据库视为文档级别的一致。任何相关文档的查询都可能不一致,因此如果您需要一致性,可以将该数据反规范化为一个文档。
如果需要用户帐户与您的评论完全一致,则必须在撰写的同时复制评论旁边的相关信息对文件的评论。这意味着您必须始终考虑应用程序级别的一致性。如果没有,我怀疑是这种情况,只需为用户发出另一个查询。
如果您担心查询参与您网页的所有用户的数据的性能,我建议您复制注释旁边的用户帐户中的某些数据,但只能从此副本中读取 - 您应该< em>写到原始用户帐户。
这就是现在想到的一切,但我可能会在事情发生时进行编辑:)
答案 1 :(得分:5)
你遇到麻烦的原因是因为MongoDB不是relational database,而是document-oriented database。对于一些简单的东西,如具有非常固定的结构和一对多关系的评论树,你可能最好坚持使用MySQL。使用MongoDB可能是一个有趣的用户配置文件,但同样,如果它非常结构化,那么使用MySQL可能会更好。
您可能希望确定项目的哪些方面最适合面向文档的数据库(IE:非结构化数据),以及哪些方面最好使用更传统的关系数据库,然后同时使用它们!
我提出的上一个问题对两者都有很好的概述:Are document-oriented databases meant to replace relational databases?
我也一直在使用两个项目取得了很大的成功,虽然它确实需要大量的初始设置,因为大多数框架都不允许太容易实现。