一、数据库的基本概念
1.数据
描述事物的符号记录称为数据(Data)。数字、文字、图形、图像、声音、档案记录等都是数据。
在数据库中,数据是以“记录”的形式按照统一的格式进行存储的,而不是杂乱无章的。相同格式和类型的数据统一存放在一起,而不会把“人”和“书混在一起存储。这样,数据的存储就能够井然有序。如下图中存储的一行数据,在数据库中称为一条“记录”(Record)。每条记录中的每一个输入项称为“列 ”。下图中编号、姓名、性别、年龄、民族、专业都是列名。
编号 姓名 性别 年龄 民族 专业 1 王明 男 22 汉 计算机科学与技术 2 赵玲 女 21 汉 信息管理 3 张雨彤 女 20 汉 音乐 4 李新 男 23 回 自动化 5 夏雪 女 22 汉 通信 2、数据库和数据库表
不同的记录组织在一起,就形成了数据库(Database,DB)的“表”(Table)。也可 以说,表是用来存储具体数据的,如图 1.1 所示。那么数据库和表存在什么关系呢?简单地说,数据库就是表的集合。它是以一定的组织方式存储的相互有关的数据集合。例如,关系数据库的表由记录组成,记录由字段组成,字段由字符或数字组成。它可以供各种用户共享,具有最小冗余度和较高的数据独立性,它是统一管理的相关数据的集合。通常,数据库并不是简单地存储这些数据的,还要表示它们之间的关系。例如,书和人是存在联系的,书的作者可能就是某个人,因此需要建立书与人的“关系”。这种关系也需要用数据库来表示,因此关系的描述也是数据库的一部分。
3.数据库管理系统和数据库系统
数据库管理系统(Database Management System,DBMS)是实现对数据库资源有效组织、管理和存取的系统软件。它在操作系统的支持下,支持用户对数据库的各项操作。
DBMS 主要包括以下功能
数据库的建立和维护功能 包括建立数据库的结构和数据的录入与转换、数据库的 转储与恢复、数据库的重组与性能监视等功能 数据定义功能 包括定义全局数据结构、局部逻辑数据结构、存储结构、保密模式 及信息格式等功能。保证存储在数据库中的数据正确、有效和相容,以防止不合语 义的错误数据被输入或输出 数据操纵功能 包括数据查询统计和数据更新两个方面 数据库的运行管理功能 这是数据库管理系统的核心部分,包括并发控制、存取控 制、数据库内部维护等功能 通信功能 DBMS 与其他软件系统之间的通信,如Access 能与其他 0ffice组件进行 数据交换
数据库系统(Database System,DBS)是一个人-机系统,一般由硬件、操作系统、数 据库、DBMS、应用软件和数据库用户(包括数据库管理员)组成。用户可以通过 DBMS 操作 数据库,也可以通过应用程序操作数据库。应用程序是利用 DBMS 为解决某个具体的管理或数据处理的任务而编制的一系列命令的 有序集合。如果应用程序比较完善,能够提供友好的人机界面,并编译成可执行文件发行,使得普通用户不需要具备计算机的专业知识,在较短时间就学会使用,那么就称为数据库应 用软件。常用的数据库应用软件有人事管理、财务管理、图书管理等信息管理软件及各类信息咨 询系统等。数据库管理员(Database Administrator,DBA)负责数据库的更新和备份数据库系 统的维护、用户管理等工作,保证数据库系统的正常运行。DBA一般由业务水平较高、资历 较深的人员担任。需要注意的是数据库、数据库系统、数据库管理系统,甚至数据库表等名词,在日常讨 论中通常不严格区别。遇到此情况时,可以根据具体情况,判断出实际所指的是什么。
二、数据模型
数据是现实世界中“量 ”的抽象,而数据模型(Data Model)是数据特征的抽象。在数据库系统中,数据模型是它的核心与基础。数据模型表现为数据的结构、定义在其上的操作及约束条件。它从概念层次上描述了系统的静态特征动态特征和约束条件,为数据库系统的信息表示与操作提供了一个抽象框架。
在 DBMS 的发展过程中,出现了网状模型、层次模型和关系模型三种经典的数据模型。 由于受限于数学基础、编程技术和硬件条件,最初出现的层次模型和网状模型与关系模型相 比,在用户接口的上、中层部分更易于实现。所以,这在很长一段时间阻碍了关系模型的发展。
网状模型 弃用 层次模型 关系模型 常用 1、关系模型
1.1、数据结构
关系模型建立在关系代数的理论基础上,数据结构使用简单易懂的二维数据表可以用简单的“实体-关系 ”(E-R)图来直接表示,E-R 图中包含了实体(数据对象)、关系和属性三个要素。如下图表示了银行客户和银行账户之间的关系。
银行客户和银行账户之间的关系(E-R)
实体 也称为实例,对应现实世界中可区别于其他对象的“事件”或“事物,如银行 客户、银行账户等 实体集 具有相同类型及共享相同性质的实体集合。例如,银行所有客户的集合可以定 义为“银行客户 ”实体集 属性 实体所具有的某一特性,一个实体可以有多个属性。例如,“银行客”实体集 中的每个实体均具有姓名、住址、电话等属性 联系 实体集之间的对应关系称为联系,也称为关系。例如,银行客户和银行账户之间 存在“储蓄 ”的关系 表 1-1 银行客户表
表 1-1 表示作为银行客户的实体集,客户编码为区分客户实体的唯一标识。
客户编码 客户姓名 客户住址 客户电话 1 王明 中关村 010 - 87654321 2 赵玲 回龙观 010 - 12345678 表 1-2 银行账户表
表 1-2 表示作为银行账户的实体集(账户编码为区分账户实体的唯一标识)
账户编码 账户 余额 1 23598273959029837 2000.23 2 27298275359025681 5000.55 表 1-3 储蓄关系表
表 1-3 表示建立银行账户和银行客户之间的储蓄关系(储蓄编码为区分各储蓄关系的唯一 标识)
储蓄编码 客户编码 账户编码 1 1 2 2 2 1 需要注意的是,虽然在银行客户看来,自己的账户和别人的账户完全不同,是唯 一的。但是,银行内部往往还是会使用内部编码来区分管理和服务等不同业务
1.2、数据操作
对于数据库的用户而言,关系模型使用从关系代数上抽象出来的数据库操作语言(DML) 进行操作。结构化查询语言(SQL)就是其中最重要的一种,已经成为关系数据库的标准操作语言。它的特色是直接面向结果,简化操作步骤,使得数据库应用的设计变得非常简单易懂。
对于数据库的物理结构而言,关系数据库系统的数据结构简单、功能强、数据独立性高、 理论基础坚实。严格的关系数据库以二维的数据库表作为基本数据结构,利用简单或复杂的 索引技术实现查询算法,实现起来相对比较简单,也方便了预编译技术将 SQL 语言直接转化 为有效的数据检索算法
1.3、数据约束
关系模型的数据约束可以针对实体,也可以针对实体的属性,还可以针对关系,并可以在定义实体、实体属性和关系时全面实现。关系模型使用的数据定义语言(DDL)和关系模型在理论上对关系数据库核心实现的要求,使得数据约束可以很容易实现,但是它的效率并不高
主流数据库
关系型数据库 SQL Server Oracle MySQL DB2 非关系型数据库 Redis MongoDB Memcached HBase
三、关系型数据库
1、关系数据库的基本结构
关系数据库使用的存储结构是多个二维表格,即反映事物及其联系的数据描述是以平面表格形式体现的。
在每个二维表中,每一行称为一条记录,用来描述一个对象的信息;每一列称为一个字段,用来描述对象的一个属性。数据表与数据库之间存在相应的关联,这些关联用来查询相关的数据。如下图所示就是一个数据表。
关系数据库是由数据表之间的关联组成的。其中数据表通常是一个由行和列组成的二维表,每一个数据表分别说明数据库中某一特定的方面或部分的对象及其属性。
数据表中的行通常叫做记录或者元组,它代表众多具有相同属性的对象中的
数据表中的列通常叫做字段或者属性,它代表相应数据库中存储对象的共有属性。2、主键与外键
2.1、主键
数据表中的每行记录都必须是唯一的,而不允许出现完全相同的记录,通过定义主键(主 关键字,Primary Key)可以保证记录(实体)的唯一性。
键,即关键字,它是关系模型中一个非常重要的元素
主键唯一标识表中的行数据,一个主键值对应一行数据。主键由一个或多个字段组成, 其值具有唯一性,不允许取空值(NULL)。一个表只能有一个主键。
如果一个属性集能唯一地标识表的一行而又不含有多余的属性,那么这个属性集称为候 选键。表中可以有多个候选键,但是只能有一个候选键可以选作表的主键,所有其他候选键 称为备用键。如图所示的“学生信息统计表 ”中,{编号}、{身份证号}或{姓名,专业编号}都可以说是候选键,可以将{编号}定义为主键。学生信息统计表
编号 姓名 身份证号 性别 年龄 民族 专业编号 1 王明 110626198801012811 男 22 汉 1 2 赵玲 146225198906262638 女 21 汉 5 3 张雨彤 130621199010033522 女 20 汉 3 4 李新 110265198703051923 男 23 回 2 5 贾雪 110215198403253562 女 22 汉 2 6 王林 120026198602092813 男 24 满 4 7 贾雪 130726199002162828 女 20 汉 5 (2)外键
一个关系数据库通常包含多个表,通过外键(Foreign Key)可以使这些表关联起来。
外键是用于建立和加强两个表数据之间的链接的一列或多列。通过将表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就称为第二个表的外键。例如,在图 “专业名称表 ”中,字段{专业编号}是该表的主键,在图“学生信息统计表 ”中也有一个字段{专业编号},则该字段称为“学生信息统计表’,的外键。
在“专业名称表 ”就称为“主表 ”,“学生信息统计表 ”就称为“从表 ”。“主表 ”和“从表 ”总是成对出现的,相互之间以“外键 ”形成关联。专业名称表
专业编号 专业 1 计算机科学与技术 2 信息管理 3 自动化 4 音乐 5 美术 6 通信 7 哲学 3、数据完整性规则
为了维护数据库中的数据与现实世界的一致性,关系数据库的数据与更新操作必须遵守下列四类完整性规则。
3.1、实体完整性规则
实体完整性规则要求关系中的元组在主键的属性上不能有空值。如果出现空值,那么主 键值就起不到唯一标识元组的作用。例如,在图 1.9所示的“学生信息表 ”中,每个学生都有一个编号,用来唯一标识每个 学生的信息记录,这个编号往往被设为该表的主键,以方便其他数据库表的关联应用。依照 实体完整性规则,“编号”字段不允许为空。
3.2、域完整性规则
域完整性也称列完整性,指定一个数据集对某一个列是否有效或确定是否允许空值
3.3、引用完整性规则
如果两个表之间相互关联,那么引用完整性规则要求不允许引用不存在的元组。
3.4、用户定义的完整性规则
用户定义的完整性规则是针对某一具体数据的约束条件,由应用环境决定。它反映某一具体应用所涉及的数据必须满足的语义要求。系统提供定义和检验这类完整性的机制,以便用统一的系统方法进行处理,不再由应用程序承担这项工作。
四、MySQL二进制安装
1、基础环境准备
#安装MySQL依赖包 dnf -y install gcc libaio numactl openssl ncurses-compat-libs
2、二进制安装
#解压二进制包 tar -xf mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz #创建运行程序的程序用户 useradd -M -s /sbin/nologin mysql #关闭防火墙 systemctl stop firewalld #禁用防火墙 systemctl disable firewalld #关闭内核保护机制 setenforce 0 #永久关闭内核保护机制 vim /etc/selinux/config
3、初始化
#移动程序所在的位置 mv mysql-8.0.36-linux-glibc2.28-x86_64 /usr/local/mysql #初始化 ./mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/ #记住初始化的密码 Pc<,FxSh!79,
4、设定配置文件
# 编辑 MySQL 配置文件,该文件用于配置 MySQL 服务的各项参数 vim /etc/my.cnf ## 以下为配置文件中的编辑内容 ## # [client] 部分配置客户端连接 MySQL 时使用的参数 [client] # 指定客户端连接 MySQL 服务时使用的 Unix 套接字文件路径 socket=/usr/local/mysql/data/mysql.sock # [mysqld] 部分配置 MySQL 服务器的核心参数 [mysqld] # 指定 MySQL 服务器监听的 Unix 套接字文件路径 socket=/usr/local/mysql/data/mysql.sock # 允许 MySQL 服务器监听所有可用的网络接口 bind-address=0.0.0.0 # 跳过域名解析,提高连接速度 skip-name-resolve # 指定 MySQL 服务器监听的端口号 port=3306 # 指定 MySQL 的安装基础目录 basedir=/usr/local/mysql # 指定 MySQL 数据文件的存储目录 datadir=/usr/local/mysql/data # 设置 MySQL 服务器允许的最大连接数 max_connections=2048 # 设置 MySQL 服务器的字符集为 UTF-8 character-set-server=utf8 # 注意:此处存在拼写错误,正确的应为 default-storage-engine,设置 MySQL 的默认存储引擎为 InnoDB defualt-storage-engine=INNODB # 设置 MySQL 服务器允许的最大数据包大小 max_allowed_packet=16M # [mysqld_safe] 部分配置 MySQL 安全启动脚本的参数 [mysqld_safe] # 指定 MySQL 错误日志文件的存储路径 log-error=/usr/local/mysql/data/error.log # 为 MySQL 的二进制文件创建软链接,方便在系统任何位置直接使用 MySQL 命令 ln -s /usr/local/mysql/bin/* /usr/local/bin/ # 将 MySQL 的二进制文件目录添加到系统的环境变量 PATH 中 export PATH=$PATH:/usr/local/mysql/bin # 重新加载系统环境变量配置文件,使新的环境变量设置生效 . /etc/profile # 另一种重新加载系统环境变量配置文件的方式,与上面的 . /etc/profile 作用相同 source /etc/profile # 重启系统,使所有配置更改生效 reboot
5、配置守护进程方式启动
# 以服务进程脚本运行,将 mysql.server 脚本复制到 /etc/init.d/ 目录下并命名为 mysqld cp mysql.server /etc/init.d/mysqld # 加入到守护进程中,使用 vim 编辑器打开 systemd 服务配置文件 vim /lib/systemd/system/mysqld.service ## 编辑内容,以下是 mysqld.service 文件的配置内容 ## [Unit] # 服务描述信息,可随意填写 Description=zhegedifangsuibianxie # 表示该服务在网络服务启动完成后启动 After=network.target [Service] # 服务类型为 forking,意味着服务会通过 fork 子进程的方式启动 Type=forking # 启动服务时执行的命令 ExecStart=/etc/init.d/mysqld start # 重新加载服务时执行的命令 ExecReload=/etc/init.d/mysqld restart # 停止服务时执行的命令 ExecStop=/etc/init.d/mysqld stop # 为服务创建独立的临时目录 PrivateTmp=true [Install] # 表示该服务在多用户模式下被激活 WantedBy=mulit-user.target ## 重新加载守护进程,让新的服务配置生效 ## systemctl daemon-reload # 启动 MySQL 服务 systemctl start mysql # 检查 MySQL 服务状态,通过查看网络连接信息来确认 MySQL 是否正常运行 netstat -anpt | grep mysql
alter user 'root'@'localhost' identified with mysql_native_password by 'pwd123';