什么是数据库?数据库是近年来最热门的基础软件领域。无论是开发者、创业者、投资者、爱好者,越来越多的人投身于数据库及相关领域。数据库无处不在,应用在各个行业和方向,发挥着非常重要的作用。在当今数据爆炸的时代,各种数据量呈指数级增长。对数据的安全性、可靠性、存储性能等提出了更高的要求,也造就了数据库及相关领域的繁荣。什么是数据库?数据库可以简单的认为是数据的集合,这些数据之间相互关联,映射了一些现实世界的数据模型,比如studentsinaclass,student-lessons,teachersInclass(teacher-lesson),students都会有考试成绩(student-grade),它们是相互关联,相互影响的。在数据库的上层,有一种语言供用户查询数据,最常见的就是SQL(StructuredQueryLanguage)。本课程主要侧重于如何实现功能完备的数据库系统,而不是教我们如何使用数据库。设计要点让我们抛开MySQL、PostgreSQL、Oracle等知名数据库系统,看看如果自己设计一个数据库系统应该怎么做,需要考虑和权衡哪些因素。最直观的想法是将数据存储在CSV文件中。文件中的每一行都是一条记录,每个文件存储的是同一类型的数据。比如我们有两类数据,歌手(artist)和唱片(album),artist数据有三个属性,分别是歌手的名字,出生年份,国家,album数据也有三个属性,专辑名称、所属艺术家和发行年份。数据存储如下:如果我们需要访问这个数据库,我们只能加载解析这个文件,然后逐行找到需要的行。这样的实现有什么问题?简单总结一下,大致如下:数据控制访问:相册年份字段数据被无效字符串覆盖怎么办??如果一个专辑数据需要对应多个艺术家数据怎么办??相册中的数据被删除后会发生什么?实现细节:如何查找记录??如果有多个线程同时向文件写入数据怎么办?持久性:如果机器在更新一条数据时崩溃了怎么办??如何将数据复制到多台机器以实现高可用性?这些问题都需要数据库来解决。一个功能完备的数据库系统需要屏蔽所有细节,让用户可以安心存储和查询数据,不用担心数据丢失等安全问题。关系模型70年代,数据存储没有统一的概念和实现,每个应用程序都需要实现一套数据存储方案,不利于应用程序和程序的移植。于是TedCodd在1970年提出了关系模型的概念,主要有以下三个要点:数据以简单的数据结构存储,通过高级语言可以访问数据库物理存储的细节;交给数据库管理系统实现的数据模型(datamodel)是指描述数据库中数据的概念集合。常见的数据模型有以下几种:RelationalKey/ValueGraphDocumentColumn-familyArray/MatrixHierarchicalNetwork其中,关系型是最常见、应用最广泛的关系型模型。大多数常见的数据库系统,如MySQL、PostgreSQL、Oracle都是关系模型;K/V、Graph、Document、ColumnFamily都是NoSQL类型,比如rocksdb、neo4j、MongoDB、Redis;Array/Matrix常用于机器学习领域,如TileDB;Hierarchical和Network分别表示层次模型和网状模型,是一种非常古老的数据模型,目前已经过时。关系模型主要有三个关键点:结构:定义关系(relation)的结构,属性完整性:保证数据库中的数据满足预期的限制,比如某些字段的数据类型限制操作:如何访问以及修改数据库中的数据,其中关系可以看作是一张表,而元组是表示表中一条记录的元组。一个关系通常有一个主键(primarykey),它标识一个唯一的元组。如果用户没有指定主键,大多数数据库会自动创建一个内置主键。关系的外键通常标识将一个关系映射到另一个关系的元组。这节课主要讲数据库需要解决的问题,以及一些设计要点,然后了解几种常见的数据模型。本课程主要关注关系数据模型。下一节课,我们将学习数据库的操作语言——SQL基础知识。
