目录
[1.1 数据库相关基本概念](#1.1 数据库相关基本概念)
[1.2 数据模型](#1.2 数据模型)
[1.3 数据库分类](#1.3 数据库分类)
[二、MySQL 数据库深入解析](#二、MySQL 数据库深入解析)
[2.1 MySQL 简介](#2.1 MySQL 简介)
[2.2 MySQL 安装](#2.2 MySQL 安装)
[2.3 访问 MySQL 数据库](#2.3 访问 MySQL 数据库)
[3.1 关系数据库基本结构](#3.1 关系数据库基本结构)
[3.2 主键与外键](#3.2 主键与外键)
[3.3 数据完整性规则](#3.3 数据完整性规则)
一、数据库基础概念
1.1 数据库相关基本概念
- 记录与列:在数据库中,一行数据称为一条 "记录"(Record),记录中的每一个输入项称为 "列"。例如,在学生信息表中,"编号""姓名""性别" 等都是列名,而每一行具体的学生信息就是一条记录。
- 数据库与数据库表:不同记录组织在一起形成数据库(Database,DB)的 "表"(Table)。表用于存储具体数据,数据库是表的集合,以一定组织方式存储相互有关的数据集合。关系数据库的表由记录组成,记录由字段组成,字段由字符或数字组成,具有最小冗余度和较高的数据独立性,且要表示数据之间的关系。例如,图书管理系统中,"图书表" 和 "读者表" 通过 "借阅关系" 相互关联,这种关系也是数据库的一部分。
- 数据库管理系统与数据库系统
- 数据库管理系统(Database Management System,DBMS):是实现对数据库资源有效组织、管理和存取的系统软件,在操作系统支持下,支持用户对数据库的各项操作。其功能包括数据库的建立和维护(如建立结构、录入数据、转储恢复等)、数据定义(定义数据结构、存储结构等)、数据操纵(查询统计和数据更新)、数据库的运行管理(并发控制、存取控制等)以及通信功能(与其他软件系统进行数据交换,如 Access 与其他 Office 组件)。
- 数据库系统(Database System,DBS):是一个人 - 机系统,一般由硬件、操作系统、数据库、DBMS、应用软件和数据库用户(包括数据库管理员)组成。用户可通过 DBMS 或应用程序操作数据库,应用程序是利用 DBMS 解决具体管理或数据处理任务而编制的一系列程序。
1.2 数据模型
- 数据模型概述:数据模型(Data Model)是数据特征的抽象,是数据库系统的核心与基础,表现为数据的结构、定义在其上的操作及约束条件,从概念层次描述系统的静态特征、动态特征和约束条件,为数据库系统的信息表示与操作提供抽象框架。
- 经典数据模型
- 网状模型
- 数据结构:数据记录组织成图的形式,用 "数据结构图" 表示。如银行客户、银行账户和银行支行的关系,一个银行客户可拥有多个银行账号(一对多),一个银行账号可被多个客户所有(一对多),每个银行账户位于特定的银行支行(一对一),能很好地支持复杂数据关系,数据结构模型直观反映现实数据联系。
- 数据操作:建立在关系链基础上的导航式操作。针对特定网状模型系统的数据结构,可能找到最优查询算法,但结构变化时需新的查询办法,由于以图论为基础,无法得到通用高效解决方案,随着关系模型发展,其重要性逐渐降低。
- 数据约束:数据约束零散孤立,或分散在各个节点,或集中为关系链,易导致不一致性或降低效率,通常由应用程序自身实现数据约束,增加了开发难度。
- 层次模型
- 数据结构:是网状模型的特例,数据记录组织成树的形式,用 "树结构图" 表示,适合一对多的关系模型。如企业组织结构,企业下辖多个部门,部门下辖多个科室,科室下辖多个小组,禁止多对多和多对一关系,数据结构相对简单 。
- 数据操作:具有导航性,类似网状模型,但在层次结构明确的情况下,部分操作相对简单。例如,查询某个部门下的所有小组,可通过树状结构快速定位。
- 数据约束:与网状模型类似,约束实现存在困难,通常依赖应用程序,且由于结构的层次性,在处理复杂关系时不够灵活。
- 关系模型:以二维表格形式组织数据,每行是一条记录,每列是一个字段。具有结构简单、数据独立性高、建立在严格数学理论基础上等优点,是目前应用最广泛的数据模型。关系数据库系统基于关系模型,通过定义主键(保证记录唯一性)、外键(建立表间关联)和数据完整性规则(实体完整性、域完整性、引用完整性和用户定义完整性)来维护数据的一致性和准确性。
- 网状模型
1.3 数据库分类
- 关系数据库:基于关系模型的数据库系统,使用多个二维表格存储数据,通过主键和外键建立表间关联。常见的关系数据库有 Oracle、DB2、MySQL 等。关系数据库具有数据结构清晰、操作方便、数据完整性强等优点,适用于数据关系复杂、对数据一致性要求高的应用场景,如企业资源规划(ERP)系统、财务管理系统等。
- 非关系数据库:也称作 NoSQL(Not Only SQL),存储数据不以关系模型为依据,不需要固定的表格式。具有高并发读写性能好、海量数据存储与访问效率高、扩展性和可用性强等优点,适用于对读写速度要求极高、数据结构灵活的场景,如互联网公司的缓存系统、日志存储系统等。常用的非关系数据库有 Memcached、Redis、MongoDB、HBase 等。
二、MySQL 数据库深入解析
2.1 MySQL 简介
MySQL 是一个真正的多线程、多用户的 SQL 数据库服务,具有高性能、高可靠和易于使用的特性,是服务器领域中最受欢迎的开源数据库系统。其发展历程历经多次收购,目前由 Oracle 公司负责运营和维护。MySQL 可与多种软件组合使用,如与 Linux、Apache、PHP/Perl/Python 组成 LAMP 组合,广泛应用于中小型网站建设。
2.2 MySQL 安装
-
编译安装
- 准备工作
- 卸载冲突软件 :若系统已安装 MariaDB 数据库,需先卸载,如在 OpenEuler 系统中,使用命令
rpm -q mariadb
查看是否安装,若已安装则用dnf remove mariadb
卸载;同时关闭 SELinux 和防火墙,执行sed -i's/SELINUX=enforcing/SELINUX-disabled/' /etc/selinux/config
和setenforce 0
关闭 SELinux,systemctl disable firewalld
和systemctl stop firewalld
关闭防火墙。 - 安装依赖包 :安装编译所需的依赖包,如
gcc
、gcc - c++
、make
、cmake
等,使用命令dnf install -y gcc gcc - c++ make cmake autoconf libtool bison re2c openssl - devel libxml2 - devel zlib - devel curl - devel libpng - devel libjpeg - turbo - devel freetype - devel libicu - devel oniguruma - devel sqlite - devel libxslt - devel libzip - devel pcre - devel apr - devel apr - util - devel ncurses - devel wget libtirpc - devel rpcgen
。 - 安装 cmake :从官方网站Download CMake下载最新稳定版本的 cmake 包,如
cmake - 3.16.2.tar.gz
,解压后进入目录执行./configure
、gmake && gmake install
进行安装。 - 准备 Boost 库 :MySQL 5.7 及部分版本需要 Boost 库,从http://sourceforge.net/projects/boost/files/boost/下载对应版本,如
boost_1_77_0
,解压后将其移动到/usr/local/boost
目录。
- 卸载冲突软件 :若系统已安装 MariaDB 数据库,需先卸载,如在 OpenEuler 系统中,使用命令
- 源码编译及安装
- 创建运行用户 :为加强权限控制,创建专门的运行用户
mysql
,不创建宿主文件夹,使用命令groupadd mysql
和useradd -M -s /sbin/nologin mysql -g mysql
。 - 解包 :将下载的 MySQL 源码包
mysql - 8.0.36.tar.gz
解压到/usr/src
目录,然后切换到解压后的源码目录,执行tar zxf mysql - 8.0.36.tar.gz -C /usr/src
和cd /usr/src/mysql - 8.0.36
。 - 配置 :为支持多种字符集,创建独立构建目录并进行配置。在配置命令
cmake.. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DSYSCONFDIR=/etc -DMYSQL_DATADIR=/usr/local/mysql/data -DWITH_SSL=system -DENABLED_LOCAL_INFILE=ON -DWITH_BOOST=/usr/local/boost -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all
中,..
指定上层源码目录,-DCMAKE_INSTALL_PREFIX
指定安装目录,-DSYSCONFDIR
设置配置文件存储位置,-DMYSQL_DATADIR
设置数据文件存储位置,-DWITH_BOOST
指定 Boost 库位置(MySQL 8.0 版本编译安装时必须添加),-DWITH_SSL
使用系统 SSL/TLS 库支持加密连接,-DENABLED_LOCAL_INFILE
允许从客户端本地文件加载数据。 - 编译安装 :执行
make -j$(nproc)
进行并行编译($(nproc)
获取系统可用处理器核心数量,提高编译速度),然后执行make install
完成安装。
- 创建运行用户 :为加强权限控制,创建专门的运行用户
- 安装后的其他调整
- 建立配置文件 :MySQL 8.0.36 版本开始安装包内不提供默认配置文件
my - default.cnf
,需手动创建/etc/my.cnf
。基本配置如下:
- 建立配置文件 :MySQL 8.0.36 版本开始安装包内不提供默认配置文件
[client]
socket=/usr/local/mysql/data/mysql.sock
[mysqld]
socket=/usr/local/mysql/data/mysql.sock
#绑定监听地址0.0.0.0
bind - address = 0.0.0.0
skip - name - resolve
#设置3306端口
port = 3306
#设置mysql的安装目录
basedir=/usr/local/mysql
#设置mysql数据库的数据的存放目录
datadir=/usr/local/mysql/data
#允许最大连接数
max_connections=2048
#服务端使用的字符集默认为utf8
character - set - server=utf8
#创建新表时将使用的默认存储引擎
default - storage - engine=INNODB
max_allowed_packet=16M - 准备工作
-
初始化数据库 :以
mysql
用户身份执行初始化,指定数据存放目录等,使用命令/usr/local/mysql/bin/mysqld --initialize - insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
(无密码模式)。若采用有密码模式初始化,如二进制安装时,会生成初始随机密码,需保存用于后续登录。 -
设置环境变量 :为方便在任何目录使用
mysql
命令,在/etc/profile
中设置环境变量,执行echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
,然后执行./etc/profile
使设置立即生效。 -
添加系统服务 :将 MySQL 添加为 systemd 标准服务,方便使用
systemctl
命令管理。找到support - files
文件夹下的mysql.server
脚本文件,复制到/etc/rc.d/init.d
目录下并改名为mysqld
,设置执行权限chmod +x /etc/rc.d/init.d/mysqld
。编辑生成mysqld.service
服务文件,内容如下:[Unit]
Description=mysqld
After=network.target
[Service]
Type=forking
ExecStart=/etc/rc.d/init.d/mysqld start
ExecReload=/etc/rc.d/init.d/mysqld restart
ExecStop=/etc/rc.d/init.d/mysqld stop
PrivateTmp=true
[Install]
WantedBy=multi - user.target
执行systemctl daemon - reload
和systemctl enable mysqld
,之后就可以使用systemctl
工具或直接调用/etc/init.d/mysqld
脚本来控制 MySQL 数据库服务,如启动服务systemctl start mysqld.service
,查看运行状态systemctl status mysqld.service
。MySQL 服务器默认通过 TCP 3306 端口提供服务,可通过编辑/etc/my.cnf
配置文件中[mysqld]
配置段的port = 3306
行更改监听端口。
- 二进制安装
- 基础环境准备 :若采用 OpenEuler minimal 安装的系统,需安装一些基础软件包工具,如
gcc
、vim
、wget
等,执行dnf -y install gcc vim wget net - tools lrzsz tar
。安装 MySQL 依赖的软件包libaio
、numactl
、openssl
等,使用命令dnf install -y libaio numactl openssl ncurses - compat - libs
。创建运行 MySQL 程序的用户useradd -M -s /sbin/nologin mysql
,关闭 SELinux 和防火墙,操作与编译安装时相同。 - 二进制安装 :下载 MySQL 8.0.36 的二进制安装包
mysql - 8.0.36 - linux - glibc2.28 - x86_64.tar.xz
,解压后将其移动到/usr/local/mysql
目录,创建数据目录mkdir /usr/local/mysql/data
,并设置目录权限chown -R mysql:mysql /usr/local/mysql
,进入/usr/local/mysql/bin
目录执行./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
进行初始化,此时会生成初始随机密码,需保存用于后续登录。 - 设定配置文件 :MySQL 的配置文件与编译安装类似,创建
/etc/my.cnf
文件并进行配置,配置内容与编译安装时基本相同。将 MySQL 的可执行文件写入环境变量,执行echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
并使配置生效./etc/profile
。 - 配置 systemctl 方式启动 :与编译安装添加系统服务步骤相同,将
/usr/local/mysql/support - files
目录下的mysql.server
文件复制到/etc/rc.d/init.d
目录下改名为mysqld
并赋予可执行权限,编辑生成mysqld.service
服务文件,执行相关命令使 MySQL 服务可通过systemctl
管理。
2.3 访问 MySQL 数据库
- 登录到 MySQL 服务器 :安装初始化后,MySQL 数据库的默认管理员用户名为 "root",密码为给定的随机密码(若初始化采用无密码模式则需自行设置密码)。以 root 用户登录本机 MySQL 数据库,执行
mysql -u root -p
,根据提示输入密码,登录成功后可修改密码,如alter user 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pwd123';
(单引号内为新密码)。 - 执行 MySQL 操作语句:验证成功进入 "mysql>" 的数据库操作环境后,可输入各种操作语句对数据库进行管理。MySQL 操作语句以分号 ";" 结束,输入时不区分大小写,但习惯将关键字大写。例如,执行 "SHOW DATABASES;" 语句可查看当前数据库中的库。
- 退出 "mysql>" 操作环境:在 "mysql>" 操作环境中,执行 "EXIT" 或 "QUIT" 命令即可退出 mysql 命令工具,返回原来的 Shell 环境。
三、关系数据库关键概念拓展
3.1 关系数据库基本结构
关系数据库使用多个二维表格作为存储结构,每个二维表中,每一行是一条记录,用于描述一个对象的信息;每一列是一个字段,用于描述对象的一个属性。数据表之间通过关联来查询相关数据,数据表用于说明数据库中某一特定方面或部分的对象及其属性。例如,在学生管理系统中,"学生信息表" 存储学生的基本信息,"课程表" 存储课程信息,通过 "选课表" 建立学生与课程之间的关联,实现多对多关系的表示。
3.2 主键与外键
- 主键:用于保证数据表中每行记录的唯一性,由一个或多个字段组成,其值具有唯一性且不允许取空值(NULL)。一个表只能有一个主键,若存在多个能唯一标识表中一行的属性集,则这些属性集称为候选键,只能选择其中一个作为主键,其他候选键称为备用键。如在 "学生信息统计表" 中,"编号""身份证号" 或 "姓名,专业编号" 等都可能是候选键,可将 "编号" 定义为主键。
- 外键:用于建立和加强两个表数据之间的链接,通过将一个表的主键值的一列或多列添加到另一个表中,创建两个表之间的链接,该列即为第二个表的外键。例如,"专业名称表" 中的 "专业编号" 是主键,"学生信息统计表" 中的 "专业编号" 则为外键,"专业名称表" 是主表,"学生信息统计表" 是从表,主表和从表通过外键形成关联。
3.3 数据完整性规则
- 实体完整性规则:要求关系中的元组在主键的属性上不能有空值,否则主键值无法唯一标识元组。如在 "学生信息表" 中,若 "编号" 作为主键,则 "编号" 字段不允许为空。
- 域完整性规则:也称列完整性,指定一个数据集对某一个列是否有效或确定是否允许空值。例如,在 "学生信息表" 中,定义 "性别" 字段只能取值为 "男" 或 "女",防止输入无效值。
- 引用完整性规则:若两个表相互关联,不允许引用不存在的元组。如在学生信息管理系统