为什么我应该使用像CouchDB这样的文档数据库而不是使用关系型数据库?有哪些典型的应用程序或领域在文档数据库比关系型数据库更合适?
为什么我应该使用像CouchDB这样的文档数据库而不是使用关系型数据库?有哪些典型的应用程序或领域在文档数据库比关系型数据库更合适?
也许你不应该使用它 :-)
第二个最明显的答案是,如果你的数据不是关系型的,那么你应该使用文档数据库。这通常表现为没有简单的方法将数据描述为一组列。一个很好的例子是一个实际存储纸质文件的数据库,例如通过扫描办公邮件。数据是扫描的PDF文件,你有一些始终存在的元数据(扫描时间、扫描者、文档类型)以及存在许多可能的元数据字段(客户号码、供应商号码、订单号码、保留至、OCR全文等)。通常情况下,你事先不知道在未来两年内会添加哪些元数据字段。 对于这种类型的数据,像CouchDB这样的东西比关系型数据库更加好用。
我个人也喜欢事实上不需要任何CouchDB客户端库,除了一个HTTP客户端,这在几乎每种编程语言中都被包含。
也许最不明显的答案是:如果你使用关系型数据库没有痛苦,那就继续使用它。如果你总是不得不绕开关系型数据库才能完成工作,那么文档导向数据库可能值得一看。
要获取更详尽的列表,请查看Richard Jones的这篇文章。
从CouchDB文档(https://web.archive.org/web/20090122111651/http://couchdb.apache.org/docs/overview.html)中:
"一个文档数据库服务器,可通过RESTful JSON API访问。" 通常,关系型数据库不仅通过REST服务访问,还需要更复杂的SQL API。这些API(如JDBC、ODBC等)通常非常复杂。而REST则非常简单。
Ad-hoc并且无模式,具有平坦的地址空间。关系型数据库具有复杂的固定模式。您需要定义表格、列、索引、序列、视图和其他内容。Couch不需要这种水平的复杂、昂贵、脆弱的高级计划。
分布式,具有鲁棒的增量复制和双向冲突检测和管理。一些SQL商业产品提供了类似功能。由于SQL API和固定的模式,这是复杂、困难和昂贵的。对于Couch而言,它似乎很简单且不需要花费太多。
可查询和可索引,具有表格导向的报表引擎,使用JavaScript作为查询语言。这也是SQL和关系型数据库所使用的。没有什么新东西。
那么,为什么选择CouchDB呢?
用于存储和提供其他服务器数据的愚蠢方法。
在过去几周中,我一直在使用一个生活流应用程序来轮询我的 feeds (delicious, flickr, github, twitter...),并将它们存储在couchdb中。couchdb的美妙之处在于它让我在没有额外开销的情况下保留原始数据的原始结构。我为每个文档添加了一个“class”字段,存储源服务器,并为每个源编写了一个javascript渲染类。
总体来说,当您的服务器与另一个服务器通信时,无模式存储是最好的选择,因为您无法控制模式。作为奖励,couchdb使用服务器和客户端的本地协议——JSON表示和HTTP REST传输。
快速应用程序开发是首先想到的。
当我不断演变我的模式时,我经常感到维护MySQL/SQLite中的模式非常繁琐。虽然我还没有太多涉及CouchDB的经验,但我喜欢在RAD过程中如何简单地演变模式。
一个你可能不想使用非关系型数据库的情况是当你有很多多对多的关系;我还没有摆脱如何围绕这些关系创建好的MapReduce函数的困扰,特别是如果你需要在连接关系中有元数据。我不确定,但我认为CouchDB Map函数不能调用它们自己在数据库上的查询,因为那可能会导致无限循环。
当您不需要将数据存储在具有每个记录均匀大小字段的表中时,请使用基于文档的数据库。相反,您需要将每个记录作为具有特定特征的文档进行存储。在任何时候都可以动态地向文档添加任意数量和长度的字段,无需首先“修改表”。基于文档的字段还可以包含多个数据。