丹凤千字科普:mysql数据库类型有哪些如何选择合适的数据类型(详细资料介绍)

无论您是初次构建应用程序,还是已经有过数十个项目的经验,选择数据库始终是一个充满挑战的任务。这可能是您做出的第一个重要决策,也可能是您在应用程序中根深蒂固的一个决策。由于存在大量优秀的数据库以及丰富的现成信息,这只会使任务更加艰巨。
近期我们的项目进展以及对发展速度的强烈追求,推动我们向事件驱动的架构转变,这为采纳新技术提供了大量的机会。对于当前的项目,我们需要在集成多个第三方系统的环境中选择一个数据库,这些系统将会返回不同的元数据并促进大量交易。
我将简要介绍常见的数据库类型、它们的用途以及选择数据库时一些常被忽视但重要的考量因素。
一、数据库的主要类型
1. 关系型数据库(RDBMS)
例如:PostgreSQL、MySQL、Oracle DB。关系型数据库是最常用的数据库类型。数据被在表格中,它们之间可以通过外键定义关系。SQL查询语言允许你查询这些表并将它们连接起来,以适合你要求的格式有效地检索数据。
图1:关系型数据库中表的示例。
关系型数据库确保了ACID交易特性,这意味着数据的完整性总是被保留下来。当数据的一致性和稳定性是行为要求的重要组成部分时,关系型数据库是完美的。这种稳定性是以灵活性为代价的。
其缺点在于,在需要大量交易或数据库的地理位置非常重要时,性能的可扩展性可能受到限制。为了扩展关系型数据库的性能,通常需要增加计算能力进行垂直扩展,但这有其局限性。除此之外,还需要引入分片、缓存和读取副本的使用,但这增加了复杂性。
关系型数据库的完美用例是当数据一致性要求较高且关系定义良好的情况。例如,电子商务平台的报告系统,包括客户、订单、付款和产品的表格,将是关系型数据库的完美候选者。
2. 图数据库
例如:Amazon Neptune, Neo4j。图形数据库使用节点(定义存储的数据)和边(存储节点之间的关系)来定义。这种关系的存储使得连接数据集非常快,而关系型数据库在查询时可能需要计算这些数据,使得过程变慢。
图2:图数据库简化示例。
利用图形数据库的独特功能需要一种优化的查询语言,如Cypher、SparQL和Gremlin等。这些查询语言采用模式匹配来提取数据。例如,如果想直接查询Rob认识的人,一个查询可以是:“MATCH (a:Person {name: “Rob”})-[:KNOWS]->(b)。RETURN b”。直观地说,图形数据库非常适合于存储事物之间的联系数据,如社交网络上的朋友、广告展示或欺诈检测等。相反,它们不太适合存储如交易历史等需要高频率读写的事务数据。
3. 文档数据库
例如:MongoDB, CouchDB, ElasticSearch。文档数据库通常将数据存储为结构化的嵌套文档(如JSON/BSON),这意味着它们直观地对应于你代码中的对象。这些文档存储在集合中,类似于关系数据库中的行和表。文档数据库允许你使用灵活的模式来存储半结构化的信息,并可以轻松地更新以适应不断变化的需求。这是与关系型数据库的主要区别之一,后者需要一个SQL语句来更新模式。这种灵活性使文档数据库非常适合于存储可能有不同内容的东西,如产品信息或客户详情。
大多数文档数据库支持连接功能,由于其设计方式,通常不建议这样做。例如,在关系型数据库中,客户和客户的联系方式通常会被存储在两个独立的表中,但在文档数据库中,你会利用分层结构将它们存储在一个文档中。大多数文档数据库也支持ACID事务和水平扩展。MongoDB还支持强一致性(线性化),这总是很有用。
4. 键/值数据库
例如:Redis, Berkeley DB。键/值存储是概念上最简单的数据库;它是一种非关系型数据库,其中的值是针对键来存储的。这些值可以是简单的单项数据或更复杂的对象。尽管键/值数据库的灵活性较低,但这导致了更好的读写性能。当你知道你要查询什么时,它们是最好用的。然后,找到一个已知的键的信息是非常快的,如果你需要通过一个非主键进行查询,这就变得更加困难了。键/值数据库的使用情况与文档数据库非常相似;用户、会话数据或简单的缓存数据等应用场景都非常适合使用键/值数据库。它们通常也支持横向扩展。宽列数据库宽列数据库是专为处理大量数据而设计的它们通过列分割来避免查询大数据的问题当需要查询时只检索所需的列这样做的好处是一个分区列的稀疏矩阵包含一个单一的数据类型宽列或存储行的列族而这些行又有嵌套的列和值其内部这样的设计允许在数据库内有很高的灵活性一行不一定要使用所有的列这意味着不同的行可以由不同的列组成宽列数据库对于诸如数据记录报告甚至消息服务都非常棒比如Discord从MongoDB迁移到Apache Cassandra的精彩文章他们的最佳用例是当有可预测的查询模式高写入和低读取频率的要求稀疏矩阵设计允许数据库内有很高的灵活性不同的行可以有不同的列组合选择数据库时需要考虑的因素CAP和ACID中的C非常不同这并不是特别重要我经常看到这两个概念被混淆那就是CAP和ACID中的
