但是最近我听到了很多关于MongoDB的信息,它是一种非关系型数据库,引用官方定义的话:
我对此非常感兴趣,并且想要掌握所有下一个项目可能拥有的选项并选择最好的技术。一种可扩展的,高性能的,开源的,无模式的,面向文档的数据库。
在哪些情况下使用MongoDB(或类似的数据库)比使用“传统”关系型数据库更好呢? MongoDB相对于MySQL的优势是什么? 或者至少,它为什么如此不同?
如果您有文档和/或示例的指针,那将会非常有帮助。
我对此非常感兴趣,并且想要掌握所有下一个项目可能拥有的选项并选择最好的技术。一种可扩展的,高性能的,开源的,无模式的,面向文档的数据库。
有许多优点。
例如,您的数据库架构将更具可扩展性,无需担心迁移,编写代码将更加愉悦... 例如,这是我的一个模型代码:
class Setting
include MongoMapper::Document
key :news_search, String, :required => true
key :is_availaible_for_iphone, :required => true, :default => false
belongs_to :movie
end
添加一个键只需要添加一行代码!
长期来看,还有其他优点,比如更好的可扩展性和速度。
...但请记住,非关系型数据库并不比关系型数据库更好。如果您的数据库有很多关系和规范化,使用像MongoDB这样的东西可能没有太大意义。关键是找到适合工作的正确工具。
要阅读更多内容,我建议查看 "为什么我认为Mongo是数据库中的Rails" 或 mongodb网站上的这篇文章。如果你想激动起来,而且你说法语,可以看看这篇文章,它解释了如何从头开始设置MongoDB。
编辑:我差点忘了告诉你 Ryan 的 这个railscast。它非常有趣,让你想立即开始!
在我的项目中使用过Postgres和Mongo两种数据库,以下是我的经验。
Postgres(RDBMS)
如果你的未来应用程序具有复杂的模式需要大量的连接或者所有数据都有关系,或者我们需要进行大量写入操作,那么建议使用Postgres。Postgres是开源的,更快、ACID兼容,并且在磁盘上使用更少的内存,而且对于JSON存储性能也非常好,包括事务的完全可序列化和3个级别的事务隔离。
坚持使用Postgres最大的优点是我们可以将数据存储到带有约束、一致性和速度的JSONB中。另一方面,我们可以使用所有SQL功能来处理其他类型的数据。底层引擎非常稳定,在各种数据量范围内运行良好。它还可以在您选择的硬件和操作系统上运行。Postgres提供NoSQL能力以及完整的事务支持,可以在字段数据上存储JSON文档。
Postgres的一般限制
Postgres的水平扩展比较困难,但是可以做到。
无法完全实现Postgres的快速读取操作。
NO SQL数据库
Mongo DB (Wired Tiger)
MongoDB在“水平扩展”的维度上可能会超过Postgres。存储JSON是Mongo的优化重点。Mongo将数据存储在一种名为BSONb的二进制格式中,它(大致)只是JSON的超集的二进制表示。MongoDB完全按照设计存储对象。根据MongoDB的说法,对于写入密集型应用程序,新引擎(Wired Tiger)可以使用户的写入性能提高多达10倍(我应该尝试一下),并且存储利用率降低了80%,有助于降低存储成本,实现更大程度的硬件利用率。
MongoDb的一般限制
使用无模式存储引擎会导致隐式模式的问题。这些模式不是由存储引擎定义的,而是基于应用程序行为和期望定义的。
单独的NoSQL技术不符合ACID标准,因为它们为非结构化应用程序的高吞吐量性能而牺牲了关键的数据保护。在NoSQL数据库上应用ACID并不难,但会使数据库变得缓慢和不灵活到某种程度。“大多数NoSQL限制都在较新版本和发布中进行了优化,已经在很大程度上克服了以前的限制。”
这一切都是权衡取舍。MongoDB速度快但不支持ACID,没有事务。在某些用例中,它比MySQL更好,而在其他情况下则更差。
在对文本存储数据库的疑问之后,我看了一下MongoDB和类似的系统。
如果我理解正确的话,它们应该更容易使用和设置,并且速度更快。由于缺少SQL,它们可能也更安全,因为可以防止SQL注入攻击...
显然,MongoDB主要用于Web应用程序。
基本上,他们本身就表明,这些数据库不适用于复杂查询、数据挖掘等。但是它们在快速检索大量扁平数据方面非常出色。