从块到意义:数据项与数据库
Source: Dev.to
请提供您希望翻译的具体文本内容,我才能为您进行简体中文翻译。
Introduction
你好,我是Maneshwar。 我正在开发 FreeDevTools online,目前正在构建 一个集所有开发工具、技巧代码和 TLDR 于一体的地方——一个免费、开源的中心,开发者可以快速找到并使用工具,而无需在互联网上四处搜索。
昨天我们把注意力放在磁盘的物理现实上——块、扇区、寻道时间,以及为什么存储会慢且不可靠。这为许多数据库设计选择提供了 为什么 的解释。
现在是时候向上提升一个层次了。
在讨论表、索引或事务之前,我们需要了解 数据库实际存储的内容 以及 这些存储状态正确意味着什么。这从最基本的信息单元——数据项 开始。
数据项:信息的起点
数据项是任何携带信息的东西。信息本身由该数据项中存储的 value 表示,而我们赋予该值的含义使其变得有用。
在实际使用中,我们常常把 data、value 和 information 这几个词交替使用,尽管它们在概念上是不同的。
数据项示例
- 一个整数
- 一个人的名字
- 一个房屋地址
- 一个二进制 blob
- 一个表格
- 更抽象的东西
粒度
数据项的大小 称为其 granularity。粒度定义了单个数据项能够携带多少信息。
| 示例 | 可能的大小 |
|---|---|
| Integer | 1、2、4 或 8 字节 |
| String | 几十到几千字节 |
| Blob | 任意大 |
在大多数数据库讨论中,数据项被 抽象 地对待——它们的确切大小或含义通常不作规定。这种抽象是有意为之:它让数据库系统能够在不受具体表示限制的情况下推理正确性和性能。
数据项的核心属性
- 位置 – 位于存储的某处
- 标识符 – 具有用于引用的 name 或 address
- 类型 – 定义允许的值以及允许的操作
至少,每个数据项必须支持:
- 读取其当前值
- 用新值覆盖它
这种简单的读取和覆盖能力,在加入持久化和并发后,就足以构建出令人惊讶的复杂系统。
从数据项到数据库
数据库 不仅仅是数据项的容器。它是 一个包含许多相互关联的持久化数据项的单一仓库。
数据库中的数据项很少是孤立存在的。它们的取值通过 关系 互相连接,而这些关系受 完整性约束 的约束——这些规则定义了哪些取值组合是被允许的。
在某一时刻,所有数据项的完整取值集合定义了 数据库状态。如果 所有数据项都满足所有已定义的完整性约束,则该数据库状态被称为 一致的。
为什么一致性很重要
数据库不仅仅存储值;它在特定时间点上 表示一个真实世界的系统。
- 大学示例 – 对学生、课程、教师和选课进行建模
- 一致的状态 对应于一个真实、有效的大学情景
- 不一致的状态 表示在现实世界中不可能存在的情况
数据库系统的工作不仅是存储数据,还要 防止不可能的世界被写入磁盘。
数据库操作与状态转换
用户通过应用 数据库操作 与数据库交互。这些操作使用户能够:
- 检索信息
- 插入新数据
- 修改已有数据
- 删除过时数据
每一次操作都会把数据库从一个状态转移到另一个状态。
在内部,这些高级操作 并不 直接操作磁盘。相反,数据库管理系统 (DBMS) 会将它们转换为更底层的文件操作。
物理现实
- 数据库存在于一个或多个普通文件中
- 这些文件位于磁盘上
- 修改数据库即是修改这些文件
这个翻译层至关重要:它是抽象概念(如 记录 和 表)与具体实现(如 块、写入、同步)相交汇的地方。
数据库应用程序与受控访问
在早期系统中,用户经常使用脚本、编辑器或临时工具直接操作数据文件。这种做法通常称为 file‑processing system,并且很快被证明是脆弱且危险的。
直接文件操作的问题
- 易出错
- 容易违反完整性约束
- 随着数据增长难以管理
- 在并发访问时会崩溃
替代方案是 database applications——精心设计的程序,能够:
- 封装数据库逻辑
- 只公开定义明确的操作
- 将存储细节屏蔽给用户
现代数据库几乎总是通过此类应用程序访问。用户执行查询和更新时,无需了解:
- 数据项是如何存储的
- 文件在磁盘上的位置
- 并发是如何处理的
- 故障是如何恢复的
关键是,多个用户可以 独立且并发 地运行这些应用程序,且都在同一个数据库上操作。这种并发性,加上在不可靠磁盘上的持久化,使得数据库系统的真正复杂性由此产生。
为什么这一层很重要
到目前为止,我们已经从:
- 磁盘和块 → 物理约束
转变为
- 数据项和数据库 → 逻辑含义和正确性
接下来的一切——事务、并发控制、日志、恢复——都是为了保持以下幻象:
- 数据项表现为原子操作
- 数据库状态平滑转换
- 完整性约束永不被违反
即使在底层,我们仍然只是在磁盘上覆盖块。
👉 查看: FreeDevTools
欢迎任何反馈或贡献者!它是在线的、开源的,随时可供任何人使用。
⭐ 在 GitHub 上加星: freedevtools
