Skip to content

sql-rdbms-concepts

SQL - 关系型数据库管理系统概念 (RDBMS Concepts)

Section titled “SQL - 关系型数据库管理系统概念 (RDBMS Concepts)”

本章介绍了关系型数据库管理系统 (RDBMS) 的基础概念,它们是 SQL 的支柱。在开始编写查询之前,理解这些核心思想至关重要。

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姓名年龄薪水城市国家
1Ramesh322000.00HyderabadIndia
2Mukesh405000.00New YorkUSA
3Sumit454500.00MuscatOman

在这个表中,ID、Name、Age 是列。‘Ramesh’ 的条目是一行。

表中的 NULL 值表示缺失或未知数据。它是字段中不存在值时的占位符。

理解 NULL 与零值 (0) 或空格字符串 (' ') 不同至关重要。带有 NULL 值的字段是在记录创建时留空的字段。在比较中处理 NULL 时必须特别小心,因为 NULL 不等于任何东西,甚至不等于另一个 NULL。

约束 (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 约束来实现。

数据库范式化 (Database normalization) 是指构建关系型数据库以减少数据冗余和提高数据完整性的过程。它涉及将大型表分解为更小、结构良好的表,并定义它们之间的关系。

主要目标是:

  • 消除冗余数据: 将同一数据片段只存储在一个地方。
  • 确保逻辑数据依赖性: 确保相关数据存储在一起。

范式化组织成一系列的“范式 (Normal Forms)”。对于大多数应用程序来说,达到第三范式 (3NF) 就足够了。

  • 第一范式 (1NF): 确保表是原子的。每个单元格应包含单个值,并且每个记录应是唯一的。
  • 第二范式 (2NF): 表必须处于 1NF,并且所有非键属性必须完全函数依赖于主键。
  • 第三范式 (3NF): 表必须处于 2NF,并且所有属性必须仅依赖于主键,而不是其他非键属性。

在现代开发环境中,管理数据库不仅仅是编写 SQL 查询。关键实践包括:

  • Schema 版本控制: 数据库 schema(CREATE TABLE 语句、约束等)应存储在像 Git 这样的版本控制系统 (version control system) 中。
  • 迁移工具: Flyway 或 Liquibase 等工具用于以自动化和可重复的方式在不同环境(开发、测试、生产)中应用和跟踪 schema 更改。