sql-rdbms-concepts
SQL - 关系型数据库管理系统概念 (RDBMS Concepts)
Section titled “SQL - 关系型数据库管理系统概念 (RDBMS Concepts)”本章介绍了关系型数据库管理系统 (RDBMS) 的基础概念,它们是 SQL 的支柱。在开始编写查询之前,理解这些核心思想至关重要。
什么是 RDBMS?
Section titled “什么是 RDBMS?”RDBMS 是 Relational Database Management System(关系型数据库管理系统)的缩写。它是一种存储和提供对相互关联的数据点访问的数据库类型。关系模型由 E. F. Codd 于 1970 年构想,它将数据组织成一个或多个由列和行组成的表,其中每个行都有一个唯一键标识。
RDBMS 是 SQL 和所有现代数据库系统的基础。常见的例子包括:
- 开源: PostgreSQL、MySQL、MariaDB、SQLite
- 商业: Oracle Database、Microsoft SQL Server、IBM Db2
- 云端: Amazon RDS、Google Cloud SQL、Azure SQL Database、Snowflake、Amazon Redshift
表、行和列 (Tables, Rows, and Columns)
Section titled “表、行和列 (Tables, Rows, and Columns)”在 RDBMS 中,数据存储在称为表 (tables) 的数据库对象中。表是相关数据的集合,以网格状格式组织,由列和行组成。
- 列 (Column)(也称为字段 Field 或属性 Attribute)是一个垂直实体,它定义了每个记录的特定数据类型(例如,
last_name、hire_date)。 - 行 (Row)(也称为记录 Record 或元组 Tuple)是一个水平实体,代表表中的一个单一项目(例如,关于一个特定客户的所有信息)。
下面是一个 CUSTOMERS(客户)表的示例:
| ID | 姓名 | 年龄 | 薪水 | 城市 | 国家 |
|---|---|---|---|---|---|
| 1 | Ramesh | 32 | 2000.00 | Hyderabad | India |
| 2 | Mukesh | 40 | 5000.00 | New York | USA |
| 3 | Sumit | 45 | 4500.00 | Muscat | Oman |
在这个表中,ID、Name、Age 是列。‘Ramesh’ 的条目是一行。
理解 NULL 值
Section titled “理解 NULL 值”表中的 NULL 值表示缺失或未知数据。它是字段中不存在值时的占位符。
理解 NULL 与零值 (0) 或空格字符串 (' ') 不同至关重要。带有 NULL 值的字段是在记录创建时留空的字段。在比较中处理 NULL 时必须特别小心,因为 NULL 不等于任何东西,甚至不等于另一个 NULL。
SQL 约束:强制数据规则
Section titled “SQL 约束:强制数据规则”约束 (Constraints) 是应用于表中数据列的规则,以确保数据的准确性和可靠性。它们限制了可以输入到表中的数据类型。
- NOT NULL: 确保列不能有
NULL值。 - UNIQUE: 确保列(或一组列)中的所有值都不同。
- PRIMARY KEY(主键):
NOT NULL和UNIQUE的组合。它唯一标识表中的每一行。 - FOREIGN KEY(外键): 唯一标识另一个表中的行,创建两个表之间的链接。
- CHECK: 确保列中的所有值都满足特定条件(例如,
age > 18)。 - DEFAULT: 当未指定值时,为列提供默认值。
虽然 INDEX 有时与约束一起列出,但其主要目的是性能。它允许数据库非常快速地查找和检索数据,而不是强制执行数据完整性规则。
数据完整性 (Data integrity) 是指数据的整体准确性、完整性和一致性。RDBMS 通过使用约束来维护数据完整性:
- 实体完整性 (Entity Integrity): 确保表中没有重复的行。由
PRIMARY KEY强制执行。 - 域完整性 (Domain Integrity): 通过限制数据类型、格式或值范围来强制列的有效条目。由数据类型、
CHECK和NOT NULL约束强制执行。 - 参照完整性 (Referential Integrity): 确保表之间的关系保持一致。如果一行被另一个表中的其他记录使用,则不能删除该行。由
FOREIGN KEY强制执行。 - 用户定义完整性 (User-Defined Integrity): 强制执行其他类型未涵盖的特定业务规则。通常通过触发器 (triggers) 或复杂的
CHECK约束来实现。
数据库范式化:简介
Section titled “数据库范式化:简介”数据库范式化 (Database normalization) 是指构建关系型数据库以减少数据冗余和提高数据完整性的过程。它涉及将大型表分解为更小、结构良好的表,并定义它们之间的关系。
主要目标是:
- 消除冗余数据: 将同一数据片段只存储在一个地方。
- 确保逻辑数据依赖性: 确保相关数据存储在一起。
范式化组织成一系列的“范式 (Normal Forms)”。对于大多数应用程序来说,达到第三范式 (3NF) 就足够了。
- 第一范式 (1NF): 确保表是原子的。每个单元格应包含单个值,并且每个记录应是唯一的。
- 第二范式 (2NF): 表必须处于 1NF,并且所有非键属性必须完全函数依赖于主键。
- 第三范式 (3NF): 表必须处于 2NF,并且所有属性必须仅依赖于主键,而不是其他非键属性。
现代数据库实践
Section titled “现代数据库实践”在现代开发环境中,管理数据库不仅仅是编写 SQL 查询。关键实践包括:
- Schema 版本控制: 数据库 schema(
CREATE TABLE语句、约束等)应存储在像 Git 这样的版本控制系统 (version control system) 中。 - 迁移工具: Flyway 或 Liquibase 等工具用于以自动化和可重复的方式在不同环境(开发、测试、生产)中应用和跟踪 schema 更改。