如今,有数百个SQL和NoSQL数据库。其中有些数据库很受欢迎,有些数据库则被忽略;有些是用户比较喜欢使用的并且有据可查,有些则很难使用;有些数据库是开源的,有些是专有的;最重要的是有些数据库是可伸缩的,优化的,高度可用的,而有些则很难扩展或维护。有一个自然的问题:如何选择数据库?为了回答这个问题,我们应该决定要使用数据库实现的目标。要创建视图,我们应该回答以下问题:我们需要对数据库的分析访问吗?我们需要实时书写或阅读吗?我们要存储多少张表/记录?我们需要什么可用性?我们需要列吗?我们将访问按列过滤还是按行过滤的表?
做出决定后,我们需要牢记一个或另一个数据库能够提供的内容。每个数据库的特定功能可能会有所不同,但是通常,只有少数几种类型的数据库。在这些类型中,我们可以实现几乎相同的目标。让我们仔细看看它们。
1. SQL关系数据库
如果您曾经使用过数据库,则很可能已经开始使用这种类型的数据库。这种类型是最流行和广泛使用的。这些数据库允许将数据存储在具有特定类型的已定义列的关系表中。关系表是良好的规范化和联接。
好处
SQL支持
ACID事务(原子性,一致性,隔离性和持久性)
索引和分区支持
缺点
对非结构化数据/复杂类型的支持不佳
错误的事件处理优化
困难/昂贵的缩放
示例:Oracle DB,MySQL,PostgreSQL。
2.面向文档的数据库
如果我们不想连接多个表来检索所需的数据,我们可以看一下面向文档的数据库。这些数据库允许以类似JSON的格式存储记录。使用这种格式,我们可以为任何键创建复杂的值,并将所有数据结构一次包含在一条记录中。
好处
无架构
无需总是在每条记录中写入所有字段
良好的复杂类型支持
适合OLTP
缺点
交易支持不佳
不良的分析支持
困难/昂贵的缩放
示例:MongoDB
3.内存数据库
这种类型的数据库可以提供实时响应,以选择和插入特定记录。它们中的大多数主要将数据存储到RAM中,但在某些情况下还可以在HDD或SSD上提供持久性存储。这些数据库中的大多数都使用键/值记录进行操作,因此值可以调用面向文档的格式。但是某些数据库还使用列进行操作,并允许在同一表中进行二级索引。使用RAM可以快速处理数据,但使其更加不稳定和昂贵。
好处
快速写作
快速阅读
缺点
可靠性差
昂贵的缩放
示例:Redis,Tarantool,Apache Ignite
4.宽列数据库
这些数据库将数据存储为HDD或SSD上的键/值记录。这些解决方案旨在充分扩展,以管理分布式系统中数千个商用服务器中的PB数据。它们代表SSTable体系结构。该体系结构设计用于两个用例:按键快速访问和快速,高可用性的编写。
好处
逐行快速书写
快速读取按键
良好的可扩展性
高可用性
缺点
键/值格式
没有分析支持
示例:Cassandra,HBase
5.柱状数据库
有时我们需要快速访问数据,而不是使用特定的键,而是使用特定的列。在这种情况下,我们最好避免逐行插入,而转为批量写入。批处理插入允许列式数据库准备数据以供列快速读取。
好处
按列快速阅读
良好的分析支持
良好的可扩展性
缺点
仅适用于批量插入
示例:Vertica,Clickhouse
6.搜索引擎
如果我们想通过任何值甚至是列中的任何单词使用过滤器访问数据,我们都应该记住搜索引擎。这些数据库对列中的每个单词进行索引,并允许全文搜索。它们非常适合存储和分析日志或较大的文本值。
好处
一字快速访问
良好的可扩展性
缺点
仅适用于批量插入
不良的分析支持
示例:ElasticSearch,Apache Solr
7.图形数据库
对于某些用例,存在图数据结构。我们可以在图形数据库中找到它们的实现。如果您的任务需要使用图形,则可以使用专门设计的数据库来满足您的需求。
好处
图形数据结构
实体之间的可管理关系
灵活的结构
缺点
特殊查询语言
难以扩展
示例: Neo4j
关于如何选择数据库,上述推荐了7款使用比较广泛的数据库。至于到底如何选择,其实所有类型的数据库都可以完成所有任务。问题是它会多么昂贵和如何优化。选择您惯用的工具可以缩短产品上市时间,但同时也会花费大量金钱维护和扩展您的硬件,而这可能会导致效率低下。始终尝试按照其使用方式使用数据库。也许,就能找到适合所需求的解决方案。想了解更多数据库的信息,请继续关注中培伟业。