每种类型数据库的实际示例(真实案例)[关闭]
Posted
技术标签:
【中文标题】每种类型数据库的实际示例(真实案例)[关闭]【英文标题】:Practical example for each type of database (real cases) [closed] 【发布时间】:2013-08-14 11:18:24 【问题描述】:有多种类型的数据库用于不同的目的,但通常 mysql 用于所有用途,因为它是最知名的数据库。举个例子,我公司一个大数据的应用,初期有一个MySQL数据库,难以置信,会给公司带来严重的后果。为什么选择 MySQL?只是因为没有人知道应该如何(以及何时)使用另一个 DBMS。
所以,我的问题不是关于供应商,而是关于数据库的类型。你能给我一个具体情况(或应用程序)的实际例子吗?强烈建议在哪些类型的数据库中使用它?
示例:
• 由于 Y,社交网络应该使用类型 X。
• MongoDB 或 couch DB 不支持交易,因此 Document DB 不适用于银行或拍卖网站的应用程序。
等等……
关系: MySQL, PostgreSQL, SQLite, Firebird, MariaDB, Oracle DB, SQL server, IBM DB2, @9876543329@, @9876 @
对象: ZODB、DB4O、Eloquera、Versant、Objectivity DB、VelocityDB
图形数据库:AllegroGraph、Neo4j、OrientDB、InfiniteGraph、graphbase、sparkledb、flockdb、BrightstarDB
键值存储: Amazon DynamoDB、Redis、Riak、Voldemort、FoundationDB、leveldb、BangDB、KAI、hamsterdb 、Tarantool、Maxtable、HyperDex、Genomu、Memcachedb
列族:Big table、Hbase、hyper table、Cassandra、Apache Accumulo
RDF 商店: Apache Jena, Sesame
多模型数据库: arangodb、Datomic、Orient DB、FatDB、AlchemyDB
文档: Mongo DB, Couch DB, Rethink DB, Raven DB, terrastore, Jas DB, Raptor DB, djon DB, denso DB, @987654 @, Couchbase
XML 数据库: BaseX、Sedna、eXist
层次结构: InterSystems Caché, GT.M 感谢@Laurent Parenteau
【问题讨论】:
对于分层键值,您有 GT.M 和 InterSystems Caché。 @LaurentParenteau 谢谢,问题已更新。 您忘记了 Oracle 和 SQL Server,它们是企业类型应用程序最常见的两个关系数据库。 @HLGEM 已更新,还添加了 maria DB。 【参考方案1】:特定于数据库选择的简短有用的读取:How to choose a NoSQL Database?。我将突出显示此答案中的关键点。
键值与面向文档
键值对存储
如果您定义了清晰的数据结构,以便所有数据都只有一个键,请选择键值存储。就像你有一个很大的 Hashtable,人们主要将它用于缓存存储或明确的基于键的数据。但是,当您需要根据多个键查询相同的数据时,事情就开始变得有些糟糕了!
一些键值存储是:memcached、Redis、Aerospike。
围绕键值存储设计数据模型的两个重要事项是:
您需要提前了解所有用例,如果不重新设计,您将无法更改数据中的可查询字段。 请记住,如果您要在键值存储中围绕相同数据维护多个键,则对多个表/存储桶/集合/任何内容的更新都不是原子的。您需要自己处理。面向文档
如果您刚刚离开 RDBMS,并且希望以对象方式保存数据并尽可能接近表式结构,那么文档结构就是您的最佳选择!当您正在创建一个应用程序并且不想在早期(在原型设计阶段)处理 RDBMS 表设计并且您的架构可能会随着时间的推移而发生巨大变化时特别有用。但请注意:
二级索引可能表现不佳。 交易不可用。流行的面向文档的数据库有:MongoDB、Couchbase。
比较键值对 NoSQL 数据库
内存缓存
内存缓存 没有持久性 支持 TTL 仅限客户端集群(客户端将值存储在多个节点)。通过客户端水平扩展。 不适合大尺寸值/文档Redis
内存缓存 支持磁盘 - 从磁盘备份和重建 TTL 支持 超快(见benchmarks) 除了键值对数据结构的支持 集群支持还不够成熟。垂直可扩展(请参阅Redis Cluster specification) 水平缩放可能很棘手。 支持Secondary indexesAerospike
内存和磁盘 极快(单个节点上可支持 >100 万 TPS) 水平可扩展。服务器端集群。分片和复制数据 自动故障转移 支持Secondary indexes CAS(安全读取-修改-写入)操作,TTL 支持 企业类比较面向文档的 NoSQL 数据库
MongoDB
快速 成熟稳定——功能丰富 支持故障转移 水平可扩展读取 - 从副本/辅助读取 除非您使用 mongo 分片,否则写入不可水平扩展 支持高级查询 支持多个二级索引 分片架构变得棘手,无法扩展超出需要二级索引的程度。基本分片部署至少需要 9 个节点。 如果您的写入率非常高,文档级锁会成为问题Couchbase 服务器
快速 分片集群代替mongodb的主从 热故障转移支持 水平扩展 通过视图支持二级索引 学习曲线比 MongoDB 更大 声称更快【讨论】:
【参考方案2】:我发现了两篇关于这个主题的令人印象深刻的文章。所有功劳归于 highscalability.com。此答案中的信息转录自这些文章:
35+ Use Cases For Choosing Your Next NoSQL Database
What The Heck Are You Actually Using NoSQL For?
如果您的应用程序需要...
• 复杂事务,因为您不能承受丢失数据的损失,或者如果您想要一个简单的事务编程模型,那么请查看关系或网格数据库。
• 示例:可能需要完整的库存系统ACID。当我买一个产品时我很不高兴,他们后来说他们缺货了。我不想要有偿交易。我想要我的物品!
• 规模化 然后 NoSQL 或 SQL 可以工作。寻找支持横向扩展、分区、实时添加和删除机器、负载平衡、自动分片和重新平衡以及容错的系统。
•始终能够写入到数据库,因为您需要高可用性,然后查看具有最终一致性的Bigtable克隆。
• 处理大量小型连续读取和写入,这可能是易失性的,然后查看提供快速内存访问的文档或键值或数据库。另外,请考虑SSD。
• 要实现社交网络操作,您可能首先需要一个图形数据库,或者第二个,像Riak 这样支持关系的数据库。具有简单 SQL 连接的内存中关系数据库可能足以处理小型数据集。 Redis' 设置和列表操作也可以工作。
• 要对各种访问模式和数据类型进行操作,然后查看文档数据库,它们通常很灵活且性能良好。
• 强大的大型数据集离线报告然后看看Hadoop 第一和第二,支持MapReduce 的产品。支持 MapReduce 不等于擅长它。
• 要跨越多个数据中心,然后查看Bigtable 克隆和其他提供分布式选项的产品,这些产品可以处理长延迟并且是partition tolerant。
• 构建 CRUD 应用程序然后查看文档数据库,它们可以轻松访问复杂数据而无需连接。
• 内置搜索然后查看Riak。
• 操作数据结构,如列表、集合、队列、发布-订阅,然后查看Redis。对分布式锁定、封顶日志等很有用。
• 程序员友好性以对程序员友好的数据类型(如 JSON、HTTP、REST、javascript)的形式出现,然后首先查看文档数据库,然后查看键值数据库。
• 事务结合物化视图用于实时数据馈送,然后查看VoltDB。非常适合数据汇总和time windowing。
• 企业级支持和 SLA 然后寻找能够满足该市场需求的产品。 Membase 就是一个例子。
• 记录可能根本不需要一致性保证的连续流数据,然后查看Bigtable 克隆,因为它们通常在可以处理大量写入的分布式文件系统上工作。
•尽可能简单操作,然后寻找托管或PaaS 解决方案,因为他们会为您完成所有工作。
• 出售给企业客户,然后考虑使用关系数据库,因为他们习惯于关系技术。
• 在具有动态属性的对象之间动态建立关系,然后考虑使用图形数据库,因为它们通常不需要模式,并且可以通过编程逐步建立模型。
• 要支持大型媒体,请查看S3 之类的存储服务。 NoSQL 系统倾向于不处理大的BLOBS,尽管MongoDB 有文件服务。
• 快速有效地批量上传大量数据,然后寻找支持该方案的产品。大多数不会,因为它们不支持批量操作。
• 更简单的升级路径然后使用文档数据库或键值数据库等流动模式系统,因为它支持可选字段、添加字段和删除字段,而无需构建整个架构迁移框架。
• 实现完整性约束,然后选择支持 SQL DDL 的数据库,在存储过程中实现它们,或者在应用程序代码中实现它们。
• 非常深的连接深度然后使用图形数据库,因为它们支持实体之间的极快导航。
• 移动行为接近数据,这样数据就不必通过网络移动,然后查看一种或另一种存储过程。这些可以在关系、网格、文档甚至键值数据库中找到。
• 缓存或存储 BLOB 数据,然后查看键值存储。缓存可以用于一些网页,或者保存复杂的对象,这些对象在加入关系数据库时成本很高,可以减少延迟等等。
• 经过验证的跟踪记录,例如不破坏数据并且正常工作,然后选择成熟的产品,当您遇到扩展(或其他问题)时,使用常见的解决方法之一(扩展、调整、memcached、sharding、denormalization 等)。
• 流动数据类型,因为您的数据本质上不是表格,或者需要灵活数量的列,或者具有复杂的结构,或者因用户(或其他)而异,然后查看文档、键值和Bigtable 克隆数据库。每个人的数据类型都有很大的灵活性。
• 其他业务部门运行快速关系查询,这样您就不必重新实现所有内容,然后使用支持 SQL 的数据库。
• 要在云中运行并自动充分利用云功能,那么我们可能还没有。
• 支持二级索引,因此您可以通过不同的键查找数据,然后查看关系数据库和Cassandra 的新secondary index 支持。
• 创建一个不断增长的数据集(真的是BigData),很少被访问,然后查看Bigtable Clone,它将数据分布在分布式文件系统上。
• 与其他服务集成,然后检查数据库是否提供某种后写同步功能,以便您可以捕获数据库更改并将其馈送到其他系统以确保一致性。
• 容错检查在电源故障、分区和其他故障情况下写入的持久性。
• 将技术封套推向一个似乎没人会走的方向,然后自己构建它,因为有时这就是伟大的需要。
• 在移动平台上工作,然后查看 CouchDB/Mobile couchbase。
一般用例 (NoSQL)
• 巨大。 NoSQL 被视为支持新数据堆栈的关键部分:大数据、大量用户、大量计算机、大供应链、大科学等等。当某些东西变得如此庞大以至于必须大规模分布时,NoSQL 就在那里,尽管并非所有 NoSQL 系统都以大为目标。 Bigness 可以跨越许多不同的维度,而不仅仅是使用大量的磁盘空间。
• 大量写入性能。这可能是基于 Google 影响的规范用法。高音量。 Facebook 需要存储135 billion messages a month(2010 年)。例如,Twitter 存在存储7 TB/data per day (2010 年) 的问题,而且这一要求每年会翻倍。这是数据太大而无法容纳一个节点的问题。以 80 MB/s 的速度存储 7TB 需要一天的时间,因此写入需要分布在集群上,这意味着键值访问、MapReduce、复制、容错、一致性问题等等。为了更快的写入,可以使用内存系统。
• 快速键值访问。这可能是 NoSQL 在一般思维模式中被引用次数第二多的优点。当延迟很重要时,很难在键上散列并直接从内存中读取值,或者只需一次磁盘查找。并非每个 NoSQL 产品都与快速访问有关,例如,有些产品更注重可靠性。但人们长期以来一直想要的是更好的 memcached,许多 NoSQL 系统都提供了。
• 灵活的模式和灵活的数据类型。 NoSQL 产品支持一系列新的数据类型,这是 NoSQL 的一个主要创新领域。我们有:面向列、图形、高级数据结构、面向文档和键值。无需大量映射即可轻松存储复杂对象。开发人员喜欢避免复杂的模式和ORM 框架。缺乏结构允许更大的灵活性。我们还有对程序和程序员友好的兼容数据类型,例如 JSON。
• 架构迁移。 无架构使处理架构迁移变得更容易,而无需过多担心。架构在某种意义上是动态的,因为它们是由应用程序在运行时强加的,因此应用程序的不同部分可以有不同的架构视图。
• 写作可用性。无论如何,您的写作都需要成功吗?然后我们可以进入分区,CAP,eventual consistency 和所有爵士乐。
• 更易于维护、管理和操作。这是非常特定于产品的,但许多 NoSQL 供应商正试图通过让开发人员轻松采用它们来获得采用。他们在易用性、最少的管理和自动化操作上花费了大量精力。这可以降低运营成本,因为不必编写特殊代码来扩展从未打算以这种方式使用的系统。
• 没有单点故障。 并非每个产品都提供这一点,但我们看到了在相对容易配置和管理高可用性方面的明显融合,以及自动负载平衡和集群调整。完美的云合作伙伴。
• 普遍可用的并行计算。我们看到 MapReduce 已融入产品,这使得并行计算成为未来发展的常态。
• 程序员易于使用。 访问您的数据应该很容易。虽然关系模型对于最终用户(如会计师)来说是直观的,但对于开发人员来说却不是很直观。程序员了解键、值、JSON、Javascript 存储过程、HTTP 等等。 NoSQL 适用于程序员。这是一场由开发商主导的政变。对数据库问题的回应并不总是聘请真正知识渊博的DBA,正确设置架构,进行一些非规范化等等,程序员更喜欢他们可以为自己工作的系统。让产品发挥作用应该不难。钱是问题的一部分。如果扩展一个产品的成本很高,那么你会不会选择更便宜、你可以控制、更容易使用、更容易扩展的产品?
• 为正确的问题使用正确的数据模型。不同的数据模型用于解决不同的问题。例如,已经付出了很多努力,将图操作嵌入到关系模型中,但它不起作用。在图数据库中解决图问题不是更好吗?我们现在看到了一种试图在问题和解决方案之间找到最佳匹配的一般策略。
• 避免碰壁。 许多项目在其项目中碰壁。他们已经用尽了所有选项来使他们的系统扩展或正常运行,并且想知道下一步是什么?选择一种产品和一种方法,可以通过使用增量添加的资源进行线性扩展来跳过墙壁,这是令人欣慰的。有一次这是不可能的。一切都需要定制,但这已经改变了。我们现在看到了项目可以轻松采用的可用的开箱即用产品。
• 分布式系统支持。 并不是每个人都担心非 NoSQL 系统所能达到的规模或性能。他们需要的是一个分布式系统,它可以跨越数据中心,同时处理故障场景而不会出现问题。 NoSQL 系统,因为它们专注于规模,倾向于利用分区,倾向于不使用严格的一致性协议,因此非常适合在分布式场景中运行。
• Tunable CAP tradeoffs. NoSQL 系统通常是唯一带有“滑块”的产品,用于选择他们想要在 CAP 范围内的哪个位置。关系数据库选择强一致性,这意味着它们不能容忍分区故障。最后,这是一个商业决定,应该根据具体情况来决定。你的应用甚至关心一致性吗?几滴可以吗?您的应用需要强一致性还是弱一致性?可用性更重要还是一致性更重要?失败会比犯错更昂贵吗?很高兴拥有可以让您选择的产品。
• 更具体的用例
• 管理大量非事务性数据流:Apache 日志、应用程序日志、MySQL 日志、点击流等。
• 同步在线和离线数据。这是CouchDB 所针对的利基市场。
• 在所有负载下的快速响应时间。
• 当复杂连接的查询负载对于RDBMS 而言太大时,避免使用繁重的连接。
• 低延迟至关重要的软实时系统。游戏就是一个例子。
• 需要支持各种不同的写入、读取、查询和一致性模式的应用程序。有些系统针对 50% 读取、50% 写入、95% 写入或 95% 读取进行了优化。只读应用程序需要极快的速度和弹性、简单的查询,并且可以容忍稍微陈旧的数据。需要中等性能、读/写访问、简单查询、完全权威数据的应用程序。具有复杂查询要求的只读应用程序。
• 负载平衡以适应数据和使用集中并帮助保持微处理器忙碌。
• 实时插入、更新和查询。
• 分层数据,如线程讨论和部件爆炸。
• 动态表创建。
• 两层应用程序,其中低延迟数据通过快速 NoSQL 接口提供,但数据本身可以由高延迟 Hadoop 应用程序或其他低优先级应用程序计算和更新。
• 顺序数据读取。 需要选择正确的底层数据存储模型。 B 树可能不是顺序读取的最佳模型。
• 将可能需要更好性能/可扩展性的部分服务分割到自己的系统上。例如,用户登录可能需要高性能,并且此功能可以使用专用服务来实现这些目标。
• 缓存。 用于网站和其他应用程序的高性能缓存层。示例是大型强子对撞机使用的数据聚合系统的缓存。 投票。
• 实时页面查看计数器。
• 用户注册、个人资料和会话数据。
• 文档、目录管理和内容管理系统。 将复杂文档存储为一个整体而不是组织为关系表的能力有助于实现这些。类似的逻辑适用于库存、购物车和其他结构化数据类型。
• 存档。 存储仍可在线访问的大量连续数据流。具有灵活架构的面向文档的数据库,可以处理架构随时间的变化。
• 分析。使用 MapReduce、Hive 或 Pig 执行支持高写入负载的分析查询和横向扩展系统。
• 使用heterogeneous types of data,例如,通用级别的不同媒体类型。
• 嵌入式系统。他们不想要 SQL 和服务器的开销,因此他们使用更简单的存储方式。
• 一个“市场”游戏,您可以在其中拥有城镇中的建筑物。你想让某人的建筑列表快速弹出,所以你在建筑表的所有者列上进行分区,这样选择是单分区的。但是,当有人购买其他人的建筑物时,您会更新所有者列以及价格。
• JPL 正在使用SimpleDB 存储rover 计划属性。引用保留在S3 中的完整计划 blob。 (source)
• 联邦执法机构tracking Americans in real-time 使用信用卡、会员卡和旅行预订。
• Fraud detection 通过实时比较交易与已知模式。
• Helping diagnose 通过整合每位患者的病史来确定肿瘤的类型。
• 用于高更新情况的内存数据库,例如website,它显示每个人的“最后一次活动”时间(可能用于聊天)。如果用户每 30 秒执行一次活动,那么您将几乎达到您的极限,同时有大约 5000 个用户。
• 使用物化视图处理低频多分区查询,同时继续处理高频流数据。
• 优先队列。
• 使用程序友好的界面对缓存数据运行计算,无需通过ORM。
• Uniq a large dataset 使用简单的键值列。
• 为了保持快速查询,可以将值汇总到不同的时间片中。
• 计算两个大集合的交集,其中连接会太慢。
• 一个timeline ala Twitter。
Redis 用例、VoltDB 用例等find here。
【讨论】:
很遗憾这篇文章没有提示何时使用 Datomic。当您需要灵活的模式并且厌倦了使用 NoSQL 进行权衡时,您可能会发现它很有用,因为它是事务性的,具有完整的 ACID 语义,并且始终保持一致。此外,当您使用历史数据时,因为 Datomic 不是就地更新系统。默认情况下保留所有数据。这意味着您可以轻松地对过去进行查询,并拥有完整的审计能力。 Firebase Realtime Database 擅长在移动设备(android / ios)上同步在线和离线数据。【参考方案3】:由于笼统,这个问题几乎不可能回答。我认为您正在寻找某种简单的答案问题=解决方案。问题是每个“问题”随着它成为一项业务而变得越来越独特。
什么叫社交网络?推特? Facebook?领英?堆栈溢出?他们都对不同的部分使用不同的解决方案,并且可以存在许多使用多语言方法的解决方案。 Twitter 有一个类似图表的概念,但只有 1 度的连接、关注者和追随者。另一方面,LinkedIn 在展示人们如何在第一学位之外建立联系方面蓬勃发展。这是两种不同的处理和数据需求,但都是“社交网络”。
如果您有一个“社交网络”但不使用任何发现机制,那么您很可能可以轻松使用任何基本的键值对存储。如果您需要高性能、横向扩展,并且需要二级索引或全文搜索,您可以使用Couchbase。
如果您在收集的日志数据之上进行机器学习,您可以将 Hadoop 与 Hive 或 Pig 或 Spark/Shark 集成。或者你可以做一个 lambda 架构,并在 Storm 中使用许多不同的系统。
如果您通过图查询进行发现,这些查询超出了 2 度顶点并且还过滤了边属性,您可能会考虑将图数据库放在您的主存储之上。但是,图形数据库不是会话存储或通用存储的好选择,因此您需要一个多语言解决方案才能提高效率。
什么是数据速度?规模?你想如何管理它。您在公司或初创公司中拥有哪些专业知识。这不是一个简单的问题和答案的原因有很多。
【讨论】:
这是一个很好的参考/阅读:amazon.com/NoSQL-Distilled-Emerging-Polyglot-Persistence/dp/…,它可能不足以给你确切的答案,但它会让你很好地理解你的问题以上是关于每种类型数据库的实际示例(真实案例)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章