数据库基本概念和分类

971 阅读7分钟

本文会对数据库相关概念及各类别数据库的适用场景做一下介绍,其中概念部分主要参考 Database System Concepts, Sixth EditionFundamentals of Database Systems, Seventh Edition,分类和基本介绍参考 DB-Engines, 具体的数据库使用另外说明。

概述

数据库管理系统(database-management system,DBMS)由一个相关数据的集合和一系列访问这些数据的程序组成。而这些数据集合被称作数据库(database)。DBMS的主要目标是方便和高效的存取数据库数据。

文件处理系统

在数据库出现之前,人们通常使用文件处理系统(file-processing system)来管理数据(比如用excel来存储一些名单),当多人或在多地使用这种方式时存在一些问题

  • 数据的冗余和不一致(Data redundancy and inconsistency)
  • 数据访问困难(Difficulty in accessing data)
  • 数据孤立(Data isolation)
  • 完整性问题(Integrity problems)
  • 原子性问题(Atomicity problems)
  • 并发访问异常(Concurrent-access anomalies)
  • 安全问题(Security problems)

而dbms解决了这些问题,git本质也是一个数据库,

数据抽象层次

dbms为了高效存储需要用复杂的数据结构来表述数据,而为了方便用户使用就需要多层抽象将具体实现隐藏。
数据的抽象分为以下层次

  • 物理层(Physical level.),这个最低级的抽象描述了数据实际的存储方式
  • 逻辑层(Logical level),这个层次的抽象描述了数据库中保存了什么,以及这些数据之间的关系。数据库管理员需要用这一层的抽象来决定在数据库维护哪些数据。
  • 视图层(View level),最高级的抽象,进一步简化数据库的交互,让用户只看到自己关心的部分,同一个数据库可能有多个视图。

image.png

比如

type instructor = record
                    ID : char (5);
                    name : char (20);
                    dept name : char (20);
                    salary : numeric (8,2);
                  end;

这个代码定义了一个记录类型instructor,其中包含四个字段,每个字段都有一个名字和对应类型。
在物理层这部分数据可以保存在连续内存中,编译器将具体细节对程序开发者隐藏,数据库管理员可能需要了解。
在逻辑层,通过类型来定义具体数据和它们之间的关系,程序开发者和数据库管理员会从这个层次进行工作。
程序的使用者使用视图层,来和数据库交互。

data model

data model是一组用来描述数据、数据之间关系、数据语义和一致性约束的概念,它提供了一种方式来描述数据库在各个抽象层次的设计。

我们可以根据用来描述数据库结构的概念类型对data model进行分类,High-level or conceptual data models提供了接近用户使用的概念,low-level or physical data models提供了用于实际存储的概念,在这两个极端情况之间还有representational(or implementation) data models。这个data model隐藏了数据存储的细节,但是能被计算机直接表示,这也是我们对不同数据库进行分类的手段。

相关的一些概念包括entities, attributes, and relationships,其中entity表示一个现实世界的实体,比如一个雇员,attributes表示entity的属性,relationships表示实体之间的关系,比如两个雇员的同事关系

database schema

data model偏向于对数据库的设计,而database schema则是对具体数据库的具体实现,它常用diagrams表示,比如

image.png

而数据库中每个时刻存储的信息被称为instance,schema和instance的关系就类似于变量声明和一个时刻该变量存储的值

//int类型的a
int a
//此时a存储2
a=2
//此时a存储1
a=1

schema通常也是按照抽象层次分为三种,这种架构被称为 three-schema architecture

image.png

  • internal level包含internal schema,使用一个物理层model,描述了数据库的物理存储详情和访问路径,
  • conceptual level包含conceptual schema,通常使用representational data model,隐藏了物理存储结构,并专注于描述entity、data type、relationships、user operation和constraints。
  • external level包含一定数量的external schema或user view,描述了用户关注的部分。

一个具体数据库并不一定完整支持三个层级的schema,因为不同层级的表示不同,因此在具体操作时,需要将指令做对应转换(mapping)

数据库语言

一个dbms提供了一个ddl(data-definition language)来指定database schema、一个dml(data-manipulation language)来表示数据库查询和更新。实际上这两种语言通常由一个语言来实现,比如广为使用的sql

数据库设计

设计一个dbms来管理信息,这些信息并不是单独存在的。

设计步骤

一个high level data model为数据库设计者提供了一个概念性的框架,用来说明数据库用户的数据需求和怎么构造数据库来满足这些需求。数据库设计的最初阶段就是全面刻画预期的数据库用户的数据需求,通过和领域专家和数据库用户广泛交流,制定出用户需要的规格文档。

下一步设计者选择一个data model,通过应用被选定data model的相关概念,将这些需求转化为数据库的概念化schema,这个阶段叫做概念设计(conceptual-design)阶段,设计成果是详细的schema,这一阶段主要是描述数据和它们之间的关系以及相关操作,而不是存储细节。 elational model为例,这个阶段要涉及决定数据库中包含哪些属性,以及如何将这些属性组织到多个表中,前者是业务问题,后者主要有两个解决办法,一个是使用 entity-relationship model,一个是使用一系列算法(被称为normalization)将所有属性输入并生成一系列表格,这两个方法在后续小节详述。 然后review这个schema确保满足所有需求且没冲突,以及去掉一些冗余特性。

接下来是将抽象data model转化为数据库实现的阶段,在逻辑设计阶段(logical-design phase),设计者将high level 概念化schema转化为数据库将要使用的implementation data model 确定逻辑特性,并在物理设计阶段(physical-design phase)确定物理特性。

The Entity-Relationship Model

实体-联系(E-R)模型使用一组称为实体的基本对象以及它们之间的联系来表示,数据库的总体逻辑结构(即schema)可以使用entity-relationship (E-R) diagram表示,这种图最常见的画法是采用统一建模语言(Unified Modeling Language,UML),其中实体矩形表示,其中包含实体和属性,联系用菱形

image.png

分类

数据库的分类按照data model大致分为关系型数据库(relational)和非关系型数据库(nosql),更具体的分类中非关系型又有很多分类方式,总的分类可看这里,现在只介绍几种常见的。

Relational DBMS

关系型数据库支持关系型data model,关系型schema通过table name和固定数量和类型的属性定义,一个记录(即entity)对应一个table的一行,会包含每个属性的一个值。关系型数据库使用sql语言来进行增删改查等操作。

为了加快查找速度,通常会建立索引,通过平衡树来解决。

常见的关系型数据库比如MySQL和SQLite

Key-value stores

k-v存储只存储键值对,通过键名来获取对应的值,这种数据库不适合复杂的场景,常见的比如Redis,另外版本管理工具git本质上也是k-v store

Document Stores

也叫做面向文档(document-oriented)的数据库系统,每个record并不需要统一的结构,比如每个记录并不需要一样的列,常常用json表示。
常见的比如MongoDB

Time Series DBMS

时序数据库为处理时间序列的数据有专门的优化,每一项都和一个时间戳相关。常见的比如InfluxDB和Prometheus

Object oriented DBMS

面向对象的数据库通常称为对象数据库( object databases),用于面向对象的编程语言,目标是按照语言中使用的对象进行存储,而不需要转换,比如继承关系也要被保存。常见的比如浏览器中的indexDb,他就是 a JavaScript-based object-oriented database

Search Engines

搜索引擎对搜索进行了优化,常见的比如Elasticsearch


完结