哪个数据库适合我的应用程序mysql或mongodb?使用Node.js,Backbone,Now.js

时间:2012-04-11 16:27:34

标签: mysql node.js mongodb backbone.js

我想使用docs.google.com(没有api,完全在我自己的服务器上)这样的应用程序 前端:骨干 后端:节点

您认为哪个数据库更好? mysql还是mongodb?应该支持良好的可扩展性。 我熟悉php的mysql,如果答案是mysql,我会很高兴。 但是我看到很多教程,他们使用mongodb,为什么他们使用没有mysql的mongodb? 我该怎么用?

任何人都可以使用骨干,Node,mysql(或mongo)为我提供一些示例应用程序(使用源代码)构建的链接。或至少应用程序。使用Node和mysql

由于

3 个答案:

答案 0 :(得分:38)

使用MongoDB,您可以存储 JSON对象并检索它们的完整形式,因此您不需要ORM层,并且花费更少的CPU时间来回传输数据。 MongoDB背后的开发人员还将数据库水平扩展为更高优先级,并允许您运行任意Javascript代码以预处理数据库端的数据(允许对数据进行map-reduce样式过滤)。

但是你因为这些收获而失去了一些:你不能加入记录。实际上,您存储的JSON结构只能通过SQL中的连接来完成,但是在MongoDB中,您只有一个数据结构,而在SQL中,您可以以不同的方式查询并以更替代的方式表示您的数据,因此,如果您需要对您的数据库进行大量分析,MongoDB会更加努力。

在我看来,MongoDB中的查询语言比SQL更“粗糙”,部分原因是因为它不太熟悉,部分原因是查询功能“感觉”随意放在一起,部分原因是为了使其成为有效的JSON,部分是因为那里实际上是几种做同样事情的方法,有些方法不像其他方式那样有用或经常格式化。而且,基于SQL的简单行设计增加了数组和子对象类型的复杂性,因此语法必须能够处理包含某些所定义值的数组的数组,包含您定义的所有值,仅包含 您定义的值,并包含您定义的值的 none 。相同的区别适用于对象键及其值,这使得查询语法更难理解。 (虽然我可以看到边缘情况的需要,$where查询参数,它采用在每个数据记录上运行的javascript函数并返回一个布尔值,是一个Siren歌曲,因为你可以轻松定义你想要返回什么对象,但它必须在数据库中的每个记录上运行,不能使用任何索引。)

所以,这取决于你想要做什么,但既然你说它是用于Google Docs克隆的,那么可能不关心任何表示但是文档表示本身,并且您可能仅根据文档ID,文档名称或所有者的ID /名称进行查询,在查询中没有太复杂。

然后,我会说能够获取用户正在编辑的文档的JSON表示,并将其放入数据库并让它自动索引这些重要字段,值得学习新数据库的代价。

答案 1 :(得分:11)

我也在努力应对这一选择,看看使用MongoDB创建的炒作是不是为它创建的任务。所以我的2美分是:

  1. 正如大卫所说,在MongoDB中存储和检索文档可能存在的分层对象更容易。如果你想存储大于16Mb的文件会变得更复杂 - MongoDB的答案是GridFS。

  2. 使用MySQL组织文件夹,组中的文档,跟踪哪个用户拥有哪些文档以及他/她提供访问权限的文件肯定更容易 - 您可以通过连接等强大的SQL查询,构建在EXPLAIN优化,触发器,函数,存储过程等中.MongoDB远不及。

  3. 那么是什么阻止你使用MySQL来组织文档和MongoDB来存储由id标识的一个文档集合(或者几个集合 - 每个文档类型一个)?在我看来,最好的选择是在一个应用程序中使用两个数据库不是问题,真的。

    MySQL将存储用户,组,文件夹,权限 - 无论您喜欢什么 - 并且对于每个文档,它将存储对集合和文档ID的引用(MongoDB具有特殊格式--DBRefs)。 MongoDB将文档本身存储在集合中(如果它们都小于16MB),或者集合中文档的预览和元数据以及GridFS中的整个文档。

答案 2 :(得分:7)

大卫提供了一个很好的答案。要添加一些东西。

  1. MongoDB的灵活性允许轻松灵活/迭代开发。
  2. 类似node.js的MongoDB本质上是异步的,在异步环境中运行良好。
  3. Mongoose是一个很好的ODM(对象文档映射器),它使使用Node.js的MongoDB感觉非常自然。与ORM不同,这是一个非常薄的层。
  4. 对于Google Doc这样的功能,灵活性和MongoDB提供的非常丰富的数据结构感觉更适合。

    您可以通过搜索mongoose,node和MongoDB找到一些很好的示例帖子。

    这是一个也使用backbone.js并且看起来很好的http://mattkopala.com/blog/2012/02/12/getting-started-with-nodejs/