数据库基本概念

数据库系统是什么?数据库系统(Database management system,DBMS),由一个互相关联的数据集合和一组访问这些数据的程序组成。数据库系统一般用于企业级业务需求,满足企业业务数据有效存储,更新,检索及信息价值挖掘。因此,数据库系统应当满足高效的存取数据,保证数据稳定性可靠性安全性

数据库系统有哪些优点?相对于传统的纸质存储,或个人电脑由操作系统内的文件处理系统,数据库系统在数据存储和管理上更方便,可靠。具体而言,数据库系统的优势体现在以下几点:

  • 解决文件冗余不一致:一份文件多次修改后存在多个版本,数据冗余且存储更新延时,数据库系统基于更新时间保存最新数据
  • 提供便捷数据访问途径:跨校区跨地域数据存储,无法快速获取需要数据,DBMS 对数据统一管理,提供统一访问接口
  • 提供数据安全保障:为特定用户授予特定权限,保障数据安全性
  • 容忍并发访问异常:允许多用户同时访问或修改同一份数据,保证数据一致性
  • 解决数据孤立问题:对跨地域,跨业务的数据统一管理,构建关系,整合数据
  • 提供完整数据:数据库中的值必须满足特定约束,如账户金额不能小于零等

如何设计数据库系统?数据库系统的核心功能是存储,检索数据,及保证数据存储和安访问全可靠。为了提供数据存储和检索功能需求,数据库系统结构可以分为3个部分:

  • 抽象视图层:提供给用户的只是一部分数据的抽象视图,视图之下由逻辑层和物理层支持
  • 逻辑层:描述数据以何种关系存储,存储哪些数据(属性)
  • 物理层:负责数据在磁盘上以何种方式存储,采用哪种数据结构存储

数据库系统设计,是关于数据模式(Data Schema)的设计,是对以上三个部分的模式设计,包括物理模式,逻辑模式及视图层子模式设计。其中逻辑模式是程序员开发应用程序的重要参考,因此是三者中最为重要的一个。

数据模型(data model)和数据模式的区别?数据模式是关于数据库系统的总体设计,数据库模式会发生变化,但通常变化不频繁。数据模型则是一个描述数据,数据联系,数据语义及一致性约束的概念工具的集合,提供了一个描述物理层,逻辑层和视图层的数据库设计方式。常见的数据模型包括,

  • 关系模型(relation model):用表的集合表示数据与数据间的关系,是目前应用最广的数据模型
  • 实体-联系模型(entity-relation model):基于实体-联系-实体描述现实世界,实体是现实世界可区别其他对象的一件“事情”或一个“物体”。如图数据库的节点与关系。
  • 基于对象的数据模型(object-based data model):与面向对象的编程语言一同发展的一种数据模型,可以看成是E-R模型的扩展,增加了方法(函数)和对象标识及封装等概念。
  • 半结构化数据模型(semistructured data model):允许相同类型的数据项拥有不同的属性集,可扩展标记语言XML 被广泛用于表示半结构化数据。

数据库发展历程

当前哪种数据库产品最为流行?权威数据库系统排名网站DB-Engine 基于数据给出了排名。基于排名算法,对各个数据库进行打分,关系型数据库Oracle 稳居第一。除了前四名的关系型数据库外,非关系型文档数据库MongoDB 排名第五,紧随其后的是非关系型KV型 数据库Redis。

从数据库流行度可以发现,非关系型数据库仍然是市场的主流数据库产品,但同时也有多种不同类型的非关系型数据库位列榜单。
image.png
https://db-engines.com/en/ranking

相较于已经发展了近40年的关系型数据库,非关系型数据库的发展只有不到20年,但它们却在大数据时代,发挥重要作用。数据库的发展历程中,重要的时间节点及相关产品的面世可以概括如下:

  • 1950-1960,磁带为信息存储提供了新的方式,但是只能顺序访问,若访问指定位置的信息,需从头读取,效率低下
  • 1960-1970,磁盘随机访问方式,极大地提高了数据访问效率;同时1970年,IBM 研究员Edgar F. Codd 发表了一篇名为“A Relational Model of Data for Large Shared Data Banks”,定义了关系模型和在关系模型中查询数据的非过程化方法,奠定了关系型数据库基础,他本人在1981年也因此获得ACM 图灵奖。
  • 1980-1990,IBM 推出了System R,开发了能构造高效的关系型数据库系统的技术,也因此催生了第一个关系型数据库产品SQL/DS 问世。因为关系型数据库简单,程序员只需了解逻辑层架构,底层工作完全由数据库自动完成,因而比层次型/网状型数据库更加高效,后来也逐渐取代后者,在数据模型中独占鳌头。
  • 1993年,Edgar F. Codd 提出OLAP 在线分析,相对于过去主流的事务型系统OLTP,更强调分析决策功能,也因此衍生了OLAP,OLTP 两个分支
  • 1995年,Oracle,PostgreSQL 面向市场,被广泛应用,成为许多其他数据库的底座。
  • 2006年,Google 发表了一篇名为“Bigtable: A Distributed Storage System for Structured Data”的文章,提出了一种用于海量数据存储的数据模式,从此开启了NoSQL 浪潮
  • 2014年,Gartner 提出了HTAP 概念,希望在事务型系统上增强分析功能

关系型数据库 与NoSQL 简单比较

NoSQL 是Not Only SQL 的简称,是大数据时代,对关系型数据库系统的一个补充。自2006年 Google 发表BigTable 的分布式存储系统依赖,已有多种NoSQL 产品的研发的使用。关于MySQL 与NoSQL 的区别,可概括为以下几点:

  1. 存储方式:表格形式 VS 数据集。关系型数据库以表的行、列存储,适用于表之间关联操作;NoSQL以数据块组合,存储在数据集中,如文档,键值对或图结构。
  2. 存储模式:有模式 VS 无模式。关系型数据为结构化数据,需预先定义结构,具有稳定性和可靠性,同时修改模式相对困难。NoSQL 则是无模式的动态结构,是非结构化数据,可以相对容易适应数据类型和结构的变化。
  3. 存储扩展:纵向扩展 VS 横向扩展。关系型数据通常涉及多张表关联,计算量非常大,通常需要提升单台计算机的性能。NoSQL 本身是分布式的,可以通过多台计算机并行计算实现大数据集的计算。
  4. 事务:强一致性 VS 弱一致性。关系型数据库遵循ACID 原则,能很好的支持事务,具有强一致性。NoSQL 则基于BASE 理论(基本可用,最终一致性)或CAP 理论,对事务的支持性不是很好。
  5. 查询:SQL VS UnQI 。关系型数据库通过结构化查询语言SQL 实现数据创建,更新,读取及删除(CURD),有统一的语法规则。NoSQL 查询采用的是非结构化查询语言(UnQI),没有规范的标准,通常是以块为单位操作数据。
  6. 性能:读写性能差异。 关系型数据库为了维护数据强一致性,读写性能相对较差,尤其在面对高并发读写时,效率很低。NoSQL 存储是分布式的,且对数据一致性要求相对较弱,且查询时无需SQL 解析,具有很高的读写性能。
  7. 开源:收费 VS 开源。关系型数据库大部分是收费的,且价格昂贵。NoSQL 则都是开源,成本较低。

关系数据库系统比较

1970 年 Codd 发表关系型数据库论文以后,至1980年第一个关系型数据库系统才真正被实现。之后,陆续出现了MySQL,Microsoft SQL Server,Oracle,PostgreSQL 等关系型数据库系统。这些数据库产品在当今世界应用最广泛,不同的公司基于业务需求,选择相应的产品。

Oracle
Oracle 是RDBMS 市场的先驱,至此也是关系数据库市场上的领导者。Oracle 旗下除了内部研发的产品外,通过兼并各个公司,也包括非常广阔的企业软件产品。Oracle 数据库系统因为价格昂贵,通常是大型企业购买相关产品。

MySQL
MySQL 是当前最流行的关系型数据库管理系统,在WEB 应用领域,是最好的关系数据库管理系统应用软件之一。MySQL 由瑞典MySQL AB 公司开发,属于Oracle 旗下产品。MySQL 分为社区版和商业版,因其体积下,速度快,总体成本低,及开放源码等特点,是中小型和大型网站开发的首选网站数据库

MS SQL
Microsoft SQL Server 是微软旗下的关系数据库系统,可以运行在个人PC或台式机,企业服务器。MS SQL 提供图形化工具集和向导,引导数据库管理员执行各种任务,且其提供众多分析服务,帮助用户执行联机分析处理(OLAP)和数据挖掘

PostgreSQL
PostgreSQL 是一个开放源代码的对象-关系型数据库管理系统。它是由加州伯克利分校教授主持开发,1989年第一次发布,先后经历多个大版本发布。PostgreSQL 最突出的点是,它和MySQL 一样,是两种使用最广泛的开源关系型数据库系统

PostgreSQL 可以运行在所有类UNIX 操作系统上,早期版本PostgreSQL 服务器能运行在Cygwin 环境中的Microsoft Windows 下。在PostgreSQL 系统中,支持一些特定应用领域的非标准数据类型,如用于地理信息系统的几何数据类型(point,line,box,path,circle),用于表示二维空间对象;此外PostgreSQL 也提供许多函数和运算符来执行各种集合运算,如缩放,平移,旋转等。因此,PostgreSQL 较多的应用于实现不同研究和产品应用(如用于地理信息的PostGIS系统,管理空间数据的主流技术),及作为大学的教学工具。

非关系数据库

非关系型数据库系统在存储结构,扩展性,查询及性能上与关系型数据库系统均存在差别。面对不同的数据需求,形成了不同特性,满足不同应用场景的非关系型数据库系统。

K-V 型 NoSQL:Redis
Redis (Remote Dictionary Server)是以键值key-value形式存储的非关系型数据库。与同为K-V 型数据库的memcached 相比,Redis 在数据持久化操作上更进一步,通过周期性将更新数据写入磁盘或追加到记录文件,实现master-slave 同步。

Redis 的一个最大特点是速度快,但这需要内存来顶。此外,Redis 的value 支持多种数据类型,除字符串以外,还支持列表、集合、有序集合zset、哈希。

列式NoSQL:HBase
相对于关系型数据库以行存储数据,列式NoSQL 按列组织数据,适用于非结构化数据存储,同时具有较好的扩展性能。最为代表性的列式NoSQL 是HBase。HBase 是BigTable 的一种实现,其依赖分布式文件系统HDFS。在HDFS 系统上,HBase 的数据文件类型有两种,基于KeyValue 存储格式的HFile,和WAL(write ahead log)存储格式。

文档型NoSQL:MongoDB
文档型NoSQL 是将半结构化数据存储为文档的一种NoSQL,其通常以JSON 或XML 格式存储数据,是无数据模式(data schema)的,因此可以灵活的存储和读取数据,解决关系型数据库扩展性不灵活的问题。

MongoDB 基本单位是文档,文档由键值对(键必须为字符串,值类型可为常用的字符,数值或时间类型)格式组成,多个文档形成一个集合,多个集合组成一个数据库。MongoDB 的查询语言非常强大,支持类似关系数据库单表查询的大部分功能。

搜索型NoSQL:ElasticSearch
ElasticSearch 是搜索型NoSQL 的代表,解决关系型数据库全文搜索能力较弱的问题。ElasticSearch 最大的特定是查询速度快,在极低的延时下返回查询结果。ElasticSearch 快速检索功能的实现依赖三个步骤,导入数据,分词及权重计算。当用户检索数据时,基于权重将结果进行排名,打分,再将结果呈现给用户。

图结构NoSQL:Neo4j
Neo4j 是目前最流行的图数据库系统,其采用图结构存储和检索数据,数据可以通过实体-联系模式进行描述(节点-关系)。图数据库主要解决关系型数据库多表查询性能低的问题,当涉及深度为3以上的检索时,Neo4j具有极高的检索效率。

数据库选型

Neo4j 数据基本组成

Neo4j,一种原生图数据库,在存储、检索等内容做了优化。

节点:主要数据元素,通过关系连接到其他节点,可以有一个或多个属性,可以有一个或多个标签
关系:连接两个节点,有方向性,节点可以有多个关系,可以是递归关系。有两种关系,acted_in,direction
属性:命名值,名称/键是字符串。节点或属性均可拥有属性
标签:用于节点分组,一个节点可以有0个或多个标签,对标签索引可以加速节点检索

Cypher 查询语言

Cypher 查询是一种声明式查询语言,类似的还有XQuery,SQL,正则表达式等。
基本语法格式

  1. match
  2. (node)-[relationship]->(node)
  3. where (node|relationship)
  4. return (node|relationship)
  5. order by
  6. // 复杂查询
  7. CREATE (ee:Person { name: "Emil", from: "Sweden", klout: 99 })
  8. MATCH (ee:Person)-[:KNOWS]-(friends)
  9. WHERE ee.name = "Emil" RETURN ee, friends

match 相当于SQL select

其他常用操作

  • 字符串:starts with, end with, =~,
  • 操作符:not,and, or,xor,in,

参考资料

  1. https://neo4j.com/docs/getting-started/3.5/get-started-with-neo4j/ neo4j 官方文档
  2. https://developer.aliyun.com/article/691067?spm=a2c6h.14164896.0.0.459555cbnkQHCh neo4j 介绍
  3. https://db-engines.com/en/ranking DB-Engiens 网址
  4. https://www.postgresql.org/ PostgreSQL 官网
  5. https://baike.baidu.com/item/postgis/6091849?fr=aladdin PostGIS 百科
  6. https://zhuanlan.zhihu.com/p/376686950 PostGIS 应用及安装