基础
基础
什么是数据库, 数据库管理系统, 数据库系统, 数据库管理员?
详情
提示
数据库(Database,DB)
数据库是长期存储在计算机内、有组织、可共享的数据集合。
示例:学校的学生信息库(包含学号、姓名、专业等数据)、社交媒体的用户动态库等。
数据库管理系统(Database Management System,DBMS)
数据库管理系统是用于管理数据库的软件系统,它是用户与数据库之间的接口,负责数据的存储、检索、更新和维护。
常见DBMS举例:MySQL、Oracle、SQL Server、MongoDB等。
数据库系统(Database System,DBS)
数据库系统是由数据库、数据库管理系统、应用程序、用户和硬件组成的完整系统。它是一个集成的整体,各部分协同工作以实现数据的高效管理和应用。
构成:
- 数据库(数据集合)
- 数据库管理系统(核心软件)
- 应用程序(如电商网站、ERP系统,用于用户交互)
- 用户(包括普通用户和数据库管理员)
- 硬件(计算机、存储设备等)
数据库管理员(Database Administrator,DBA)
数据库管理员是负责数据库系统规划、设计、维护和优化的专业人员,主要职责包括:
- 数据库设计与部署:根据业务需求设计数据库结构并搭建系统。
- 性能监控与优化:确保数据库运行高效,解决卡顿、死锁等问题。
- 数据安全与备份:设置权限防止数据泄露,定期备份以应对故障。
- 故障处理:当数据库出现错误(如崩溃)时,及时修复并恢复数据。
- 版本管理:更新DBMS版本,协调应用程序与数据库的兼容性。
相关信息
关系总结
- 数据库是数据的存储载体,DBMS是管理数据的工具,数据库系统是包含所有相关元素的整体,而DBA是保障系统正常运行的管理者。
- 简单来说:DBA通过DBMS管理数据库,这三者共同构成了数据库系统的核心。
什么是元组, 码, 候选码, 主码, 外码, 主属性, 非主属性?
详情
提示
这些概念主要用于定义数据之间的关系、约束和标识。
1. 元组(Tuple)
元组是关系型数据库中表中的一行数据,对应现实世界中的一个具体记录。
- 例如:学生表(学号、姓名、专业)中,“2023001,张三,计算机”这一行就是一个元组。
- 元组中的每个值对应表中的一个字段(列),字段定义了数据的类型(如学号为字符串、年龄为整数)。
2. 码(Key)
码是表中用于标识或关联数据的一个或多个属性(字段)的集合,作用是确保数据的唯一性、完整性或建立表之间的关系。
码就是能唯一标识实体的属性,对应表中的列。
码是一个统称,下面的候选码、主码、外码等都是码的具体类型。
3. 候选码(Candidate Key)
候选码是能唯一标识表中每个元组的属性或属性组合,且满足两个条件:
- 唯一性:表中任意两个元组的候选码值不同(能区分不同记录)。
- 最小性:候选码中不能包含多余的属性(即去掉任何一个属性后,就不再能唯一标识元组)。
示例:
在学生表中,“学号”可作为候选码(唯一标识学生);如果“身份证号”也存在且唯一,那么“身份证号”也是候选码。此时该表有两个候选码。
4. 主码(Primary Key,PK)
主码是从候选码中人为选定的一个用于唯一标识元组的属性或属性组合,也称为主键。
- 主码是候选码的“代表”,一个表只能有一个主码。
- 主码的值不允许重复(唯一性),也不允许为NULL(非空性)。
示例:学生表中若选定“学号”作为主码,则所有学生的学号必须唯一且不能为空;即使“身份证号”也是候选码,也不会被用作主码。
5. 外码(Foreign Key,FK)
外码是一个表中用于关联另一个表的属性或属性组合,作用是建立两个表之间的联系(如父子关系)。
- 外码的值通常对应另一个表的主码值,用于确保数据的参照完整性(即外码值必须在被参照表的主码中存在,或为NULL)。
示例:
- 订单表(订单号,用户ID,商品ID)中,“用户ID”是外码,对应用户表的主码“用户ID”;“商品ID”是外码,对应商品表的主码“商品ID”。
- 若订单表中出现一个“用户ID=100”,但用户表中没有ID为100的用户,则违反参照完整性。
6. 主属性(Prime Attribute)
主属性是包含在任何一个候选码中的属性(即属于候选码的字段)。
- 一个属性只要是某个候选码的组成部分,无论是否被选为主码,都称为主属性。
示例:
- 学生表中,若候选码为“学号”和“身份证号”,则“学号”和“身份证号”都是主属性。
- 若候选码是组合属性(如“课程号+学生号”,用于标识选课记录),则“课程号”和“学生号”都是主属性。
7. 非主属性(Non-prime Attribute)
非主属性是不包含在任何候选码中的属性,即不属于任何候选码的字段。
示例:
- 学生表中,若候选码是“学号”,则“姓名”“专业”“年龄”等字段均为非主属性。
- 若一个表的候选码是组合属性“课程号+学生号”,则“成绩”“选课时间”等字段为非主属性。
相关信息
总结关系
- 元组是“行数据”,码是“标识工具”;
- 候选码是“潜在的唯一标识”,主码是“选定的唯一标识”;
- 外码是“表之间的关联标识”;
- 主属性是“候选码包含的字段”,非主属性是“候选码不包含的字段”。
这些概念共同构成了关系型数据库的完整性约束基础,确保数据的准确性、唯一性和关联性。
数据库范式了解吗?
详情
提示
数据库范式(Normal Forms,NF)是关系型数据库设计中为减少数据冗余、避免操作异常(插入、删除、更新异常) 而遵循的一系列规范。范式的本质是通过对数据表结构的约束,确保数据存储的合理性。
通常所说的范式包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、BC范式(BCNF),以及更高阶的第四范式(4NF)、第五范式(5NF)等。实际应用中,3NF和BCNF最为常用,更高阶的范式因设计复杂度高,较少在业务系统中使用。
前置概念:函数依赖
范式的定义基于“函数依赖”(Functional Dependency,FD),需先理解这一核心概念:
- 函数依赖指:在一个关系(表)中,若属性集X的值确定后,属性集Y的值也唯一确定,则称“X函数决定Y”或“Y函数依赖于X”,记为 X→Y。
- 例:学生表中,“学号→姓名”(一个学号对应唯一姓名);“学号→专业”(一个学号对应唯一专业)。
第一范式(1NF)
定义:关系中的每个属性(列)必须是不可再分的原子值(即“原子性”),且每个属性对应一个值。
核心要求:消除“复合属性”和“多值属性”
- 复合属性:一个属性包含多个子属性(如“地址”包含“省、市、区”)。
- 多值属性:一个属性对应多个值(如“联系方式”包含“电话、邮箱”)。
反例(不符合1NF):
学生号 | 姓名 | 联系方式(多值) | 地址(复合) |
---|---|---|---|
001 | 张三 | 138xxxx, zhang@xx.com | 北京市-海淀区-XX路 |
002 | 李四 | 139xxxx | 上海市-浦东新区-XX街 |
- 问题:“联系方式”是多值属性(包含电话和邮箱),“地址”是复合属性(可拆分为省、市、区),不符合1NF。
改造后(符合1NF):
学生号 | 姓名 | 电话 | 邮箱 | 省 | 市 | 区 |
---|---|---|---|---|---|---|
001 | 张三 | 138xxxx | zhang@xx.com | 北京 | 海淀 | XX路 |
002 | 李四 | 139xxxx | lisi@xx.com | 上海 | 浦东 | XX街 |
- 说明:将“联系方式”拆分为“电话”和“邮箱”,“地址”拆分为“省、市、区”,每个属性均为原子值,符合1NF。
注意:1NF是所有范式的基础,任何关系必须先满足1NF,才能进一步满足更高阶范式。
第二范式(2NF)
定义:在1NF的基础上,所有非主属性完全函数依赖于主码(消除“部分依赖”)。
核心概念:
- 完全依赖:若Y完全依赖于X(X是主码),则Y不能仅依赖于X的一部分(即X的任何子集都不能单独决定Y),记为 X→ₚ Y(ₚ表示部分依赖)。
- 部分依赖:若Y仅依赖于X的某个子集(X是复合主码),则为部分依赖。
反例(符合1NF但不符合2NF):
假设有“选课表”,主码为复合属性(学生号,课程号),结构如下:
学生号 | 课程号 | 学生姓名 | 课程名称 | 成绩 |
---|---|---|---|---|
001 | C01 | 张三 | 数学 | 90 |
001 | C02 | 张三 | 英语 | 85 |
002 | C01 | 李四 | 数学 | 88 |
- 问题分析:
- 非主属性“学生姓名”仅依赖于主码的子集“学生号”(学生号→学生姓名),属于部分依赖;
- 非主属性“课程名称”仅依赖于主码的子集“课程号”(课程号→课程名称),也属于部分依赖;
- 导致冗余:“张三”和“数学”被重复存储,若修改“张三”的姓名,需更新所有相关记录,易产生更新异常。
改造后(符合2NF):
拆分出“学生表”(主码:学生号):
学生号 学生姓名 001 张三 002 李四 拆分出“课程表”(主码:课程号):
课程号 课程名称 C01 数学 C02 英语 保留“选课表”(主码:学生号+课程号),仅保留完全依赖于主码的属性:
学生号 课程号 成绩 001 C01 90 001 C02 85 002 C01 88
- 改造逻辑:将部分依赖的非主属性拆分到独立表中,使剩余非主属性(成绩)完全依赖于复合主码(学生号,课程号)。
第三范式(3NF)
定义:在2NF的基础上,所有非主属性不传递依赖于主码(消除“传递依赖”)。
核心概念:传递依赖
若存在X→Y(Y不依赖于X),且Y→Z,则称Z传递依赖于X(即X→Z通过Y传递)。
反例(符合2NF但不符合3NF):
假设有“学生表”,主码为“学生号”,结构如下:
学生号 | 姓名 | 系号 | 系名 | 系主任 |
---|---|---|---|---|
001 | 张三 | D01 | 计算机 | 王教授 |
002 | 李四 | D01 | 计算机 | 王教授 |
003 | 王五 | D02 | 电子 | 李教授 |
- 问题分析:
- 函数依赖关系:学生号→系号(2NF要求,完全依赖);系号→系名,系号→系主任;
- 因此,学生号→系名(通过系号传递),学生号→系主任(通过系号传递),属于传递依赖;
- 导致冗余:“计算机”“王教授”被重复存储,若系主任更换,需更新所有该系学生的记录,易产生更新异常。
改造后(符合3NF):
保留“学生表”(主码:学生号),仅保留直接依赖于主码的属性:
学生号 姓名 系号 001 张三 D01 002 李四 D01 003 王五 D02 拆分出“系表”(主码:系号),存储传递依赖的属性:
系号 系名 系主任 D01 计算机 王教授 D02 电子 李教授
- 改造逻辑:将传递依赖的非主属性(系名、系主任)拆分到独立表中,使非主属性(系号)仅直接依赖于主码(学生号),消除传递依赖。
BC范式(BCNF,Boyce-Codd Normal Form)
BCNF是3NF的加强版,解决3NF中可能存在的主属性依赖问题。
定义:在一个关系中,对于任何非平凡函数依赖X→Y(Y不包含于X),X必须是超码(超码:包含主码的属性集,能唯一标识元组)。
核心要求:消除主属性对候选码的部分依赖或传递依赖
3NF仅约束非主属性,而BCNF同时约束主属性,确保任何属性(包括主属性)的依赖关系都由超码决定。
反例(符合3NF但不符合BCNF):
假设有“教师授课表”,存储教师、课程、学生的对应关系,候选码为(教师,学生)和(课程,学生)(即主属性为教师、课程、学生),结构如下:
教师 | 课程 | 学生 |
---|---|---|
张老师 | 数学 | 001 |
张老师 | 数学 | 002 |
李老师 | 英语 | 001 |
- 函数依赖分析:
- 已知“张老师只教数学”,即“教师→课程”(张老师→数学,李老师→英语);
- 候选码是(教师,学生)和(课程,学生),因此主属性为教师、课程、学生(无其他非主属性),符合3NF(3NF对主属性无约束);
- 但“教师→课程”中,“教师”不是超码(超码需能唯一标识元组,而一个教师可对应多个学生,无法唯一标识),违反BCNF。
改造后(符合BCNF):
拆分出“教师课程表”(主码:教师):
教师 课程 张老师 数学 李老师 英语 保留“教师学生表”(主码:教师,学生):
教师 学生 张老师 001 张老师 002 李老师 001
- 改造逻辑:将“教师→课程”的依赖关系拆分到独立表中,使每个表的函数依赖都由超码决定(“教师”是“教师课程表”的主码/超码,“教师+学生”是“教师学生表”的主码/超码)。
相关信息
各范式关系与应用建议
- 包含关系:1NF⊇2NF⊇3NF⊇BCNF⊇4NF⊇5NF,即高阶范式自动满足低阶范式。
- 设计目标:范式越高,数据冗余越少,异常问题越少,但表结构越复杂,查询时需更多表连接,可能影响性能。
- 实际应用:
- 多数业务系统设计到3NF即可满足需求,平衡冗余和复杂度;
- 对数据一致性要求极高的场景(如金融、政务),可提升到BCNF;
- 高阶范式(4NF及以上)仅在特殊场景(如数据仓库的维度建模)中使用,需结合业务权衡。
总结
数据库范式是通过消除数据冗余和异常来优化表结构的规则,核心逻辑是:
- 1NF:确保属性原子性;
- 2NF:消除非主属性对主码的部分依赖;
- 3NF:消除非主属性对主码的传递依赖;
- BCNF:消除主属性之间的不当依赖,进一步强化数据一致性。
主键和外键有什么区别?
详情
重要
核心区别
- 主键是“自身的唯一标识”,用于确保表内数据的唯一性和完整性(主键用于唯一标识一个元组,一个表只能有一个主键);
- 外键是“表间的关联桥梁”,用于确保表之间数据的一致性和关联性(外键用来和其他表建立联系用,外键是另一表的主键,一个表可以有多个外键)。
二者结合使用,可有效减少数据冗余(通过关联而非重复存储),并避免插入无效数据(如不存在的用户ID)、删除被引用数据(如删除有订单的用户)等异常问题。
相关信息
相关信息
主键(Primary Key,PK)和外键(Foreign Key,FK)是关系型数据库中用于维护数据完整性和表间关系的核心概念,二者在定义、作用和特性上有显著区别。
1. 定义与核心作用
维度 | 主键(PK) | 外键(FK) |
---|---|---|
定义 | 表中唯一标识一条记录的属性或属性组合(从候选码中选定)。 | 表中用于关联另一个表的属性或属性组合,其值通常对应另一个表的主键。 |
核心作用 | 确保表中记录的唯一性(不重复)和非空性(不为NULL),是表的“唯一身份证”。 | 建立表与表之间的关联关系(如父子关系),确保数据的参照完整性(关联数据必须存在)。 |
2. 关键特性对比
特性 | 主键(PK) | 外键(FK) |
---|---|---|
唯一性 | 必须唯一(表中无重复值),例如“学号”在学生表中唯一。 | 可以重复(对应主表中同一主键的多条关联记录),例如多个订单可关联同一个用户ID。 |
非空性 | 不允许为NULL(必须有值),否则无法标识记录。 | 允许为NULL(表示该记录暂不关联其他表),例如一个订单未分配用户时,用户ID可为NULL。 |
一个表中的数量 | 只能有1个主键(可为单字段或复合字段,如“课程号+学生号”)。 | 可以有多个外键(一个表可关联多个其他表),例如“订单表”可同时关联“用户表”和“商品表”。 |
是否依赖其他表 | 独立存在,不依赖其他表。 | 依赖于被关联表的主键(外键值必须在被关联表的主键中存在,否则违反参照完整性)。 |
复合字段规则 | 若为主键,需满足“最小性”(去掉任何字段后不再唯一)。 | 无“最小性”要求,只要对应被关联表的复合主键即可。 |
3. 示例说明
假设存在三个表:学生表
、课程表
、选课表
,结构如下:
学生表(主键:学号) | 课程表(主键:课程号) | 选课表(主键:选课ID,外键:学号、课程号) | |||
---|---|---|---|---|---|
学号(PK) | 姓名 | 课程号(PK) | 课程名 | 选课ID(PK) | 学号(FK) |
001 | 张三 | C01 | 数学 | 1 | 001 |
002 | 李四 | C02 | 英语 | 2 | 001 |
3 | 002 | ||||
课程号(FK) | 成绩 | ||||
C01 | 90 | ||||
C02 | 85 | ||||
C01 | 88 |
主键示例:
学生表
的“学号”是主键,唯一标识每个学生(001≠002),且不能为空;选课表
的“选课ID”是主键,唯一标识每条选课记录。外键示例:
选课表
的“学号”是外键,关联学生表
的“学号”(确保选课的学生必须存在于学生表中);“课程号”是外键,关联课程表
的“课程号”(确保选的课程必须存在于课程表中)。