数据库
数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的资料执行新增、截取、更新、删除等操作。
所谓”数据库”是以一定方式储存在一起、能予多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。一个数据库由多个表空间(Tablespace)构成。
数据库的特点
-
数据组织性: 数据库以一种有组织的方式存储数据,通常使用表格、文档、键值对、图形或列族等数据结构来表示不同类型的数据。
-
数据持久性: 数据库中的数据是持久的,即使系统关闭或重启,数据仍然保留在数据库中。
-
数据独立性: 数据库提供了数据与应用程序的独立性,使数据能够独立于特定应用程序,并且可以通过多个应用程序进行访问和共享。
-
数据共享性: 多个用户和应用程序可以同时访问和共享数据库中的数据,具有适当的权限控制。
-
数据一致性: 数据库确保数据的一致性,通过事务处理来维护数据的完整性和一致性。
-
数据安全性: 数据库提供安全性机制,以确保只有授权用户可以访问和修改数据,并保护数据免受未经授权的访问和恶意操作。
-
数据完整性: 数据库管理数据的完整性,包括验证数据的有效性、约束和规则的执行。
-
数据可恢复性: 数据库具有备份和恢复机制,以应对数据丢失或损坏的情况,以及系统故障或灾难性事件。
-
查询和检索: 数据库提供强大的查询语言和检索功能,允许用户按条件检索和分析数据。
-
多用户支持: 数据库可以支持多个用户同时访问,管理并发访问的机制,以避免数据冲突和竞争条件。
-
事务支持: 数据库支持事务,允许用户执行一系列相关操作,要么全部成功,要么全部失败,以确保数据的一致性和完整性。
-
数据字典: 数据库通常包含数据字典或元数据,用于描述数据库中的表、字段、关系和其他对象。
-
备份和恢复: 数据库提供备份和恢复功能,以防止数据丢失或损坏,并在需要时恢复数据库到之前的状态。
-
扩展性: 数据库可以在需要时扩展,以处理更多的数据和用户,通常可以通过添加硬件资源或采用分布式架构来实现扩展性。
-
性能优化: 数据库系统通常提供性能优化功能,以提高查询和数据访问的速度,包括索引、查询计划和缓存等。
关系型数据库 vs 非关系型数据库
关系型数据库 | 非关系型数据库 | |
---|---|---|
特点 | 以表和表的关联构成的数据结构 | 多种数据模型(文档、键值、列族等) |
优点 | - 能表达复杂的数据关系 - 强大的查询语言,能精确查找想要的数据 |
- 格式灵活 - 海量数据读写效率很高 |
缺点 | - 读写性能比较差,尤其是海量数据的读写 - 数据结构比较死板 |
- 难以表示复杂的数据结构 - 对于复杂查询效率不好 |
用途 | 存储结构复杂的数据 | 存储结构简单的数据 |
代表 | MySQL SQL Server Oracle |
MongoDB Redis Membase |
相关术语
DB
:database 数据库
DBA
:database administrator 数据库管理员
DBMS
:database management system 数据库管理系统
DBS
:database system 数据库系统,DBS
包含 DB、DBA、DBMS
MySQL
MySQL 是一个开放源码的关系数据库管理系统,开源、轻量、快速。
简单命令行使用方式
mysql -u root -p
:进入mysql命令交互show variables like 'character\_set\_%'
:查看当前数据库字符编码- 修改
my.ini
(win) /my.cnf
(macos/linux) 文件中的默认字符编码为utf8mb4
show databases
:查看当前拥有的数据库
图形化数据库管理
常用图形化数据库管理软件 Navicat
数据库的设计
SQL
Structured Query Language
(简写:SQL) 结构化查询语言。 大部分关系型数据,拥有着基本一致的 SQL
语法。
类型
全称 | 操作的对象 | |
---|---|---|
DDL | Data Definition Language 数据定义语言 | 操作数据库对象:库、表、视图、存储过程 |
DML | Data Manipulation Language 数据操控语言 | 操作数据库中的记录 |
DCL | Data Manipulation Language 数据操控语言 | 操作用户权限 |
库和表的管理
现在我们可以使用 Navicat 管理库和表,这里的操作都相对简单,所以不做任何介绍
表的字段
在计算机科学中,包含多个部分的数据(称为记录)可划分为多个字段(数据字段)。关系数据库将数据排列为一组数据库记录,称为行。每条记录由多个字段组成;所有记录的字段构成列。字段示例:姓名、性别、发色。
字段类型
整数类型(Integer Types):
INT
:通常用于存储整数值。SMALLINT
、BIGINT
:用于存储较小或较大范围的整数值。
浮点数类型(Floating-Point Types):
FLOAT
:用于存储单精度浮点数。DOUBLE
或REAL
:用于存储双精度浮点数。
字符类型(Character Types):
CHAR
:用于存储固定长度的字符。VARCHAR
:用于存储可变长度的字符。TEXT
:用于存储较长的文本数据。
日期和时间类型(Date and Time Types):
DATE
:用于存储日期。TIME
:用于存储时间。DATETIME
或TIMESTAMP
:用于存储日期和时间。INTERVAL
:用于表示时间间隔。
布尔类型(Boolean Type):
BOOLEAN
或BOOL
:用于存储真(true)或假(false)值。
二进制类型(Binary Types):
BINARY
:用于存储固定长度的二进制数据。VARBINARY
:用于存储可变长度的二进制数据。BLOB
:用于存储大型二进制对象。
枚举类型(Enum Type):
ENUM
:用于存储一组预定义的值。
集合类型(Set Type):
SET
:用于存储一组预定义的值,但允许多选。
自增类型(Auto-Increment Type):
AUTO_INCREMENT
或SERIAL
:用于生成唯一的自增整数值,通常用作主键。
空类型(Null Type):
NULL
:表示该列可以存储空值。
注:可以设置字段是否有默认值以及是否自动增长(作为主键)
主键和外键
主键(Primary Key):
- 主键是表中的一列或一组列,其值用于唯一标识表中的每一行数据。
- 主键的值不能重复,每行数据都必须具有唯一的主键值。
- 主键的值不能为 NULL(空值)。
- 主键通常用于快速查找、更新和删除表中的特定行,因为它们提供了唯一的标识符。
- 主键不能更改且不能有业务含义
外键(Foreign Key):
- 外键是表中的一列或一组列,它们包含了指向另一个表中主键的值。
- 外键用于建立表与表之间的关联关系,通常用于实现表之间的数据完整性和一致性。
- 外键确保了在引用表中的值存在于目标表的主键中,从而确保了数据的一致性。
- 外键可以用来建立不同表之间的连接(Join),以获取相关数据。
表关系
在关系型数据库中,表关系是指不同表之间的联系和连接方式,用于表示和处理数据之间的关联。有多种类型的表关系,以下是一些常见的表关系类型:
一对一关系(One-to-One Relationship)
- 这种关系表示两个表之间的每个记录在另一个表中都有一个相关记录。
- 通常,一对一关系用于将相关数据拆分到不同的表中以提高数据结构的规范性和可维护性。
一对多关系(One-to-Many Relationship)
- 这种关系表示一个表中的记录可以与另一个表中的多个记录相关联。
- 例如,一个学校的学生表中的每个学生可以关联到成绩表中的多个成绩记录。
多对一关系(Many-to-One Relationship)
- 这种关系与一对多关系相反,表示多个记录可以与另一个表中的一个记录相关联。
- 例如,多个订单可以与一个客户相关联,这种关系常见于订单和客户关系。
多对多关系(Many-to-Many Relationship)
- 这种关系表示一个表中的多个记录可以与另一个表中的多个记录相关联。
- 通常需要通过一个中间表(连接表或关联表)来实现多对多关系。这个中间表包含两个表的主键作为外键,用于建立连接。
- 例如,一个学生可以选择多门课程,而每门课程也可以被多名学生选择,这可以通过一个中间表来表示学生和课程之间的多对多关系。
自引用关系(Self-Referencing Relationship)
- 这种关系表示一个表中的记录与同一表中的其他记录相关联。
- 例如,一个员工表中的员工可能有一个上司,上司也是该员工表中的一条记录,这种自引用关系可以用来构建组织结构。
多层级关系(Hierarchical Relationship)
- 这种关系表示数据具有层次结构,一个记录可以与同一表中的其他记录形成层次关系。
- 常见的示例是组织结构中的上下级关系,如公司中的部门和子部门。
建立正确的表关系是数据库设计的关键部分,它有助于确保数据的完整性、一致性和可查询性。在数据库设计中,可以使用外键来实现表之间的关联,确保数据的引用完整性。数据库管理系统通常提供了查询语言(如
SQL
)来执行跨表查询,以便检索和处理相关数据。
数据库设计范式
数据库设计范式是一组规则和原则,用于帮助数据库设计师将数据库结构进行规范化,以确保数据存储的有效性、一致性和最小冗余。范式通常分为一到五个范式(1NF、2NF、3NF、BCNF、4NF、5NF),每个范式都有其特定的规则和要求。以下是主要的数据库设计范式:
第一范式(1NF - First Normal Form)
- 每个表中的所有列都必须包含原子值(不可再分的数据单元)。
- 该范式消除了重复的列,并确保每个列只包含一个数据项。
第二范式(2NF - Second Normal Form)
- 表必须满足第一范式(1NF)。
- 所有非主键列必须完全依赖于主键。
- 这个范式消除了部分函数依赖,确保每个非主键列与主键之间的关系是直接的。
第三范式(3NF - Third Normal Form)
- 表必须满足第二范式(2NF)。
- 所有非主键列不应该依赖于其他非主键列。
- 这个范式消除了传递依赖,确保非主键列之间没有冗余依赖关系。
巴斯-科德范式(BCNF - Boyce-Codd Normal Form)
- 表必须满足第三范式(3NF)。
- 如果主键不是超键(即不包含其他超键的子集),则表达到 BCNF。
- BCNF 确保主键决定所有其他非主键列,没有部分或传递依赖。
第四范式(4NF - Fourth Normal Form)
- 表必须满足BCNF。
- 该范式解决了多值依赖问题,确保表中的每个非主键列都不依赖于其他非主键列的多值属性。
第五范式(5NF - Fifth Normal Form)
- 也称为投影联接范式(Project-Join Normal Form,PJ/NF)。
- 用于处理多值依赖的更复杂情况,确保表中没有多值依赖。
每个范式都有其自己的优点和应用场景。数据库设计师根据数据模型和需求选择合适的范式。通常,较高范式的表结构更复杂,但可以提供更好的数据完整性和减少冗余,而较低范式可能更容易查询,但可能存在数据冗余和一致性问题。数据库设计是一项复杂的任务,需要仔细权衡这些因素。