1.数据库相关介绍
数据库的选择通常取决于具体的应用需求,如性能、扩展性、数据一致性和易用性等因素。
1. 关系型数据库(RDBMS)
-
MySQL:
- 广泛使用的开源数据库,支持大多数操作系统。
- 强调易用性、灵活性和广泛的社区支持。
- 主要用于Web应用。
-
PostgreSQL:
- 另一种强大的开源关系型数据库,以其稳定性和高级功能(如高级索引、全文搜索、JSON支持)著称。
- 通常被视为企业级数据库,支持更复杂的查询和更大的数据量。
-
Oracle Database:
- 企业级商业数据库解决方案,提供全面的特性支持,包括高级数据管理、安全性和可靠性。
- 常用于需要高事务处理和复杂查询操作的大型企业和金融机构。
-
Microsoft SQL Server:
- 面向企业的数据库产品,集成了大量管理工具,优化了.NET环境的数据操作。
- 常用于企业环境,与其他Microsoft产品(如Excel和Power BI)有很好的集成性。
2. 非关系型数据库(NoSQL)
-
MongoDB:
- 文档型数据库,以其高性能、高可扩展性和易用性著称。
- 数据以类似JSON的格式存储,使其在处理大规模数据集时非常灵活。
-
Cassandra:
- 高度可扩展的分布式NoSQL数据库,设计用于处理大量数据 across many commodity servers.
- 提供高可用性而不牺牲性能,适合需要大规模数据分布的应用。
-
Redis:
- 开源的键值存储数据库,常用作数据缓存和消息队列。
- 支持数据结构如字符串、列表、集合、散列等。
主要区别
-
数据结构:
- 关系型数据库使用表格和行的结构,适合需要执行复杂查询的应用。
- 非关系型数据库(如文档、键值、宽列存储)则更灵活,适合于非结构化数据。
-
事务性:
- 关系型数据库支持ACID属性(原子性、一致性、隔离性、持久性),确保数据的完整性。
- 部分非关系型数据库牺牲了事务性以换取性能和扩展性。
-
扩展性:
- 关系型数据库通常扩展性较差,尤其是垂直扩展。
- 非关系型数据库设计为水平扩展,可以通过增加更多服务器来增加容量。
-
查询能力:
- 关系型数据库支持复杂的查询语言(如SQL),适合复杂的数据分析。
- 非关系型数据库的查询功能比较基础,主要优化了读/写操作的速度。
选择哪种数据库取决于具体项目的需求,如数据模型、预期负载、扩展需求等。理解每种数据库的特点和局限是选择最合适数据库的关键。
2. MySQL 数据类型
数值类型
- 整数类型:
INT
,SMALLINT
,TINYINT
,MEDIUMINT
,BIGINT
。有符号范围从-128
到127
(TINYINT
),无符号范围从0
到255
。 - 定点数类型:
DECIMAL
,NUMERIC
。可以精确表示。 - 浮点数类型:
FLOAT
,DOUBLE
。用于表示有小数点的数值。
字符串类型
- 文本类型:
CHAR
,VARCHAR
(可变长度字符串)。 - 长文本类型:
TEXT
,BLOB
,以及它们的变种TINYTEXT
,MEDIUMTEXT
,LONGTEXT
。
日期和时间类型
- 日期类型:
DATE
(仅日期),DATETIME
(日期和时间),TIMESTAMP
(时间戳,具有时区支持),TIME
(时间),YEAR
(年份)。
ENUM 和 SET
- ENUM:列出所有可能的值。
- SET:允许选择多个值,类似于一个包含多个预定义值的集合。
3. MySQL 运算符
算数运算符
- 基本运算:
+
,-
,*
,/
,%
(取余)
逻辑运算符
AND
,OR
,NOT
,用于条件组合。
比较运算符
=
,!=
或<>
(不等于),>
,<
,>=
,<=
,BETWEEN
,LIKE
,IN
。
4. MySQL 常用函数
字符串函数
CONCAT()
:串联字符串。LENGTH()
:返回字符串的字节长度。SUBSTRING()
:截取部分字符串。LOWER()
、UPPER()
:转换字母大小写。
数值函数
ABS()
:绝对值。ROUND()
:四舍五入。CEIL()
、FLOOR()
:向上/向下取整。
时间和日期函数
NOW()
:当前的日期和时间。CURDATE()
:当前日期。DATEDIFF()
:计算两个日期之间的差。
聚合函数
SUM()
:求和。AVG()
:平均值。COUNT()
:计数。MAX()
、MIN()
:最大值、最小值。
5. MySQL 完整性约束
完整性约束的类型包括:
- PRIMARY KEY:主键,唯一标识表中的每一行。
- FOREIGN KEY:外键,引用另一个表的主键。
- UNIQUE:唯一约束,保证数据的唯一性。
- NOT NULL:非空约束,保证列不接受 NULL 值。
- CHECK:检查约束(在MySQL 8.0.16及以上版本中支持),限制列中值的范围。
test:
CREATE TABLE user (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT '用户的主键id',
nickname VARCHAR(50) UNIQUE NOT NULL COMMENT '用户的昵称',
age TINYINT UNSIGNED NOT NULL DEFAULT 18 COMMENT '用户的年龄,默认为18',
sex ENUM('male', 'female') NOT NULL COMMENT '用户的性别'
);
- id:一个无符号整数(INT UNSIGNED),设定为自动递增(AUTO_INCREMENT)。作为主键,用来唯一标识表中的每一行。
- nickname:一个长度为50的字符串,设定为唯一(UNIQUE)且不允许为空(NOT NULL)。用来存储用户的昵称。
- age:一个无符号的小整数(TINYINT UNSIGNED),不允许为空(NOT NULL),默认值为18。用来存储用户的年龄。
- sex:一个枚举类型(ENUM),只允许为'male'或'female',不允许为空。用来表示用户的性别。
6. 关系型数据库表设计(关系模型)
关系型数据库的表设计涉及到如何合理地组织数据以及各个数据表之间的关联关系。根据关联性质,关系可以分为三种类型:
- 一对一关系:一个表中的记录只与另一个表中的一条记录相关联。例如,用户表和用户详情表,每个用户只有一个详细信息记录,反之亦然。
- 一对多关系:一个表中的记录可以与另一个表中的多条记录相关联。最典型的例子是,用户表和订单表,一个用户可以有多个订单,但每个订单只能属于一个用户。
- 多对多关系:一个表中的记录可以与另一个表中的多条记录相关联,反之亦然。例如,学生表和课程表,一个学生可以注册多门课程,一门课程也可以由多个学生注册。通常通过一个中间表来实现这种关系,如学生课程关系表。
7. 关系型数据库范式
范式(Normalization)是为了减少数据库中数据冗余和改善数据结构设计的一系列规则。主要范式包括:
- 第一范式(1NF):表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即属性的原子性。
假设有一个学生参与的课程表如下:
学生ID | 学生姓名 | 课程 |
---|---|---|
1 | 张三 | 数学, 物理 |
这个表不满足第一范式,因为课程列有多个值。为了满足1NF,需要将课程列分解为不可分割的单个项:
学生ID | 学生姓名 | 课程 |
---|---|---|
1 | 张三 | 数学 |
1 | 张三 | 物理 |
- 第二范式(2NF):在1NF的基础上,非主属性完全依赖于主键,消除了非主属性对主键的部分依赖。
例子: 假设有一个学生参与的课程表如下:
学生ID | 学生姓名 | 课程 |
---|---|---|
1 | 张三 | 数学, 物理 |
这个表不满足第一范式,因为课程列有多个值。为了满足1NF,需要将课程列分解为不可分割的单个项:
学生ID | 学生姓名 | 课程 |
---|---|---|
1 | 张三 | 数学 |
1 | 张三 | 物理 |
- 第三范式(3NF):在2NF的基础上,任何非主属性不依赖于其他非主属性,消除了传递依赖。
假设现有订单明细表:
订单ID | 产品ID | 产品名称 | 产品制造商 |
---|---|---|---|
1001 | 01 | 笔记本电脑 | 联想 |
1001 | 02 | 鼠标 | 罗技 |
产品名称和产品制造商都依赖于产品ID,这是一个传递依赖。为满足3NF,需要进一步分解表:
产品表:
产品ID | 产品名称 | 产品制造商 |
---|---|---|
01 | 笔记本电脑 | 联想 |
02 | 鼠标 | 罗技 |
订单明细表仅保留产品ID:
订单ID | 产品ID |
---|---|
1001 | 01 |
1001 | 02 |
- Boyce-Codd范式(BCNF):更严格的3NF,要求表中的每一个决定因素都是候选键,处理复杂的依赖和冗余问题。
如果在上面的产品表中,产品ID和产品名称都可以唯一确定记录,并且存在如下依赖:产品ID → 产品名称,产品名称 → 产品制造商。该表不满足BCNF,因为产品名称也能决定产品制造商。我们需要进一步规范化以满足BCNF:
产品表:
产品名称 | 产品制造商 |
---|---|
笔记本电脑 | 联想 |
鼠标 | 罗技 |
- 第四范式(4NF):在BCNF的基础上,消除表中的多值依赖。
假设一个教师可教授多个课程,并且有多个研究领域。这些信息存在多值依赖。
教师ID | 课程 | 研究领域 |
---|---|---|
T01 | 数学, 物理 | 代数, 力学 |
教师课程表:
教师ID | 课程 |
---|---|
T01 | 数学 |
T01 | 物理 |
教师研究领域表:
教师ID | 研究领域 |
---|---|
T01 | 代数 |
T01 | 力学 |
这样的设计确保了每张表中只含有与主键相关的多值依赖,避免了非主键属性间的依赖,符合第四范式的要求。通过这种分解,我们可以更有效地管理和维护数据,同时减少数据冗余和更新异常。