何时使用MongoDB或其他面向文档的数据库系统?
我们为video和audio剪辑,照片和vectorgraphics提供了一个平台。 我们以MySQL作为数据库后端,最近包含了MongoDB,用于存储文件的所有元信息,因为MongoDB更符合要求。 例如:照片可能有Exif信息,video也可能有音轨,我们也想存储这些元信息。 video和vectorgraphics不共享任何共同的元信息等,所以我知道,MongoDB是完美的存储这种非结构化的数据,并保持search。
但是,我们继续开发我们的平台并添加function。 现在接下来的一个步骤就是为我们的用户提供一个论坛。 现在出现的问题是:使用MySQL数据库,这将是一个很好的select存储论坛和论坛post等,或使用MongoDB呢?
所以问题是:何时使用MongoDB以及何时使用RDBMS。 你会采取什么,mongoDB或MySQL,如果你有select,你为什么要采取它?
在NoSQL中:如果只是这么简单 ,作者写的关于MongoDB:
MongoDB不是一个关键/价值存储,它更多。 这绝对不是一个RDBMS。 我没有使用MongoDB进行制作,但是我已经使用它来构build一个testing应用程序,它是一个非常酷的工具包。 这似乎是非常高性能的,或者已经或即将有容错和自动分片(也就是说会扩展)。 我认为Mongo可能是迄今为止我所见过的最接近RDBMS替代品的东西。 它不适用于所有的数据集和访问模式,但它是为典型的CRUD内容而build立的。 存储本质上是一个巨大的散列,并能够select任何这些密钥,是大多数人使用关系数据库。 如果你的数据库是3NF,并且你不做任何连接(你只是select了一堆表格,把所有的对象放在一起,AKA是大多数人在networking应用程序中做的),MongoDB可能会为你踢屁股。
那么,在结论中:
要指出的是,如果你因为不能select数据库而使得某些超级棒的东西被阻止,那么你就错了。 如果你知道mysql,就使用它。 当你真正需要的时候优化。 使用它像AK / V商店,使用它像一个RDBMS,但为了上帝的缘故,build立你的杀手级应用程序! 这对大多数应用程序都无关紧要。 Facebook仍然使用MySQL,很多。 维基百科使用MySQL,很多。 FriendFeed使用MySQL,很多。 NoSQL是一个伟大的工具,但它肯定不会成为你的竞争优势,它不会让你的应用程序变得热门,而且最重要的是,你的用户不会关心这些。
我将如何构build我的下一个应用程序? 可能Postgres。 我会使用NoSQL吗? 也许。 我也可能使用Hadoop和Hive。 我可能会把所有东西都放在平面文件 也许我会开始攻击磁悬浮。 我会使用最好的工作。 如果我需要报告,我不会使用任何NoSQL。 如果我需要caching,我可能会使用东京暴君。 如果我需要ACIDity,我不会使用NoSQL。 如果我需要大量的计数器,我会使用Redis。 如果我需要交易,我会使用Postgres。 如果我有大量单一types的文档,我可能会使用Mongo。 如果我需要每天写10亿个物体,我可能会用Voldemort。 如果我需要全文search,我可能会使用Solr。 如果我需要全文search易失性数据,我可能会使用狮身人面像。
我喜欢这篇文章,我觉得它非常翔实,它给了NoSQL的风景和炒作的一个很好的概述。 但是,这是最重要的部分,在RDBMS和NoSQL之间进行select时,问自己正确的问题是非常有帮助的。 值得阅读恕我直言。
备用链接到文章
在使用MongoDb做社交应用程序两年后,我亲眼目睹了没有SQL RDBMS的情况下的真正意义。
- 最终你会写作业来完成像join不同表格/集合的数据这样的事情,RDBMS会自动为你做。
- 您的NoSQL查询function被严重瘫痪。 MongoDb可能是最接近SQL的东西,但仍然非常落后。 相信我。 SQL查询是超级直观,灵活和强大的。 MongoDb查询不是。
- MongoDb查询只能从一个集合中检索数据,并只利用一个索引。 而MongoDb可能是最灵活的NoSQL数据库之一。 在很多情况下,这意味着更多往返服务器来查找相关logging。 然后你开始去规范化数据 – 这意味着后台工作。
- 事实上,它不是一个关系数据库意味着你不会有(认为有些是不好的performance)外键限制,以确保您的数据是一致的。 我向你保证这最终会在你的数据库中造成数据不一致。 做好准备。 很可能你会开始编写进程或检查来保持数据库的一致性,这可能不会比让RDBMS为你做的更好。
- 忘掉像hibernate这样成熟的框架吧。
我相信所有项目的98%可能比使用NoSQL的典型SQL RDBMS更好。
存储这个非结构化的数据
正如你所说,MongoDB最适合存储非结构化数据。 这可以将您的数据组织成文档格式。 被称为NoSQL数据存储( MongoDB , CouchDB , Voldemort )的这些RDBMS调用对于大规模扩展并需要从这些大型数据存储更快访问数据的应用程序非常有用。
这些数据库的实现比常规的RDBMS更简单。 因为这些是简单的键值或文档样式的二进制对象直接序列化到磁盘。 这些数据存储不强制ACID属性和任何模式 。 这不提供任何交易能力。 所以这可以扩大规模,我们可以实现更快的访问(读取和写入)。
但是相比之下,RDBM在数据上执行ACID和模式。 如果您想使用结构化数据,则可以继续使用RDBM。
我会selectMySQL为这种东西创build论坛 。 因为这不会很大。 这是一个非常简单(通用)的应用程序,它具有结构化的数据关系。
请注意,Mongo本质上存储JSON。 如果您的应用程序正在处理大量的JS对象(嵌套),并且想要保留这些对象,那么使用Mongo就有一个非常有力的论据。 它使得你的DAL和MVC图层超薄,因为它们并没有打开所有的JS对象属性,并试图强制将它们放入一个他们自然不适合的结构(模式)中。
我们有一个系统,其中有几个复杂的JS对象,我们喜欢Mongo,因为我们可以真正地轻松地坚持一切。 我们的对象也是非结构化的,非结构化的,而蒙戈却毫不眨眼地吸收了这个复杂的东西。 我们有一个自定义的报告层,可以解读用于人类消费的无定形数据,而这并不难。
如果您需要复杂的交易,我会说使用RDBMS。 否则,我会去MongoDB – 更灵活的工作,你知道它可以扩大,当你需要。 (我有偏见 – 我在MongoDB项目上工作)
谁需要分布式,分片论坛? 也许Facebook,但除非你创build一个Facebook的竞争对手,只需使用MySQL,Postgres或任何你最舒服的。 如果你想尝试MongoDB,好吧,但不要指望它为你做魔术。 就像所有其他的东西一样,它会有它的怪癖和普遍的瑕疵,因为我相信你已经发现了,如果你真的已经在研究它了。
当然,MongoDB可能会被炒作,表面上看起来很容易,但是你会遇到更成熟的产品已经克服的问题。 不要太容易引诱,而是等到“nosql”成熟或死亡。
就个人而言,我认为“nosql”将会由于碎片化而枯萎,因为没有设定标准(几乎是定义上的)。 所以我不会为任何长期项目亲自下注。
在我的书中唯一可以节省“nosql”的是能够无缝地集成到Ruby或类似的语言,并使语言“持久化”,几乎没有任何编码和devise的开销。 这可能会过去,但我会等到那个时候,而不是现在,而且它当然需要更成熟。
顺便说一句,你为什么从头创build一个论坛? 有很多的开源论坛可以调整,以适应大多数的要求,除非你真的在创build下一代的论坛(我怀疑)。
参加Devoxx 2011并参加10Gen的演讲后,我写了一个比较MongoDB和RDBMS数据库的小博客。 MongoDB是stream行的Nosql dbs之一。 请参阅下文:
我已经看到很多公司正在使用MongoDB从应用程序日志中进行实时分析。 它的无模式性非常适合应用程序日志,其中logging模式往往会随时间而改变。 而且, Capped Collectionfunction也很有用,因为它会自动清除旧数据,以便将数据保存在内存中。
这是我真正认为MongoDB适合的一个领域,但MySQL / PostgreSQL更受推荐。 网上有很多文档和开发者资源,以及它们的function和健壮性。
你可能想要更喜欢Mongo的两个主要原因是
- 模式devise的灵活性(JSONtypes的文档存储)。
- 可扩展性 – 只需添加节点,就可以水平扩展。
它适用于大数据应用程序。 RDBMS不适合大数据。
你知道,所有这些关于连接和“复杂事务”的东西 – 但是多年前,Monty本人已经解释了COMMIT / ROLLBACK的“需求”,并说“所有这些都是在逻辑类中完成的(而不是数据库)“ – 所以它又是一回事。 我们需要的是一个笨拙而难以置信的,快速的数据存储/检索引擎,99%的networking应用程序。
就像之前所说的,你可以select很多select,看看所有的select: http : //kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis
我build议find最好的组合:如果你需要ACID并且你想join一些表,MySQL + Memcache真的很棒MongoDB + Redis是文档存储的完美selectNeo4J是graphics数据库的完美select
我做什么:我从MySQl + Memcache开始,因为我用它,然后我开始使用其他数据库框架。 在单个项目中,您可以将MySQL和MongoDB结合起来!