69

有几种类型的数据库用于不同的目的,但通常 MySQL 用于所有用途,因为它是最知名的数据库。举个例子,我公司一个大数据的应用,初期有一个MySQL数据库,难以置信,会给公司带来严重的后果。为什么选择 MySQL?只是因为没有人知道应该如何(以及何时)使用另一个 DBMS。

所以,我的问题不是关于供应商,而是关于数据库的类型。你能给我一个具体情况(或应用程序)的实际例子吗?强烈建议在哪些类型的数据库中使用它?

例子:

• 由于 Y,社交网络应该使用类型 X。

• MongoDB 或couch DB 不支持事务,因此Document DB 不适用于银行或拍卖网站的应用程序。

等等...


关系型: MySQLPostgreSQLSQLiteFirebirdMariaDBOracle DBSQL serverIBM DB2IBM InformixTeradata

对象: ZODBDB4OEloqueraVersantObjectivity DBVelocityDB

图数据库: AllegroGraphNeo4jOrientDBInfiniteGraphgraphbasesparkledbflockdbBrightstarDB

关键值存储: Amazon DynamoDBRedisRiakVoldemortFoundationDBleveldbBangDBKAIhamsterdbTarantoolMaxtableHyperDexGenomuMemcachedb

列族: 大表Hbase超表CassandraApache Accumulo

RDF 存储: Apache Jena芝麻

多模型数据库: arangodbDatomicOrient DBFatDBAlchemyDB

文档: Mongo DBCouch DBRethink DBRaven DBterrastoreJas DBRaptor DBdjon DBEJDBdenso DBCouchbase

XML 数据库: BaseXSednaeXist

分层: InterSystems Caché , GT.M 感谢@Laurent Parenteau

4

3 回答 3

78

我发现了两篇关于这个主题的令人印象深刻的文章。highscalability.com的所有学分。此答案中的信息转录自以下文章:

选择下一个 NoSQL 数据库的 35 多个用例

你到底在用 NoSQL 做什么?


如果您的应用程序需要...

复杂的事务,因为您不能承受丢失数据,或者如果您想要一个简单的事务编程模型,那么请查看关系或网格数据库。

示例:可能需要完整ACID的库存系统。当我买一个产品时我很不高兴,他们后来说他们缺货了。我不想要有偿交易。我想要我的物品!

扩展然后NoSQL 或SQL 可以工作。寻找支持横向扩展、分区、实时添加和删除机器、负载平衡、自动分片和重新平衡以及容错的系统。

•因为您需要高可用性,所以始终能够写入数据库,然后查看具有最终一致性的Bigtable Clone。

• 处理大量可能不稳定的小型连续读取和写入,然后查看提供快速内存访问的文档或键值或数据库。另外,考虑SSD

• 要实现社交网络操作,您首先可能需要一个图形数据库,或者第二个,像Riak这样支持关系的数据库。具有简单 SQL 连接的内存中关系数据库可能足以处理小型数据集。Redis的 set 和 list 操作也可以工作。

• 要对各种访问模式和数据类型进行操作,然后查看文档数据库,它们通常很灵活并且性能良好。

• 具有大型数据集的强大离线报告然后看看Hadoop,其次是支持MapReduce的产品。支持 MapReduce 不等于擅长它。

• 要跨越多个数据中心,请查看Bigtable Clone 和其他提供分布式选项的产品,这些选项可以处理长延迟并具有分区容错性

• 构建CRUD应用程序然后查看文档数据库,它们可以轻松访问复杂数据而无需连接。

内置搜索然后查看Riak

• 对列表、集合、队列、发布-订阅等数据结构进行操作,然后查看Redis。对分布式锁定、封顶日志等很有用。

•以对程序员友好的数据类型(如 JSON、HTTP、REST、Javascript)的形式对程序员友好,然后首先查看文档数据库,然后查看键值数据库。

事务实时数据馈送的物化视图相结合,然后查看VoltDB。非常适合数据汇总和时间窗口

企业级支持和 SLA然后寻找能够满足该市场需求的产品。Membase就是一个例子。

• 记录可能根本不需要一致性保证的连续数据流,然后查看Bigtable克隆,因为它们通常在可以处理大量写入的分布式文件系统上工作。

尽可能简单地操作然后寻找托管或PaaS解决方案,因为他们会为您完成所有工作。

• 要出售给企业客户,然后考虑使用关系数据库,因为他们习惯于关系技术。

• 要在具有动态属性的对象之间动态建立关系,请考虑使用图形数据库,因为它们通常不需要模式,并且可以通过编程逐步建立模型。

• 支持大型媒体再看S3之类的存储服务。NoSQL系统倾向于不处理大型BLOBS,尽管MongoDB有文件服务。

• 快速高效地批量上传大量数据,然后寻找支持该方案的产品。大多数不会,因为它们不支持批量操作。

升级路径更简单,然后使用文档数据库或键值数据库等流动模式系统,因为它支持可选字段、添加字段和删除字段,无需构建完整的模式迁移框架。

• 要实现完整性约束,然后选择支持 SQL DDL的数据库,在存储过程中实现它们,或者在应用程序代码中实现它们。

非常深的连接深度然后使用图形数据库,因为它们支持实体之间的极快导航。

• 将行为靠近数据移动,这样数据就不必通过网络移动,然后查看一种或另一种存储过程。这些可以在关系、网格、文档甚至键值数据库中找到。

缓存或存储 BLOB数据,然后查看键值存储。缓存可以用于网页的位,或者保存复杂的对象,这些对象在加入关系数据库时很昂贵,可以减少延迟等等。

• 一个经过验证的跟踪记录,例如不破坏数据并且正常工作,然后选择一个已建立的产品,当您遇到扩展(或其他问题)时,使用一种常见的解决方法(扩展、调整、memcached、分片非规范化等)。

流动数据类型,因为您的数据本质上不是表格,或者需要灵活数量的列,或者具有复杂的结构,或者因用户(或其他)而异,然后查看文档、键值和Bigtable克隆数据库. 每个人的数据类型都有很大的灵活性。

• 其他业务部门运行快速关系查询,因此您不必重新实现所有内容,然后使用支持 SQL 的数据库。

• 在云中运行并自动充分利用云功能,那么我们可能还没有。

• 支持二级索引,因此您可以通过不同的键查找数据,然后查看关系数据库和Cassandra的新二级索引支持。

• 创建一组很少被访问的不断增长的数据(实际上是BigData),然后查看Bigtable Clone,它将数据分布在分布式文件系统上。

与其他服务集成,然后检查数据库是否提供某种后写同步功能,以便您可以捕获数据库更改并将它们提供给其他系统以确保一致性。

容错检查在面对电源故障、分区和其他故障情况时写入的持久性。

• 将技术信封推向一个似乎没人会去的方向,然后自己构建它,因为有时这就是伟大的需要。

• 要在移动平台上工作,请查看 CouchDB/ Mobile couchbase


一般用例 (NoSQL)

。NoSQL 被视为支持新数据堆栈的关键部分:大数据、大量用户、大量计算机、大供应链、大科学等等。当某些东西变得如此庞大以至于必须大规模分布时,NoSQL 就在那里,尽管并非所有 NoSQL 系统都以大为目标。Bigness 可以跨越许多不同的维度,而不仅仅是使用大量的磁盘空间。

强大的写入性能。这可能是基于谷歌影响的规范用法。高音量。Facebook 每月需要存储1350 亿条消息 (2010 年)。例如,Twitter 存在每天 (2010 年)存储 7 TB/数据的问题,而这一需求预计每年会翻倍。这是数据太大而无法容纳一个节点的问题。以 80 MB/s 的速度存储 7TB 需要一天的时间,因此写入需要分布在集群上,这意味着键值访问、MapReduce、复制、容错、一致性问题等等。对于更快的写入,可以使用内存系统。

快速键值访问。这可能是 NoSQL 在一般思维集中被引用次数第二多的优点。当延迟很重要时,很难在键上散列并直接从内存中读取值,或者只需一次磁盘查找。并非每个 NoSQL 产品都与快速访问有关,例如,有些产品更注重可靠性。但是人们长期以来一直想要的是更好的 memcached,许多 NoSQL 系统都提供了这种功能。

灵活的模式和灵活的数据类型。 NoSQL 产品支持一系列新的数据类型,这是 NoSQL 的一个主要创新领域。我们有:面向列、图形、高级数据结构、面向文档和键值。无需大量映射即可轻松存储复杂对象。开发人员喜欢避免使用复杂的模式和ORM框架。缺乏结构允许更大的灵活性。我们还有对程序和程序员友好的兼容数据类型,例如 JSON。

架构迁移。无模式使处理模式迁移变得更容易,而无需过多担心。模式在某种意义上是动态的,因为它们是由应用程序在运行时强加的,因此应用程序的不同部分可以有不同的模式视图。

写入可用性。无论如何,您的写作都需要成功吗?然后我们可以进入分区、CAP最终一致性和所有这些爵士乐。

更易于维护、管理和操作。这是非常特定于产品的,但许多 NoSQL 供应商正试图通过让开发人员轻松采用它们来获得采用。他们在易用性、最少的管理和自动化操作上花费了大量精力。这可以降低运营成本,因为不必编写特殊代码来扩展从未打算以这种方式使用的系统。

没有单点故障。并非每个产品都提供这一点,但我们看到了相对容易配置和管理高可用性的明确融合,以及自动负载平衡和集群大小调整。完美的云合作伙伴。

普遍可用的并行计算。我们看到 MapReduce 融入产品,这使得并行计算成为未来发展的常态。

程序员的易用性。访问您的数据应该很容易。虽然关系模型对于最终用户(如会计师)来说是直观的,但对于开发人员来说却不是很直观。程序员了解键、值、JSON、Javascript 存储过程、HTTP 等等。NoSQL 适用于程序员。这是一场由开发商主导的政变。对数据库问题的反应并不总是聘请真正知识渊博的DBA,正确设置架构,进行一些非规范化等等,程序员更喜欢他们可以为自己工作的系统。让产品发挥作用应该不难。钱是问题的一部分。如果扩展一个产品的成本很高,那么你会不会选择更便宜、你控制、更容易使用、更容易扩展的产品?

为正确的问题使用正确的数据模型。不同的数据模型用于解决不同的问题。例如,已经付出了很多努力,将图操作嵌入到关系模型中,但它不起作用。在图数据库中解决图问题不是更好吗?我们现在看到了一种试图在问题和解决方案之间找到最佳匹配的一般策略。

避免撞墙。许多项目在他们的项目中遇到了某种类型的墙。他们已经用尽了所有选项来使他们的系统扩展或正常运行,并且想知道下一步是什么?选择一种产品和一种方法,可以通过使用增量添加的资源进行线性扩展来跳过墙壁,这是令人欣慰的。有一次这是不可能的。一切都需要定制,但这已经改变了。我们现在看到了一个项目可以轻松采用的可用的开箱即用产品。

分布式系统支持。并不是每个人都担心非 NoSQL 系统所能达到的规模或性能。他们需要的是一个分布式系统,它可以跨越数据中心,同时处理故障场景而不会出现问题。NoSQL 系统,因为它们专注于规模,倾向于利用分区,倾向于不使用严格的严格一致性协议,因此非常适合在分布式场景中运行。

可调的 CAP 权衡NoSQL 系统通常是唯一带有“滑块”的产品,用于选择他们想要在 CAP 范围内的哪个位置。关系数据库选择强一致性,这意味着它们不能容忍分区故障。最后,这是一个商业决定,应该根据具体情况来决定。你的应用甚至关心一致性吗?几滴可以吗?您的应用需要强一致性还是弱一致性?可用性更重要还是一致性更重要?失败会比犯错更昂贵吗?很高兴拥有可以让您选择的产品。

更具体的用例

• 管理大量非事务性数据:Apache 日志、应用程序日志、MySQL日志、点击流等。

• 同步在线和离线数据。这是CouchDB所针对的利基市场。

• 所有负载下的快速响应时间。

• 当复杂连接的查询负载对于RDBMS来说太大时,避免重连接。

• 低延迟至关重要的软实时系统。游戏就是一个例子。

• 需要支持各种不同的写入、读取、查询和一致性模式的应用程序。有些系统针对 50% 读取、50% 写入、95% 写入或 95% 读取进行了优化。只读应用程序需要极快的速度和弹性、简单的查询,并且可以容忍稍微陈旧的数据。需要中等性能、读/写访问、简单查询、完全权威数据的应用程序。具有复杂查询要求的只读应用程序。

• 负载平衡以适应数据和使用集中并帮助保持微处理器忙碌。

• 实时插入、更新和查询。

• 分层数据,如线程讨论和部件爆炸。

• 动态表创建。

• 两层应用程序,其中低延迟数据通过快速 NoSQL 接口提供,但数据本身可以由高延迟 Hadoop 应用程序或其他低优先级应用程序计算和更新。

顺序数据读取。需要选择正确的底层数据存储模型。B 树可能不是顺序读取的最佳模型。

• 将可能需要更好性能/可扩展性的部分服务切割到自己的系统上。例如,用户登录可能需要高性能,并且此功能可以使用专用服务来实现这些目标。

缓存。用于网站和其他应用程序的高性能缓存层。示例是大型强子对撞机使用的数据聚合系统的缓存。表决。

• 实时页面查看计数器。

• 用户注册、配置文件和会话数据。

文档、目录管理和内容管理系统。这些都是通过存储复杂文档的能力来促进的,它具有一个整体而不是组织为关系表。类似的逻辑适用于库存、购物车和其他结构化数据类型。

归档。存储仍然可以在线访问的大量连续数据流。具有灵活模式的面向文档的数据库,可以处理模式随时间的变化。

分析。使用 MapReduce、Hive 或 Pig 执行支持高写入负载的分析查询和横向扩展系统。

• 处理异构类型的数据,例如,通用级别的不同媒体类型。

• 嵌入式系统。他们不想要 SQL 和服务器的开销,因此他们使用更简单的存储方式。

• 一个“市场”游戏,您在其中拥有城镇中的建筑物。你想让某人的建筑列表快速弹出,所以你在建筑表的所有者列上进行分区,这样选择是单分区的。但是,当有人购买其他人的建筑物时,您会更新所有者列以及价格。

JPL正在使用SimpleDB来存储流动站计划属性。对S3中的完整计划 blob 的引用保持不变。(来源)

• 联邦执法机构使用信用卡、会员卡和旅行预订实时跟踪美国人。

•通过实时将交易与已知模式进行比较来检测欺诈。

•通过整合每位患者的病史,帮助诊断肿瘤类型。

• 用于高更新情况的内存数据库,例如显示每个人“最后一次活动”时间的网站(可能用于聊天)。如果用户每 30 秒执行一次某些活动,那么您将几乎达到您的极限,同时有大约 5000 个用户。

• 使用物化视图处理低频多分区查询,同时继续处理高频流数据。

• 优先队列。

• 使用程序友好的界面对缓存数据运行计算,而无需通过ORM

•使用简单的键值列对大型数据集进行唯一化。

• 为了保持快速查询,可以将值汇总到不同的时间片中。

• 计算两个大集合的交集,其中连接会太慢。

时间线ala Twitter

Redis 用例、VoltDB 用例等可在此处找到

于 2013-08-18T16:12:50.083 回答
5

由于普遍性,这个问题几乎不可能回答。我认为您正在寻找某种简单的答案问题=解决方案。问题是每个“问题”随着它成为一项业务而变得越来越独特。

什么叫社交网络?推特?Facebook?领英?堆栈溢出?他们都对不同的部分使用不同的解决方案,并且可以存在许多使用多语言方法的解决方案。Twitter 有一个类似图表的概念,但只有 1 度的连接、关注者和追随者。另一方面,LinkedIn 在展示人们如何在第一学位之外建立联系方面蓬勃发展。这是两种不同的处理和数据需求,但都是“社交网络”。

如果你有一个“社交网络”但不做任何发现机制,那么你可以很容易地使用任何基本的键值存储。如果您需要高性能、横向扩展,并且需要二级索引或全文搜索,您可以使用Couchbase

如果您在收集的日志数据之上进行机器学习,您可以将 Hadoop 与 Hive 或 Pig 或 Spark/Shark 集成。或者你可以做一个 lambda 架构,并在 Storm 中使用许多不同的系统。

如果您通过图进行发现,例如超越 2 度顶点的查询并过滤边缘属性,您可能会考虑在主存储之上的图数据库。但是,图形数据库不是会话存储或通用存储的好选择,因此您需要一个多语言解决方案才能提高效率。

什么是数据速度?规模?你想如何管理它。您在公司或初创公司中拥有哪些专业知识。这不是一个简单的问题和答案的原因有很多。

于 2013-08-15T02:07:00.597 回答
2

针对数据库选择的简短有用的阅读:如何选择 NoSQL 数据库?. 我将强调这个答案中的关键点。

键值与面向文档

键值存储

如果您定义了明确的数据结构,以便所有数据都只有一个键,请选择键值存储。就像你有一个很大的 Hashtable,人们主要将它用于缓存存储或明确的基于键的数据。但是,当您需要根据多个键查询相同的数据时,事情就开始变得有些糟糕了!

一些键值存储是:memcachedRedisAerospike

关于围绕键值存储设计数据模型的两个重要事项是:

  • 您需要提前了解所有用例,并且如果不重新设计就无法更改数据中的可查询字段。
  • 请记住,如果您要在键值存储中围绕相同数据维护多个键,则对多个表/存储桶/集合/任何内容的更新都不是原子的。你需要自己处理这个问题。

面向文档

如果您刚刚离开 RDBMS 并希望将数据保持为对象方式并尽可能接近表式结构,那么文档结构就是要走的路!当您正在创建应用程序并且不想在早期(在原型设计阶段)处理 RDBMS 表设计并且您的架构可能会随着时间的推移而发生巨大变化时特别有用。但是请注意:

  • 二级索引可能表现不佳。
  • 交易不可用。

流行的面向文档的数据库有:MongoDBCouchbase

比较键值对 NoSQL 数据库

内存缓存

  • 内存缓存
  • 没有坚持
  • 支持 TTL
  • 仅客户端集群(客户端将值存储在多个节点)。通过客户端水平扩展。
  • 不适合大尺寸值/文档

雷迪斯

  • 内存缓存
  • 支持磁盘——从磁盘备份和重建
  • 支持TTL
  • 超快(见基准
  • 除了键值对数据结构的支持
  • 集群支持还不够成熟。垂直可扩展(请参阅Redis 集群规范
  • 水平缩放可能很棘手。
  • 支持二级索引

气钉

  • 内存和磁盘
  • 速度极快(单个节点可支持 >100 万 TPS)
  • 水平可扩展。服务器端集群。分片和复制数据
  • 自动故障转移
  • 支持二级索引
  • CAS(安全读-修改-写)操作,TTL 支持
  • 企业级

比较面向文档的 NoSQL 数据库

MongoDB

  • 快速地
  • 成熟稳定——功能丰富
  • 支持故障转移
  • 水平可扩展读取——从副本/辅助读取
  • 除非您使用 mongo 分片,否则写入不可水平扩展
  • 支持高级查询
  • 支持多个二级索引
  • 分片架构变得棘手,无法扩展超出您需要二级索引的程度。基本分片部署至少需要 9 个节点。
  • 如果您有非常高的写入率,文档级锁定是一个问题

Couchbase 服务器

  • 快速地
  • 分片集群代替mongodb的主从
  • 热故障转移支持
  • 水平可扩展
  • 通过视图支持二级索引
  • 学习曲线比 MongoDB 大
  • 声称更快
于 2018-10-03T09:48:29.197 回答