数据库基础知识体系:概念、约束、范式与国产产品

数据库基础知识体系:概念、约束、范式与国产产品

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,其核心目标是高效、安全地处理大量数据的增删改查操作,广泛应用于网站后台、企业管理系统、金融交易系统等各类场景。

一、数据库的核心概念

1.数据(Data)

数据库中存储的基本单元,包括数字、文本、图片、音频等多种格式。例如:用户的姓名、年龄、手机号。

2.数据表(Table)

数据库中数据的主要存储形式,采用行(Row)和列(Column) 的二维结构组织数据,类似 Excel 表格。

列(字段 / Field):代表数据的属性,每一列有固定的数据类型(如整数、字符串、日期)。

行(记录 / Record):代表一条完整的数据,是多个字段的组合。

例:用户表(user)

id name age phone
1 张三 25 13800138000
2 李四 30 13900139000

3.数据库管理系统(DBMS)

用于管理数据库的软件,用户通过 DBMS 与数据库交互,执行数据的创建、查询、更新和删除操作。常见的 DBMS 有 MySQL、Oracle、PostgreSQL、SQL Server 等。

4.结构化查询语言(SQL)

操作关系型数据库的标准语言,分为三类核心指令:

数据定义语言(DDL):创建 / 修改 / 删除数据库、表结构,如 CREATEALTERDROP

数据操作语言(DML):增删改数据,如 INSERTDELETEUPDATE

数据查询语言(DQL):查询数据,核心指令为 SELECT

二、数据库的分类

根据数据的存储结构和组织方式,数据库主要分为两大类型:

1. 关系型数据库(RDBMS)

核心特点 :以二维表结构 存储数据,表与表之间通过主键(Primary Key)和外键(Foreign Key) 建立关联关系,支持事务(ACID 特性)和复杂的多表查询。

主键(PK) :唯一标识表中一条记录的字段,不可重复、不可为空,例如用户表的 id

外键(FK) :用于关联两个表的字段,指向另一个表的主键,例如订单表的 user_id 关联用户表的 id

ACID 特性:保证事务的可靠性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

原子性(Atomicity):事务是一个不可分割的最小工作单元,事务中的所有操作要么全部执行成功,要么全部执行失败并回滚到事务执行前的状态。

一致性(Consistency):事务执行前后,数据库的数据完整性约束保持不变,数据始终处于合法、一致的状态。

隔离性(Isolation):当多个事务并发执行时,不同事务之间相互隔离,一个事务的执行不能被其他事务干扰,每个事务都感觉不到其他事务的存在。

持久性(Durability):一个事务一旦提交(Commit),其对数据库中数据的修改就是永久性的,接下来的其他操作或系统故障都不会影响已提交的事务数据。

代表产品:MySQL(开源常用)、Oracle(企业级商用)、PostgreSQL(开源高级特性丰富)、SQL Server(微软生态)。

2. 非关系型数据库(NoSQL)

核心特点:不依赖二维表结构,存储格式灵活(键值对、文档、列族、图形等),主要用于处理海量、高并发、非结构化或半结构化数据,牺牲部分事务一致性换取高性能。

常见类型及代表

类型 存储格式 代表产品 适用场景
键值型 Key-Value Redis 缓存、会话存储、计数器
文档型 JSON/BSON 文档 MongoDB 日志存储、内容管理系统
列族型 列族式存储 HBase 大数据分析、时序数据存储
图形型 节点和边 Neo4j 社交网络、推荐系统

三、数据库的核心功能

1.数据存储

按照预设的结构(如关系型表、NoSQL 文档)持久化存储数据,支持海量数据的高效写入。

2.数据查询

提供灵活的查询能力,支持单表查询、多表关联查询、条件筛选、排序、分页等操作。

3.数据更新与删除

支持对已有数据的修改和删除,保证操作的原子性。

4.事务管理

关系型数据库的核心能力,确保一组操作要么全部成功,要么全部失败,避免数据不一致。

5.权限控制

对不同用户分配不同的操作权限(如只读、读写、管理员权限),保障数据安全。

6.索引优化

通过创建索引(类似书籍的目录),大幅提升数据查询的效率。

四、数据库的常用术语

1.索引(Index)

对表中一个或多个字段的值进行排序的结构,用于加速查询,常见类型有主键索引、唯一索引、普通索引、复合索引。

注意:索引会提升查询速度,但会降低插入、更新、删除的速度,需合理创建。

2.视图(View)

基于一个或多个表的查询结果创建的虚拟表,不存储实际数据,仅保存查询逻辑,可简化复杂查询、限制数据访问范围。

3.存储过程(Stored Procedure)

预编译的 SQL 语句集合,存储在数据库中,可通过名称调用,支持参数传递,能减少网络传输、提高执行效率。

4.触发器(Trigger)

与表关联的特殊存储过程,当表发生 INSERT/UPDATE/DELETE

操作时自动执行,常用于数据校验、日志记录等场景。

5.游标(Cursor)

数据库游标(Cursor):逐行处理数据的 "指针"

游标是关系型数据库中用于逐行读取和处理查询结果集 的数据库对象,它就像一个 "指针"------ 普通的 SELECT 查询会一次性返回所有符合条件的结果集,而游标可以让你精准定位到结果集中的某一行,逐个读取、修改甚至删除该行数据,特别适合处理需要逐行判断或操作的复杂业务逻辑。

(1) 特性

面向行操作:突破 SQL"面向集合" 的特性,将批量结果集拆解为单行处理;

可定位性:支持在结果集中前后移动指针(如移到第一行、最后一行、下一行);

可操作性:部分游标支持修改 / 删除当前指向的行数据;

会话级生命周期:游标绑定到数据库会话,会话结束后游标自动销毁。

(2) 游标的适用场景

游标通常用于普通 SQL 语句难以实现的逐行处理场景,比如:

批量更新数据时,需要根据每行的具体值做不同逻辑判断(如按用户等级调整积分);

逐行读取大结果集,避免一次性加载所有数据导致内存溢出;

数据迁移 / 清洗时,对每行数据做复杂的格式转换或校验。

注意:游标会降低数据库性能(逐行操作比批量操作慢),仅在无法用批量 SQL(如 UPDATE ... WHERE)实现时使用。

(3) 游标的使用步骤

游标使用遵循固定流程:声明 → 打开 → 读取 → 关闭 → 释放

5.数据库三大范式

范式(Normal Form,NF)是判断数据库表结构设计是否合理的标准,遵循的范式级别越高,数据冗余越低,但多表关联的复杂度会上升。

第一范式(1NF):原子性

定义 :表中的每一列都必须是不可再分的原子数据项,不能存在复合字段或多值字段。

反例:用户表中设计 contact 字段存储 电话-邮箱,违反原子性。

id name contact
1 张三 13800138000-zhangsan@xxx.com

正例:拆分为独立字段,满足原子性。

id name phone email
1 张三 13800138000 zhangsan@xxx.com
第二范式(2NF):唯一性

定义:在满足 1NF 的基础上,非主键字段必须完全依赖于主键,而不能依赖于主键的一部分(主要针对联合主键场景)。

前提:当表的主键是多个字段的组合(联合主键)时,才会涉及 2NF 的判断。

反例:订单明细表(联合主键:order_id + product_id)中包含 user_name 字段。

order_id product_id product_name user_name price
1001 2001 小米手机 张三 2999
1001 2002 华为耳机 张三 399
问题:user_name 只依赖 order_id(订单属于哪个用户),不依赖 product_id,违反 2NF。

正例:拆分表,消除部分依赖。

订单表(order_id 为主键):存储订单与用户的关联

order_id user_name order_time
1001 张三 2025-01-01

订单明细表(联合主键:order_id + product_id):存储订单与商品的关联

order_id product_id product_name price
1001 2001 小米手机 2999
1001 2002 华为耳机 399
第三范式(3NF):传递性

定义:在满足 2NF 的基础上,非主键字段不能传递依赖于主键,即非主键字段之间不能存在依赖关系。

传递依赖:A → B,B → C → 则 A → C(A 是主键)。

反例:用户表(user_id 为主键)中包含 city和 province字段。

user_id user_name city province
1 张三 深圳市 广东省
问题:province 依赖 citycity 依赖 user_idprovince 传递依赖于 user_id,存在冗余(多个深圳用户会重复存储 "广东省")。

正例:拆分表,消除传递依赖。

用户表

user_id user_name city_id
1 张三 1

城市表(city_id 为主键)

city_id city province
1 深圳市 广东省

5.数据库的完整性约束

数据库的完整性约束是指为了保证数据库中数据的正确性、一致性和有效性,对数据表及数据操作施加的一系列规则限制。其目标是防止非法、无效的数据进入数据库,避免因数据错误导致业务逻辑异常。

分类:
(1) 实体完整性约束(Entity Integrity)

目标:保证表中每条记录都是唯一可识别的,即主键字段的唯一性和非空性。

约束类型:

主键约束(PRIMARY KEY):

定义:表的主键字段必须唯一且非空,一个表只能有一个主键(可以是单一字段或联合字段)。

示例:

sql 复制代码
CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT, -- 主键约束,自增保证唯一性
    name VARCHAR(20) NOT NULL
);

唯一约束(UNIQUE):

定义:保证字段值唯一,但允许单个空值(NULL)(多个 NULL 不视为重复),一个表可以有多个唯一约束。

示例:用户手机号不能重复

sql 复制代码
CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    phone VARCHAR(11) UNIQUE -- 唯一约束
);

区别:主键约束 = 唯一约束 + 非空约束;唯一约束可用于非主键的唯一标识字段(如手机号、邮箱)。

(2) 域完整性约束(Domain Integrity)

目标:保证表中字段的值符合预设的类型和规则,限制字段的取值范围、数据类型、格式等。

常见约束类型:

约束类型 作用 示例
数据类型约束 限制字段的数据类型(如 INT、VARCHAR、DATE) age INT(年龄必须是整数)
非空约束(NOT NULL) 字段值不能为 NULL name VARCHAR(20) NOT NULL
默认值约束(DEFAULT) 字段未赋值时,自动填充默认值 status TINYINT DEFAULT 0(状态默认 0)
检查约束(CHECK) 限制字段值的范围或条件(MySQL 8.0 后正式支持) age INT CHECK (age > 0 AND age < 150)

示例:定义用户表的域约束

sql 复制代码
CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL, -- 非空约束
    age INT CHECK (age > 0), -- 检查约束:年龄必须大于0
    gender CHAR(1) DEFAULT '未知' -- 默认值约束
);
(3) 参照完整性约束(Referential Integrity)

目标:保证表与表之间的关联关系有效,防止出现孤立的外键数据,维护数据的一致性。

约束类型:

外键约束(FOREIGN KEY)

定义:子表的外键字段必须引用父表的主键或唯一键字段,外键值必须是父表中已存在的值,或为 NULL(若允许)。

关联操作:当父表数据被修改 / 删除时,可配置外键的联动策略:

  • ON DELETE CASCADE:父表删除数据,子表关联数据自动删除
  • ON UPDATE CASCADE:父表更新主键,子表关联外键自动更新
  • ON DELETE SET NULL:父表删除数据,子表外键设为 NULL

示例:订单表(子表)关联用户表(父表)

sql 复制代码
-- 父表:用户表
CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL
);

-- 子表:订单表,外键关联用户表id
CREATE TABLE order_info (
    order_id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT,
    order_time DATETIME,
    -- 外键约束
    FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE
);

注意:高并发场景中,为提升写入性能,部分系统会取消数据库外键约束,改为在业务代码中维护参照完整性。

(4) 用户定义完整性约束

目标:满足特定业务场景的自定义规则,是对上述三类约束的补充。

常见场景:

密码长度必须大于 6 位

邮箱格式必须符合 xxx@xxx.xxx

订单金额必须大于 0

实现方式:

  1. 简单规则可通过 CHECK 约束实现;
  2. 复杂规则可通过触发器(TRIGGER)存储过程实现;
  3. 也可在业务代码层进行校验(如后端接口参数校验)。
(5) 自定义完整性约束(业务层补充)

在实际开发中,部分复杂的完整性规则无法通过数据库原生约束实现,需要在业务代码中完成,例如:

同一个用户不能在 1 分钟内重复下单

转账时,转出账户余额不能小于转账金额

五、数据库的应用场景

互联网领域:用户信息、订单数据、商品信息的存储与查询(如电商、社交平台)。

企业管理:员工档案、财务数据、客户关系管理(CRM)系统。

大数据领域:海量日志数据、时序数据的存储与分析(如 HBase+Spark)。

物联网(IoT):设备采集的传感器数据存储与实时监控。

六、学习数据库的路径

掌握SQL 语法 :熟练使用 SELECTINSERTUPDATEDELETE 及多表关联查询(JOIN)。

理解关系型数据库设计原则:遵循三大范式,合理设计表结构、主键、外键。

学习数据库优化:索引设计、查询语句优化、分库分表、读写分离等。

了解NoSQL 数据库:根据业务场景选择合适的非关系型数据库,掌握其核心操作。

七、国产数据库

1、金融级分布式事务数据库(OLTP 核心)

产品 厂商 核心特性 典型场景
OceanBase 蚂蚁集团 原生分布式、强一致性、TPC-C 世界纪录、兼容 MySQL/Oracle 银行核心交易、支付清算、证券核心系统
TDSQL 腾讯云 金融级高可用、分布式扩展、HTAP 融合、多副本容错 银行信用卡核心、保险保单系统、政务支付
GoldenDB 中兴通讯 分布式事务强一致、证券交易市占率领先 证券交易、银行理财、基金清算

2、传统全栈自研数据库(信创核心)

产品 厂商 核心特性 典型场景
达梦 DM 达梦数据 全栈自研、高安全(等保四级)、兼容 Oracle 政务云、军工、国家电网、南方航空
人大金仓 KingbaseES 电科金仓 兼容 PostgreSQL/Oracle、适配国产芯片 政务核心系统、能源调度、军工管理
南大通用 GBase 南大通用 列式存储、MPP 并行计算、PB 级分析 电信数据仓库、金融风控、政务大数据

3、云原生数据库(云场景主流)

产品 厂商 核心特性 典型场景
PolarDB 阿里云 存储计算分离、秒级扩容、AI 融合优化 电商高并发、SaaS 多租户、政企云平台
GaussDB/openGauss 华为 全栈自主、OLTP/OLAP 双场景、鲲鹏优化 省级政务云、电信核心网、金融数据分析
TiDB 平凯星辰 MySQL 兼容、HTAP、弹性扩展、分布式 SQL 互联网中台、金融风控、物流调度

4、其他特色数据库

分析型:GBase 8a(南大通用,列式存储,适配数据仓库)、TDengine(时序数据,物联网 / 工业监控)。

时序 / 物联网:TDengine(高效时序存储,电力 / 车联网)、InfluxDB(国产适配版,监控数据)。

多模:GBase 8c(南大通用,多模多态分布式,适配混合负载)。


5、选型

场景匹配:金融核心选 OceanBase/TDSQL;政务信创选达梦 / 人大金仓;云原生选 PolarDB/GaussDB;HTAP 选 TiDB/TDSQL。

生态适配:优先适配国产芯片(龙芯、飞腾)、操作系统(麒麟、统信)与中间件。

性能与成本:分布式适合海量高并发;云原生适合弹性扩缩;传统架构适合稳态核心系统。

相关推荐
PXM的算法星球2 小时前
【操作系统】哲学家就餐问题实现详解
java
2301_815357702 小时前
Java项目架构从单体架构到微服务架构的发展演变
java·微服务·架构
Ethan-D2 小时前
#每日一题19 回溯 + 全排列思想
java·开发语言·python·算法·leetcode
山峰哥2 小时前
数据库工程核心:SQL调优让查询效率飙升的实战密码
网络·汇编·数据库·sql·编辑器
Echoo华地2 小时前
idea运行程序默认线程为daemon线程的问题
java·ide·intellij-idea
歪楼小能手3 小时前
Android16系统go版关闭重力旋转开关后缺失手动旋转屏幕悬浮按钮
android·java·平板
Coder_Boy_3 小时前
基于SpringAI的在线考试系统-DDD业务领域模块设计思路
java·数据库·人工智能·spring boot·ddd
曹轲恒3 小时前
SSM项目的部署
java·ssm
青小莫3 小时前
C语言vsC++中的动态内存管理(内含底层实现讲解!)
java·c语言·c++