【Day 29 】Linux-数据库
一、数据库
(一)相关概念
1、数据库
数据库是存储数据的结构化仓库,其底层依赖文件系统来物理存储数据。但这些文件并非杂乱无章,而是通过特定的数据格式(如索引文件、数据页文件等)和组织方式(如行式存储、列式存储)来管理数据,以实现高效的查询、修改和查询。
维度 | 结构化数据(如关系型数据库) | 非结构化数据(如文本、图片、视频) |
---|---|---|
存储格式 | 固定格式(表、字段、数据类型) | 无固定格式(二进制、自由文本等) |
组织方式 | 按预定义模型和关系组织 | 无序或松散组织,依赖元数据描述 |
查询方式 | 支持 SQL 等结构化查询语言,精准高效 | 依赖全文检索、特征提取等,查询复杂度高 |
2、RDBMS
(1)定义:
关系型数据库管理系统(RDBMS)通过表格(Table) 来组织数据,表格之间通过关系(Relationship) 建立连接。是最常见的数据库类型。
(2)逻辑结构层级(从高到低)
1. 数据库
一个独立的存储空间用于隔离不同业务的数据)。每个数据库包含独立的表、索引、视图等对象,且与其他数据库在逻辑上隔离(默认不共享数据)。
2. 表
数据库中最核心的逻辑单元,以二维表格形式组织数据(行 + 列)。例如 “用户表” 包含 “用户 ID、姓名、手机号” 等列,每一行对应一个用户的具体信息。
3. 行(Row)与列(Column)
- 行(记录,Record):表中的一行数据,对应一个具体实体。
- 列(字段,Field):表中的一列数据,,定义了数据的类型和约束,描述实体的一个属性。
4. 约束(Constraint)
定义:用于限制数据取值的规则,保证数据的完整性、准确性和一致性。分为以下几类:
(1)主键约束(Primary Key)
定义:用于唯一标识表中的每一行记录,是表中记录的 “唯一身份标识”。
核心特性:
- 唯一性:一个表只能定义一个主键(可由单个字段或多个字段组合而成,即 “复合主键”);
- 非空性:主键字段的值不能为
NULL
(必须有具体值);
作用:保障表的实体完整性(确保每条记录都能被唯一区分,无重复或歧义)。
(2)外键约束(Foreign Key)
定义:在两个表之间建立关联关系的字段(或字段组合),子表的外键通过引用父表的特定字段,强制维护表之间的参照完整性(即子表的关联记录必须在父表中真实存在)。
关联对象:子表的外键通常关联父表的主键或唯一键(需能唯一标识父表记录);
作用:避免子表出现 “孤立数据”(即引用了父表中不存在的记录)。
约束规则:
- 插入约束:子表插入新记录时,外键字段的值必须匹配父表中被关联字段的已有值,否则插入失败(例:订单表的 “用户 ID” 必须对应用户表中已存在的 “用户 ID”)。
- 更新约束:若父表中被关联字段的值更新,子表的外键值可按预设规则同步处理(如
ON UPDATE CASCADE
:子表外键值随父表同步更新),避免关联关系失效。 - 删除约束:若删除父表中被关联的记录,子表的外键记录按规则处理,防止孤立数据:
ON DELETE RESTRICT
:禁止删除父表记录(若子表仍有关联);ON DELETE CASCADE
:删除父表记录时,自动删除子表中所有关联记录;ON DELETE SET NULL
:删除父表记录时,将子表外键字段设为NULL
(需外键允许NULL
)。
关联的完整性保障:
- 实体完整性:依赖父表的主键 / 唯一键确保被关联记录的唯一性(子表引用的父表记录唯一)
- 域完整性:外键字段的数据类型、长度必须与父表被关联字段完全一致,避免类型不匹配导致的关联失效。
(3)域约束(Domain Constraint)
定义:用于限制表中单个字段(列) 合法取值范围的约束集合,为字段定义一个 “域”(即允许的取值集合),确保该字段的所有值都属于这个集合,保障字段级数据的合法性。
包含的具体约束类型:
- 数据类型约束:通过定义字段的数据类型(如
INT
、VARCHAR(50)
、DATE
等),限制字段只能存储符合该类型的数据(例:age INT
限制 “年龄” 只能是整数)。 - 非空约束(NOT NULL):限制字段的值不能为
NULL
(必须填写具体内容,例:username VARCHAR(50) NOT NULL
确保 “用户名” 必填)。 - 检查约束(CHECK):通过自定义条件表达式限制字段的取值(如范围、格式等,例:
score DECIMAL(5,2) CHECK (score >= 0 AND score <= 100)
限制 “成绩” 在 0-100 之间)。 - 默认值约束(DEFAULT):为字段指定默认值,当插入记录时未输入此字段的值,自动填充预设值(如 “状态” 默认 “活跃”)。
核心特点:仅作用于单个字段,与其他字段或表无关,专注于保障字段自身取值的合法性。
5. 索引(Index)
定义:逻辑上的 “快速查询工具”,基于表中的一列或多列构建,用于加速数据查询(类似书籍的目录)。索引不改变表的逻辑结构,但过多索引会降低数据写入速度,需按需创建。
6. 视图(View)
定义:由 SQL 查询定义的虚拟表,逻辑上可像表一样查询,但不实际存储数据。
作用:简化复杂查询、隐藏敏感数据(如只显示用户的 “姓名” 而隐藏 “身份证号”)。
7、RDBMS 的核心特性:
ACID (保证数据操作的可靠性)
- 原子性(Atomicity):事务要么全完成,要么全不完成(如转账操作要么双方账户都更新,要么都不更新)。
- 一致性(Consistency):事务执行后,数据从一个合法状态变为另一个合法状态(如余额不能为负)。
- 隔离性(Isolation):多个事务同时执行时,彼此不干扰。
- 持久性(Durability):事务完成后,数据修改永久保存。
8、操作 RDBMS 的标准语言:
SQL(Structured Query Language,结构化查询语言)是管理关系型数据库的标准编程语言。主要功能包括:
- 数据操作:查询、插入、更新、删除数据;
- 结构定义:创建 / 修改 / 删除数据库、表、索引等;
- 权限管理:控制用户对数据库 / 表的访问权限。
9、常见的RDBMS:
国际主流数据库 | 所属主体 | 特点 |
MySQL | 最初由瑞典 MySQL AB 公司开发,后被 Sun 收购,最终随 Sun 被 Oracle 公司收购(现为 Oracle 旗下产品) | 开源免费(社区版),企业版需付费授权,支持关系型数据模型。 轻量、易用,适合中小型应用,广泛用于 Web 开发(如 LAMP/LNMP 架构)。 存储引擎灵活(如 InnoDB 支持事务和外键,MyISAM 侧重读性能) |
MariaDB | 由 MySQL 原开发团队主导,基于 MySQL 分支开发,开源社区维护 | 完全兼容 MySQL(语法、API 一致),可作为 MySQL 的替代方案,避免 Oracle 对 MySQL 的闭源风险。 新增部分特性(如更多存储引擎、性能优化工具),开源免费,社区活跃 |
Percona Server | 由 Percona 公司(开源组织)开发维护 | 基于 MySQL 的增强版,开源免费,兼容 MySQL 生态。 专注性能优化和高可用性,内置 Percona XtraBackup 等工具,适合对性能要求高的场景(如大型电商、金融)。 |
PostgreSQL(简称 Postgres 或 PG) | 开源项目,由加州大学伯克利分校发起,社区维护。 | 高度合规的关系型数据库,支持复杂数据类型(如 JSON、数组、地理信息)和高级特性(如事务、存储过程、复杂查询优化)。 开源免费,稳定性强,适合企业级应用和数据复杂度高的场景(如科研、政务) |
Oracle Database | Oracle 公司(甲骨文)的旗舰产品 | 闭源商业数据库,功能全面(支持分布式事务、高并发、容灾备份),稳定性和安全性极强。 适合超大型企业级应用(如金融、电信核心系统),但 licensing 费用高昂 |
SQL Server | 微软公司开发的商业数据库 | 闭源商业软件,与 Windows 系统、.NET 生态集成紧密,易用性强。 支持关系型和非关系型数据(如 JSON、XML),适合中小型企业及微软技术栈的应用(如ASP.NET开发)。 |
国产数据库 | 所属主体 | 特点 |
达梦数据库(DM) | 武汉达梦数据库股份有限公司 | 完全自主研发,兼容 Oracle 语法和生态,支持事务、高可用和分布式架构。 广泛用于政务、金融等对国产化要求高的领域,满足数据安全合规需求。 |
人大金仓(KingbaseES | 北京人大金仓信息技术股份有限公司,源于中科院计算所研究成果 | 支持关系型数据和多种数据模型,兼容 PostgreSQL 和 Oracle,适配国产化软硬件(如鲲鹏、麒麟系统)。 重点服务政务、能源等行业,强调自主可控和安全性 |
阿里云 OceanBase | 阿里巴巴集团自主研发的分布式数据库 | 原生分布式架构,支持海量数据存储和高并发访问(曾支撑双 11 峰值流量)。 兼容 MySQL 语法,开源社区版与商业版并存,适合互联网、金融等大规模场景。 |
华为高斯数据库(GaussDB) | 华为公司研发的系列数据库产品。 | 涵盖关系型(GaussDB T)、分布式(GaussDB 100)、云原生(GaussDB Cloud)等多种形态。 兼容 Oracle、MySQL 生态,强调与华为硬件(如鲲鹏芯片)的协同优化,服务政企、运营商等领域。 |