为什么我应该使用基于文档的数据库,如CouchDB,而不是使用关系数据库。 在哪些典型的应用程序或领域中,基于文档的数据库比关系数据库更适合?
当前回答
也许你不应该:-)
The second most obvious answer is you should use it if your data isn't relational. This usually manifests itself in having no easy way to describe your data as a set of columns. A good example is a database where you actually store paper documents, e.g. by scanning office mail. The data is the scanned PDF and you have some meta data which always exists (scanned at, scanned by, type of document) and lots of possible metadata fields which exists sometime (customer number, supplier number, order number, keep on file until, OCRed fulltext, etc). Usually you do not know in advance which metadata fields you will add within the next two years. Things like CouchDB work much nicer for that kind of data than relational databases.
我个人还喜欢这样一个事实:除了HTTP客户端之外,CouchDB不需要任何客户端库,现在几乎每一种编程语言都包含了HTTP客户端。
可能最不明显的答案是:如果使用RDBMS没有痛苦,那么就继续使用它。如果您总是要绕过RDBMS来完成工作,那么面向文档的数据库可能值得一试。
想要更详细的列表,请查看理查德·琼斯的这篇帖子。
其他回答
一个原因是对不一定具有相同结构/模式的JSON(或其他自描述格式)文档提供快速全文搜索。
详细说明smdelfin:灵活性。您可以以任何结构(非结构化和全部)存储数据,并且每个文档都可以完全不同。CouchDB特别有用,因为通过它们的“视图”索引,您可以过滤掉特定的文档,并在需要数据库的那些子集时只查询该视图。
对于以JSON格式存储数据的文档数据库,我最大的优势在于:这是JavaScript的原生格式。因此,JavaScript web应用程序与CouchDB一起工作得非常好。我最近开发了一个利用CouchDB的web应用程序,它的速度非常快,同时还能够处理不断变化的数据结构。
视情况而定。
是的,这是一个用例。是的,这也是一种开发者体验。是的,要输入的数据的性质很重要(高度可预测、正交、合理、易于规范化,或者不太可能以任何有意义的方式规范化/组织)。是的,一个记录/对象与另一个记录/对象的关系(如果有的话)很重要。是的,你需要如何分析数据很重要。是的,所支持的应用程序的性质很重要(在应用程序中如何使用数据)。
是的,如果一个记录/文档的结构(模式)必须快速更改,或者字段本身对于每个记录/文档必须不是强制性的,那么这就很重要
是的,如果您有大量的数据要存储,并且希望减少检索时间,这很重要。规范化数据(许多独立的、不同的表中的数据)往往需要以某种方式放在一起(连接、子查询等)以返回有用的结果。只要返回一些文档或集合(带有一些过滤),就可以更快地返回相同的结果。
哦,是的,为了让新的世界秩序得到认可……是的,那些学习JavaScript或Python作为第一门编程语言的人很高兴不用再背负SQL的负担。例如,MongoDB将数据存储为BSON,对于那些只关心获取他们想要的数据的人来说,BSON实际上看起来像JSON——没有模式,只是存储/获取数据,然后继续做下一件事。
Frankly, it matters which one you learned first. If you learned SQL first, then there is a place for everything and everything in its place. You do not mind defining/altering a schema because it makes know your data very well. In fact, some people prefer SQL because the enjoy the feeling of control. The do not mind knowing another domain specific language because of the power it gives to the user. Since SQL has been around since the 70s, it is basically the old school business way of doing things.
使用SQL RDBMS的成本是计划和修改模式的时间(必要时进行分区)、计划表大小和可伸缩性的时间(集群)、学习与数据库的接口以及将记录转换为编程语言数据结构(ORM或其他)。
然而,当涉及到分析数据和提出复杂问题时,SQL是非常有效的。如果您需要的不仅仅是简单的存储和检索需求(包括少量的分析),那么SQL可以让您走在游戏的前面。
然而,规范化的SQL数据库作为应用程序的整体并不一定适合应用程序的所有数据需求。应用程序(web或其他)的某些方面可能不是业务持续关注的中心和核心。
如果您希望为您的财务记录(支付、购买等)提供一个可靠的、符合ACID的事务(带回滚)记录系统——就像如果您是一家银行——那么无论文档数据库有多好,我都将使用SQL。然而,UI中的一些繁琐的小部件甚至可能不会触及客户记录/业务事务。为什么要有这样的模式呢?
实际上,这就是核心UI web开发人员的观点。他们可以证明文档数据库可以简化开发,但不能使您的业务事务符合ACID。他们获得的经验越多,就越会认识到文档数据库的便利只是一种便利。
我敢肯定,就在我输入这篇文章的时候,有人说XX文档DB现在有兼容ACID的事务,但它有SQL吗?最终,那些希望对所有内容都使用文档db的人将找到实现它的方法——这可能意味着集合和文档将有更多约束,并且它开始转变为模式的——GASP——形式。
Look, with things like REST and GraphQL APIs, you never know where you might be getting data from. You cannot predict or plan the form of all data ahead of time. In cases like these (say, interfacing with the Amazon Web Services APIs), then a document database makes good sense. You do not want to normalize that much data. You just want to access, filter it, and do basic stuff to satisfy the needs of your application. Dumping this data into an SQL database could be a waste of time. Every time AWS updates a service with new data, you might have to change your code and schema to accommodate it. ACKKK! Just store it in collections and documents already!
上面的AWS API示例不涉及事务。如果需要保留一些API信息,就不需要一堆表。不幸的是,有些人试图让每个场景都适合这个用例,但他们错了!
更进一步说,考虑到人们可能从AWS API中摄取的数据量,存储在集合和文档中的分片和集群数据要比分区和集群SQL数据库简单得多。如果您在操作部门工作,那么文档数据库最终会更容易管理。
因此,虽然我喜欢这里的许多答案,但许多人似乎为自己的阵营进行了辩护,并且/或只是简单地解释了文档数据库可能比基于模式的正交SQL数据库更适合的场景。
经验法则:
如果它是核心和关键的业务运作和 持续经营(CRUD, ACID,事务),SQL。 如果只是为了处理海量数据而进行的处理 应用程序和UI,文档/ NoSQL数据库。
我想到了快速应用程序开发。
当我不断地改进我的模式时,我总是因为必须在MySQL/SQLite中维护模式而感到沮丧。虽然我还没有过多地使用CouchDB,但我确实喜欢在RAD过程中演进模式的简单性。
当你有很多多对多关系时,你可能不想使用非关系数据库;我还没有弄清楚如何围绕这类关系创建良好的MapReduce函数,特别是当您需要在连接关系中使用元数据时。我不确定,但我不认为CouchDB Map函数可以在数据库上调用它们自己的查询,因为这可能会导致无限循环。
也许你不应该:-)
The second most obvious answer is you should use it if your data isn't relational. This usually manifests itself in having no easy way to describe your data as a set of columns. A good example is a database where you actually store paper documents, e.g. by scanning office mail. The data is the scanned PDF and you have some meta data which always exists (scanned at, scanned by, type of document) and lots of possible metadata fields which exists sometime (customer number, supplier number, order number, keep on file until, OCRed fulltext, etc). Usually you do not know in advance which metadata fields you will add within the next two years. Things like CouchDB work much nicer for that kind of data than relational databases.
我个人还喜欢这样一个事实:除了HTTP客户端之外,CouchDB不需要任何客户端库,现在几乎每一种编程语言都包含了HTTP客户端。
可能最不明显的答案是:如果使用RDBMS没有痛苦,那么就继续使用它。如果您总是要绕过RDBMS来完成工作,那么面向文档的数据库可能值得一试。
想要更详细的列表,请查看理查德·琼斯的这篇帖子。
推荐文章
- 为什么我应该使用基于文档的数据库而不是关系数据库?
- 哪个更快/最好?SELECT *或SELECT columnn1, colum2, column3等
- 将值从同一表中的一列复制到另一列
- 什么是数据库池?
- 关于数据库,每个开发人员应该知道些什么?
- "where 1=1"语句
- 是使用各有一个模式的多个数据库更好,还是使用一个数据库有多个模式更好?
- 如何从Oracle的表中获取列名?
- 如何检查表上持有哪些锁
- 在MongoDB中查找重复的记录
- 模式、表和数据库之间的区别是什么?
- 我看到VARCHAR(255)如此频繁地使用(而不是其他长度),有什么好的原因吗?
- 使用pgadmin连接到heroku数据库
- Delete_all vs destroy_all
- 我如何移动一个redis数据库从一个服务器到另一个?