关于数据库的学习和拓展
数据库简介
数据库是数据管理的重要技术,也是计算机的重要分支。
数据库管理系统是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称 DBMS。
根据存储模型可将数据库划分为关系型数据库和非关系型数据.。
简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。标准数据查询语言 SQL 就是一种基于关系数据库的语言,这种语言执行对关系数据库中数据的检索和操作。
关系型数据库
Oracle:甲骨文开发的商业数据库,不开源,支持所有主流平台,性能好,功能强,稳定性好,安全性好,支持大数据量,比较复杂,收费昂贵。
SQL Server:微软开发的商业数据库,只能在 Windows 运行。
MySQL:甲骨文拥有的开源数据库,支持多种操作系统,体积小,功能弱些,简单的操作性能好,复杂的操作性能差些。
PostgreSQL:使用 BSD 协议的完全开源免费的项目,支持多种操作系统,功能更强大,可以和多种开源工具配合。
SQLite:开源、轻型、无服务器、零配置,一个数据库就只是一个文件,在应用程序内执行操作,占用资源小,可用于嵌入式或小型应用。
Microsoft Access、Sybase
应用场景
Oracle 多用于银行等高要求的领域,要求不高的比如互联网行业多用 MySQL 和 PostgreSQL,而 SQLite 用于嵌入式或作为应用程序内的数据库使用,SQL Server 用于 Window 服务器。相比于 SQL Server这样的企业级数据库管理系统,Microsoft Access更适合用于个人或小团队的本地数据库需求。适用于多种企业级应用和数据存储需求。Sybase具有高性能、可靠性和扩展性的特点,适合处理大规模和复杂的数据,被广泛用于各种行业和领域。
非关系型数据库
非关系型数据库是分布式的、非关系型的、不保证遵循ACID原则的数据存储系统。NoSQL最常见的解释是“non-relational”,“Not Only SQL”也被很多人接受。流行的NoSQL数据库有Couchbase,MongoDB,Redis,BigTable和RavenDB。
它们通常不使用固定的表格结构和SQL语言。非关系型数据库适用于需要处理大规模和动态的数据集合,以及需要更高的可伸缩性和性能的场景。
以下是一些常见的非关系型数据库类型:
- 文档型数据库(Document Store):以文档为单位存储数据,每个文档可以是JSON、XML等格式的数据。常见的文档型数据库有MongoDB和Couchbase。
- 键值存储数据库(Key-Value Store):使用键值对的形式存储数据,类似于字典或哈希表。适用于简单的数据读写操作。常见的键值存储数据库有Redis和Amazon DynamoDB。
- 列族存储数据库(Column-Family Store):数据按列族组织,适用于需要高度可扩展性的大规模数据存储。常见的列族存储数据库有Apache HBase和Cassandra。
- 图形数据库(Graph Database):用于存储图形结构的数据,适用于复杂的关系和图形分析。常见的图形数据库有Neo4j和Amazon Neptune。
- 对象存储数据库(Object Store):以对象为单位存储数据,适用于存储面向对象的数据模型。常见的对象存储数据库有Amazon S3和Alibaba Cloud OSS。
非关系型数据库的灵活性和可扩展性使其在大数据、分布式系统、实时数据处理和云计算等领域得到广泛应用。然而,选择适合的数据库类型应该根据具体的应用需求和数据特点来决定。
如何使用非关系型数据库
使用非关系型数据库时,可以使用多种编程语言进行数据库的设计和调用。不同的非关系型数据库可能有不同的官方支持的编程语言,但大多数非关系型数据库都提供了通用的API或驱动程序,可以在多种编程语言中使用。以下是一些常用的编程语言,用于设计和调用非关系型数据库:
- JavaScript/Node.js:对于前端Web开发和服务器端开发,JavaScript是一种常用的编程语言。在Node.js环境中,可以使用相应的数据库驱动程序来连接和操作非关系型数据库。
- Python:Python是一种通用编程语言,对于大多数非关系型数据库都有相应的第三方库或驱动程序。例如,对于MongoDB可以使用PyMongo库,对于Redis可以使用redis-py库。
- Java:Java是一种广泛使用的编程语言,在非关系型数据库领域也有很好的支持。许多非关系型数据库提供了Java的官方API或驱动程序,如MongoDB的Java驱动程序。
- C#:对于微软的非关系型数据库,如Azure Cosmos DB,可以使用C#来进行设计和调用。
- Ruby:Ruby是一种简洁优雅的编程语言,对于一些非关系型数据库也有相应的支持,如MongoDB的Mongoid库。
- Go:Go语言也逐渐在非关系型数据库领域得到应用,一些非关系型数据库提供了Go的驱动程序或库。
- PHP:PHP是一种用于Web开发的流行编程语言,对于一些非关系型数据库也有相应的支持。
需要注意的是,不同的非关系型数据库可能对不同编程语言提供了不同程度的支持,所以在选择数据库和编程语言时需要考虑它们之间的兼容性和易用性。同时,官方文档和社区资源可以提供有关在特定编程语言中使用特定非关系型数据库的更多信息和示例代码。
非关系型数据库的优缺点
优点 | 缺点 |
---|---|
1.易扩展 2.高性能3.数据类型灵活4.高可用 | 1.没有标准2.没有存储过程3.不支持sql4.功能不够完善 |
1、优点
- 易扩展
NoSQL数据库种类繁多,但是有一个共同的特点,都是去掉了关系型数据库的关系型特性。数据之间无关系,这样就非常容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。
- 大数据量,高性能
NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。一般MySQL使用Query Cache,每次表更新Cache就失效,是一种大粒度的Cache,针对web2.0的交互频繁的应用,Cache性能不高。而NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说性能就要高很多了。
- 灵活的数据模型
NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系型数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。这点在大数据量的web2.0时代尤其明显。
- 高可用
NoSQL在不太影响性能的情况下,就可以方便地实现高可用的架构。比如Cassandra、HBase模型,通过复制模型也能实现高可用。
2、缺点
- 没有标准
没有对NoSQL数据库定义的标准,所以没有两个NoSQL数据库是平等的。
- 没有存储过程
NoSQL数据库中大多没有存储过程。
- 不支持SQL
NoSQL大多不提供对SQL的支持:如果不支持SQL这样的工业标准,将会对用户产生一定的学习和应用迁移上的成本。
- 支持的特性不够丰富,产品不够成熟
现有产品所提供的功能都比较有限,不像MS SQL Server和Oracle那样能提供各种附加功能,比如BI和报表等。大多数产品都还处于初创期,和关系型数据库几十年的完善不可同日而语。
NoSQL与SQL的对比
RDBMS | NoSQL | |
---|---|---|
模式 | 预定义的模式 | 没有预定义的模式 |
查询语言 | 结构化查询语言(SQL) | 没有声明性查询语言 |
一致性 | 严格的一致性 | 最终一致性 |
事务 | 支持 | 不支持 |
理论基础 | ACID | CAP, BASE |
扩展 | 纵向扩展 | 横向扩展(分布式) |
注:
关系型数据库通过所谓结构化查询语言(也就是我们常说的SQL)来操作数据。SQL支持数据库CRUD(增加,查询,更新,删除)操作的功能非常强大,是业界标准用法。非关系型数据库以块(像文档一样)为单元操纵数据,使用所谓的非结构化查询语言(UnQL),它是没有标准的,因数据库提供商的不同而不同。关系型表中主键的概念对应非关系存储中的文档Id。SQL数据库使用预定义优化方式(比如列索引定义)帮助加速查询操作,而NoSQL数据库采用更简单而精确的数据访问模式。
分布式一致性的 3 种级别:
强一致性:系统写入了什么,读出来的就是什么。
弱一致性:不一定可以读取到最新写入的值,也不保证多少时间之后读取到的数据是最新的,只是会尽量保证某个时刻达到数据一致的状态。
最终一致性:弱一致性的升级版,系统会保证在一定时间内达到数据一致的状态。
SQL和NoSQL数据库最大的差别可能是在扩展方式上,要支持日益增长的需求当然要扩展。要支持更多并发量,SQL数据库是纵向扩展,也就是说提高处理能力,使用速度更快速的计算机,这样处理相同的数据集就更快了。因为数据存储在关系表中,操作的性能瓶颈可能涉及很多个表,这都需要通过提高计算机性能来客服。虽然SQL数据库有很大扩展空间,但最终肯定会达到纵向扩展的上限。而NoSQL数据库是横向扩展的。非关系型数据存储天然就是分布式的,NoSQL数据库的扩展可以通过给资源池添加更多普通的数据库服务器(节点)来分担负载。
RDBMS和NOSQL的技术差别参考: RDBMS和NOSQL的技术差别
ACID原则(四个特性)
ACID关系型数据库理论是指数据库管理系统(DBMS)在写入或更新资料的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性:原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)。
- A – Atomicity – 原子性
一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有被执行过一样。
- C – Consistency – 一致性
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
- I – Isolation – 隔离性
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
- D – Durability – 持久性
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
关系型数据库严格遵循ACID理论。但当数据库要开始满足横向扩展、高可用、模式自由等需求时,需要对ACID理论进行取舍,不能严格遵循ACID。以CAP理论和BASE理论为基础的NoSQL数据库开始出现。
CAP理论
CAP理论是分布式系统中的一个基本理论,它强调在分布式系统设计中无法同时满足三个属性:一致性(Consistency)、可用性(Availability)和分区容忍性(Partition Tolerance)。CAP理论的基础是来自Eric Brewer的原始观点,后来由Gilbert和Lynch正式提出。
- 一致性(Consistency):在分布式系统中,一致性指的是所有节点在同一时间具有相同的数据副本。当一个节点修改了数据后,其他所有节点都必须立即感知到这个改变,保证数据的一致性。
- 可用性(Availability):可用性表示系统在任何时候都能够对请求做出响应,而不会出现失败或延迟。即使一个或多个节点发生故障,系统仍然可以继续正常运行,确保数据的可用性。
- 分区容忍性(Partition Tolerance):分区容忍性指的是系统在面对网络故障或分区时,仍然能够继续正常运行。分布式系统的节点之间可能由于网络故障或延迟而无法相互通信,分区容忍性要求系统能够处理这种情况并保持正常运行。
CAP理论认为,在一个分布式系统中,无法同时满足三个属性,只能在一致性、可用性和分区容忍性中选择两个。这意味着在设计分布式系统时,必须权衡这三个属性之间的取舍,根据具体的应用场景和需求做出合理的选择。
在实际应用中,有些分布式系统更加强调一致性和可用性,而在面对网络分区时会出现暂时的不可用;有些分布式系统则更加注重可用性和分区容忍性,而在数据一致性方面可能会有一定的延迟。根据应用场景的不同,可以根据CAP理论做出合适的权衡和决策。
具体了解参考: 一文看懂|分布式系统之CAP理论
BASE理论
BASE理论是对CAP理论的一种扩展和补充,它是针对分布式系统的另一种设计思想。BASE是一个缩写,它代表着三个核心概念:
- 基本可用性(Basically Available):BASE理论认为,在分布式系统中,为了保证可用性,系统可以在某些时刻放弃一致性,即允许部分数据的不一致性或延迟。这意味着系统可以在出现故障或分区的情况下仍然保持可用,响应用户的请求,而不是拒绝服务。
- 响应时间上的损失:正常情况下,处理用户请求需要 0.5s 返回结果,但是由于系统出现故障,处理用户请求的时间变为 3s。
- 系统功能上的损失:正常情况下,用户可以使用系统的全部功能,但是由于系统访问量突然剧增,系统的部分非核心功能无法使用。
- 软状态(Soft state):BASE理论中的"软状态"表示系统中的数据状态可以随着时间而变化,而不是像传统的ACID数据库那样维持严格的一致性。分布式系统可能由于节点间的通信延迟或故障导致数据状态的变化,并且这些状态变化是可以被接受的。
- 最终一致性(Eventually Consistent):BASE理论认为最终一致性是一个更实际的目标,它并不要求系统在每一时刻都保持强一致性,而是要求在一段时间内系统最终能够达到一致的状态。在分布式系统中,数据更新可能需要一定的时间来传播到所有节点,而最终一致性允许在短暂的时间窗口内出现部分数据不一致,但最终会收敛到一致的状态。
BASE理论强调在分布式系统中可以通过放宽一致性的要求来提高系统的可用性和性能。它适用于那些对一致性要求相对较低、对可用性和性能要求较高的场景,如大规模的互联网应用、分布式缓存系统和实时数据处理系统等。
与ACID理论不同,BASE理论是一种更加宽松的一致性模型,适用于更复杂和高并发的分布式环境。根据具体的应用需求和系统规模,可以根据CAP理论和BASE理论来选择合适的设计方案和数据库技术。
分布式系统
分布式系统是计算机程序的集合,这些程序利用跨多个独立计算节点的计算资源来实现共同的目标。它也被称为分布式计算或分布式数据库,并依靠不同的节点通过公共网络进行通信和同步。这些节点通常代表独立的物理硬件设备,但也可代表单独的软件进程或其他递归封装的系统。分布式系统旨在消除系统的瓶颈或中心故障点。
分布式计算系统具有如下特点:
资源共享 — 分布式系统可以共享硬件、软件或数据 并行处理 — 多台机器可以同时处理同一功能 支持扩展 — 当扩充到其他计算机时,计算和处理能力可以按需进行扩展 错误检测 — 可以更轻松地检测故障 公开透明 — 节点可以访问系统中的其他节点并与之通信
分布式系统相对的是集中式系统。所谓集中式计算系统,是指所有计算都由位于同一位置的单台计算机来执行。集中式和分布式系统的主要区别在于系统节点之间的通信模式。集中式系统的状态控制在中央节点内,客户端以定制方式访问此节点。集中式系统的各个节点都要访问此中央节点,因此可能会导致网络拥塞和速度缓慢。集中式系统存在单点故障,而分布式系统则没有单点故障。
区块链
区块链起源
区块链起源于比特币,2008年11月1日,一位自称中本聪(Satoshi Nakamoto)的人发表了《比特币:一种点对点的电子现金系统》一文 ,阐述了基于P2P网络技术、加密技术、时间戳技术、区块链技术等的电子现金系统的构架理念,这标志着比特币的诞生。两个月后理论步入实践,2009年1月3日第一个序号为0的创世区块诞生。几天后2009年1月9日出现序号为1的区块,并与序号为0的创世区块相连接形成了链,标志着区块链的诞生。
概念定义
狭义区块链是按照时间顺序,将数据区块以顺序相连的方式组合成的链式数据结构,并以密码学方式保证的不可篡改和不可伪造的分布式账本。
广义区块链技术是利用块链式数据结构验证与存储数据,利用分布式节点共识算法生成和更新数据,利用密码学的方式保证数据传输和访问的安全、利用由自动化脚本代码组成的智能合约,编程和操作数据的全新的分布式基础架构与计算范式。
区块链类型
公有区块链(Public Block Chains):世界上任何个体或者团体都可以发送交易,且交易能够获得该区块链的有效确认,任何人都可以参与其共识过程。公有区块链是最早的区块链,也是应用最广泛的区块链,各大bitcoins系列的虚拟数字货币均基于公有区块链,世界上有且仅有一条该币种对应的区块链 。
行业区块链(Consortium Block Chains):由某个群体内部指定多个预选的节点为记账人,每个块的生成由所有的预选节点共同决定(预选节点参与共识过程),其他接入节点可以参与交易,但不过问记账过程(本质上还是托管记账,只是变成分布式记账,预选节点的多少,如何决定每个块的记账者成为该区块链的主要风险点),其他任何人可以通过该区块链开放的API进行限定查询 。
私有区块链(Private Block Chains):仅仅使用区块链的总账技术进行记账,可以是一个公司,也可以是个人,独享该区块链的写入权限,本链与其他的分布式存储方案没有太大区别。传统金融都是想实验尝试私有区块链,而公链的应用例如bitcoin已经工业化,私链的应用产品还在摸索当中 。
架构模型
一般说来,区块链系统由数据层、网络层、共识层、激励层、合约层和应用层组成 。 其中,数据层封装了底层数据区块以及相关的数据加密和时间戳等基础数据和基本算法;网络层则包括分布式组网机制、数据传播机制和数据验证机制等;共识层主要封装网络节点的各类共识算法;激励层将经济因素集成到区块链技术体系中来,主要包括经济激励的发行机制和分配机制等;合约层主要封装各类脚本、算法和智能合约,是区块链可编程特性的基础;应用层则封装了区块链的各种应用场景和案例。该模型中,基于时间戳的链式区块结构、分布式节点的共识机制、基于共识算力的经济激励和灵活可编程的智能合约是区块链技术最具代表性的创新点 。
参考资料: 百度区块链