一、数据库基础概念:从数据到数据库系统
在信息时代,数据是核心生产要素,而数据库则是高效管理数据的核心工具。我们先从最基础的概念入手,理清数据、表、数据库、数据库管理系统(DBMS)与数据库系统(DBS)之间的关系。
1. 核心概念
- 数据:描述事物的符号记录,是数据库的基本存储单元,比如学生的姓名、年龄、银行账户的余额等,都属于数据范畴。
- 表:由字段(列)和记录(行)组成的二维结构,是存储数据的基本载体。每个表对应现实世界中的一类实体,比如 "学生信息表" 存储所有学生的基础信息,"银行账户表" 存储账户数据。
- 数据库(DB):是多个相互关联的表的集合,以特定方式组织存储,实现数据共享与独立。比如一个学校的数据库会包含学生表、课程表、成绩表等,共同支撑教务管理业务。
- 数据库管理系统(DBMS):是操作和管理数据库的系统软件,提供数据定义、操作、维护等功能,比如 MySQL、Oracle 都是典型的 DBMS。
- 数据库系统(DBS):由硬件、操作系统、数据库、DBMS、应用软件和用户组成的完整系统,是实现数据管理的整体解决方案。
2. 数据库应用分层
在实际业务中,数据库系统通常分为三层架构:
- 数据存储层:由 DBMS 负责数据的物理存储与管理,保证数据的安全性和完整性。
- 应用开发层:开发者通过 DBMS 提供的接口(如 SQL)编写应用程序,实现业务逻辑,比如电商平台的订单系统、银行的转账系统。
- 用户交互层:用户通过应用软件(如 APP、网页)操作数据,无需直接接触数据库底层,比如我们在手机银行查询账户余额,就是通过交互层触发数据库查询操作。
二、数据库发展史:三代数据库
数据库技术从诞生至今已有 60 余年,经历了三次重要的技术迭代,每一代都对应着不同的业务需求和技术突破。
1. 初级阶段:第一代数据库(层次模型与网状模型)
20 世纪 60 年代,为满足大型企业数据管理需求,第一代数据库诞生,主要分为层次模型 和网状模型:
- 层次模型:以树形结构组织数据,适合一对多的关系,比如 IBM 的 IMS 系统,典型应用是银行、金融领域的核心业务系统。
- 网状模型:以图结构组织数据,能表达更复杂的多对多关系,比如美国 CODASYL 提出的网状数据库,适合处理复杂的业务关联。
- 局限性:这一代数据库依赖导航式操作,数据结构复杂,开发和维护成本高,难以适应快速变化的业务需求。
2. 中级阶段:第二代数据库(关系型数据库)
1970 年,IBM 研究员 E.F. Codd 提出关系模型,彻底改变了数据库技术的发展方向,第二代数据库 ------ 关系型数据库成为主流:
- 核心优势:以二维表为基础,用简单的数学关系表达数据关联,通过 SQL(结构化查询语言)实现数据操作,大大降低了开发和维护难度。
- 代表产品:IBM DB2、Oracle、SQL Server、MySQL 等,至今仍是企业级应用的核心选择。
- 技术突破:SQL 成为关系型数据库的标准语言,实现了数据定义(DDL)、数据操作(DML)的标准化,同时完善了数据完整性、事务处理等核心机制。
3. 高级阶段:第三代数据库(新型数据库与混合架构)
随着互联网、大数据、人工智能的发展,传统关系型数据库在高并发、分布式场景下逐渐乏力,第三代数据库应运而生:
- 新型数据库类型:包括面向对象数据库、分布式数据库、时序数据库、图数据库等,比如时序数据库 InfluxDB 适合物联网场景,图数据库 Neo4j 适合社交网络分析。
- 技术融合:传统关系型数据库也在不断演进,比如 Oracle 支持 "关系 - 对象" 模型,MySQL 加入分布式架构插件,同时 NoSQL 与 NewSQL 技术兴起,实现了高并发、高扩展与事务一致性的平衡。
三、经典数据模型:三种核心模型的对比
数据模型是数据库的核心,它定义了数据的组织方式、操作规则和约束条件,目前经典的数据模型有三种:网状模型、层次模型和关系模型。
1. 网状模型:复杂关系的表达者
- 数据结构:以图为基础,用 "数据结构图" 表达实体间的多对多关系,比如银行客户与账户之间的 "一对多"、账户与支行之间的 "一对一" 关系,都能在网状模型中清晰呈现。
- 数据操作:基于导航式操作,需要沿着关系链查询数据,查询效率依赖数据结构,一旦结构变化,查询算法需要重新设计。
- 数据约束:约束分散在各个节点,容易导致数据不一致,通常需要应用程序自行实现约束,开发难度较高。
- 适用场景:适合处理复杂的多对多业务关系,但随着关系型数据库的普及,目前已很少使用。
2. 层次模型:树形结构的有序管理
- 数据结构:是网状模型的特例,以树形结构组织数据,严格遵循 "一对多" 的层级关系,比如企业组织架构(公司 - 部门 - 科室 - 小组)就是典型的层次模型。
- 数据操作:同样是导航式操作,但结构更简单,查询效率比网状模型略高。
- 数据约束:禁止多对多关系,数据结构更规范,但灵活性不足。
- 代表产品:IBM IMS 系统,是历史最悠久的数据库之一,至今仍在部分核心金融系统中使用。
3. 关系模型:现代数据库的基石
- 数据结构 :以二维表为核心,用 "实体 - 关系(E-R)图" 表达数据关联,包含实体、属性、联系三个核心要素:
- 实体:对应现实世界中的独立对象,比如 "银行客户""银行账户",表中的一行数据就是一个实体实例。
- 属性:实体的特征,比如客户的姓名、电话,账户的余额,对应表中的字段。
- 联系:实体之间的对应关系,比如客户与账户之间的 "储蓄" 联系,通过外键实现表间关联。
- 数据操作:基于 SQL 实现,操作简单直观,支持复杂的查询、更新、统计分析,无需关注数据存储的底层细节。
- 数据约束:提供完整的完整性规则,包括实体完整性、域完整性、引用完整性和用户定义完整性,保证数据的一致性和有效性。
- 核心优势:结构简单、理论基础扎实、易于维护,是目前最主流的数据模型,支撑了绝大多数企业级应用。
四、主流数据库产品:关系型与非关系型的选型指南
1. 关系型数据库(RDBMS):成熟稳定的企业级选择
关系型数据库是目前应用最广泛的数据库类型,代表产品及特点如下:
| 产品名称 | 研发公司 | 核心特点 | 适用场景 |
|---|---|---|---|
| MySQL | 原 Sun 公司,现被 Oracle 收购 | 开源免费、性能高、跨平台、支持多线程多用户,基于 C/S 架构 | 中小型网站、Web 应用、互联网创业项目(LAMP 架构核心组件) |
| Oracle | 甲骨文公司 | 功能强大、稳定性高、支持分布式和高可用,适合大型企业级应用 | 金融、电信、电商等核心业务系统 |
| SQL Server | 微软公司 | 与 Windows 系统深度集成,上手简单,适合 Windows 生态企业 | 中小企业信息化、Windows 平台下的业务系统 |
| DB2 | IBM 公司 | 可扩展性强、支持跨平台,在大型企业中市场占有率高 | 金融、保险等大型机构的核心数据管理 |
2. 非关系型数据库(NoSQL):大数据场景的高效解决方案
随着互联网高并发、海量数据的需求,NoSQL 数据库成为关系型数据库的重要补充,核心优势包括:
- 高并发读写能力,适合秒杀、直播等场景;
- 高效存储与检索,支持海量数据的快速处理;
- 高扩展性与高可用性,支持分布式水平扩展。
常见 NoSQL 产品分类:
- 键值型数据库:Redis、Memcached,适合缓存、会话存储等场景,读写速度极快;
- 文档型数据库:MongoDB,存储类似 JSON 的文档,适合内容管理、物联网等灵活结构的数据;
- 列存储数据库:HBase,适合大数据分析、数据仓库场景;
- 图数据库:Neo4j,适合社交网络、知识图谱等复杂关系场景。
3. 数据库选型补充知识点
- 关系型数据库 vs NoSQL:关系型数据库适合强事务、复杂查询的场景,NoSQL 适合高并发、海量数据、结构灵活的场景,实际业务中常采用 "混合架构",比如用 MySQL 存储核心业务数据,Redis 做缓存,MongoDB 存储日志数据。
- NewSQL 技术:是结合了关系型数据库和 NoSQL 优势的新型数据库,比如 TiDB、Spanner,既支持 SQL 语法和事务一致性,又能实现分布式水平扩展,适合云原生场景下的大型应用。
五、关系型数据库核心原理:完整性与表结构设计
1. 关系型数据库的基本结构
关系型数据库以二维表为核心存储结构,核心概念包括:
- 记录(行):描述一个实体的完整信息,比如 "学生信息表" 中的一行代表一个学生;
- 字段(列):描述实体的一个属性,比如学生的 "姓名""年龄";
- 主键:唯一标识表中每一行数据的字段或字段组合,保证实体完整性,比如学生表的 "学号";
- 外键:用于建立表与表之间的关联,引用另一张表的主键,比如学生表的 "专业编号" 引用专业表的 "专业编号" 主键。
2. 数据完整性规则:保证数据一致性的核心
为了让数据库数据与现实世界保持一致,关系型数据库定义了四类完整性规则:
- 实体完整性:主键字段不能为空且唯一,保证每一行数据都能被唯一标识,比如学生表的 "学号" 不能为 NULL,也不能重复。
- 域完整性:限定字段的取值范围和数据类型,比如 "性别" 字段只能取 "男" 或 "女","年龄" 字段必须是正整数。
- 引用完整性:外键必须引用另一张表中存在的主键值,禁止引用不存在的数据,比如学生表的 "专业编号" 必须在专业表中存在。
- 用户定义完整性:根据业务需求自定义的约束,比如 "成绩" 字段必须在 0-100 之间,"手机号" 字段必须符合 11 位数字格式。
3. 表设计规范补充知识点
- 三大范式(3NF) :是关系型数据库表设计的核心规范,目的是减少数据冗余:
- 第一范式(1NF):字段不可再分,保证原子性;
- 第二范式(2NF):在 1NF 基础上,非主键字段完全依赖主键,消除部分依赖;
- 第三范式(3NF):在 2NF 基础上,非主键字段不依赖其他非主键字段,消除传递依赖。
- 反范式设计:在实际业务中,为了提高查询效率,有时会刻意违反范式,增加冗余字段,比如在订单表中存储商品名称,避免多表关联查询,适合读多写少的场景。
六、MySQL 实战:Linux 环境下二进制安装与配置
MySQL 是最流行的开源关系型数据库,下面以 CentOS 系统为例,详细讲解二进制安装、配置与基础操作流程。
1. 基础环境准备
在安装 MySQL 之前,需要完成以下准备工作:
bash
# 1. 安装基础依赖软件包
dnf -y install gcc vim wget net-tools lrzsz tar
# 2. 安装MySQL依赖的库文件
dnf install -y libaio numactl openssl ncurses-compat-libs
# 3. 创建MySQL专用用户
useradd -M -s /sbin/nologin mysql
# 4. 关闭SELinux和防火墙
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
systemctl disable firewalld
systemctl stop firewalld
2. 二进制安装 MySQL
bash
# 1. 下载并解压MySQL二进制包
tar xf mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz
mv mysql-8.0.36-linux-glibc2.28-x86_64 /usr/local/mysql
# 2. 创建数据目录并授权
mkdir /usr/local/mysql/data
chown -R mysql:mysql /usr/local/mysql
# 3. 初始化MySQL(生成随机密码)
cd /usr/local/mysql/bin
./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
注意:初始化完成后,会生成 root 用户的随机密码,需要记录下来,用于后续登录修改密码。
3. 配置 MySQL 与系统服务
bash
# 1. 编辑配置文件/etc/my.cnf
vi /etc/my.cnf
# 配置内容示例:
[client]
socket=/usr/local/mysql/data/mysql.sock
[mysqld]
socket=/usr/local/mysql/data/mysql.sock
bind-address = 0.0.0.0
port = 3306
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
max_connections=2048
character-set-server=utf8
default-storage-engine=INNODB
max_allowed_packet=16M
# 2. 配置环境变量
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profile
# 3. 配置systemd服务
cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
chmod +x /etc/rc.d/init.d/mysqld
# 创建systemd服务文件
vim /lib/systemd/system/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
# 4. 启动并设置开机自启
systemctl daemon-reload
systemctl enable mysqld
systemctl start mysqld
4. MySQL 基础操作
bash
# 1. 登录MySQL(输入初始化时的随机密码)
mysql -u root -p
# 2. 修改root用户密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
FLUSH PRIVILEGES;
# 3. 基础查询操作
SHOW DATABASES; -- 查看所有数据库
USE mysql; -- 切换到mysql数据库
SHOW TABLES; -- 查看当前数据库中的表
SELECT user, host FROM user; -- 查询用户信息
# 4. 退出MySQL
EXIT;
5. 实战补充知识点
- 密码安全 :生产环境中避免使用简单密码,建议使用包含大小写字母、数字和特殊字符的复杂密码,同时限制 root 用户的登录主机(比如只允许localhost登录)。
- 端口与防火墙:MySQL 默认端口为 3306,生产环境中需要通过防火墙限制访问 IP,避免暴露在公网。
- 日志管理:MySQL 包含错误日志、慢查询日志、二进制日志等,通过配置 my.cnf 可以开启日志,用于排查问题和性能优化。
- 备份策略:生产环境中需要定期备份数据,常用的备份方式有 mysqldump、物理备份(如 xtrabackup),保证数据丢失后可恢复。