DB 交互:应用程序如何与 DB 对话
Source: Dev.to
你好,我是 Maneshwar。我正在开发 FreeDevTools online —— 一个免费、开源的中心,开发者可以快速找到并使用开发工具、技巧代码和 TLDR,而无需在互联网上四处搜索。
在上一篇文章中,我们重点讨论了 事务,这种抽象使得数据库在并发和故障情况下仍能保持正确性。我们看到 DBMS 如何保证 原子性、隔离性 和 持久性,而应用程序则定义事务要执行的 内容。
但这引出了一个实际问题:
应用程序到底是如何与 DBMS 进行交互的,它们又是如何表达想要完成的操作的?
现代数据库系统不再通过操作文件或块来访问。相反,应用程序通过明确的 交互模型 和 语言 与 DBMS 进行交互。理解这一边界至关重要,因为它决定了性能、隔离性、可扩展性,甚至故障行为。
两个数据库交互方面
- 交互模型 – 应用程序如何连接并与 DBMS 交换信息。
- 交互语言 – 应用程序如何通过 DBMS 定义、查询和修改数据。
这两种选择决定了数据库在实际系统中的构建和使用方式。
Source:
与 DBMS 的交互模型
DBMS 通常采用以下两种交互模型之一:
- 嵌入式模型
- 客户端‑服务器模型
每种模型对应不同的系统约束和设计目标。
嵌入式 DBMS 模型
在 嵌入式模型 中,DBMS 实现为 用户级库,在运行时成为应用程序的一部分。
特点
- DBMS 代码在应用程序的进程内部运行。
- 应用程序直接调用 DBMS 函数。
- 通过普通函数调用进行通信。
- 所有执行都在单一进程的地址空间内完成。
这实际上是一种 自助式 数据库系统。应用程序通过 API 与 DBMS 交互,就像使用其他库一样。一些嵌入式系统甚至允许应用程序注册 回调函数,当 DBMS 需要在应用程序的内存空间中操作数据时会调用这些函数。
优势与局限
- 没有独立的服务器进程。
- 开销极小。
- 内存占用低。
- 应用程序与 DBMS 紧密耦合。
- 并发性和可扩展性受限。
典型使用场景
- 移动设备
- 嵌入式系统
- 资源受限的环境
在这些场景下,运行独立的数据库服务器既不必要也不实际。
客户端‑服务器 DBMS 模型
在 客户端‑服务器模型 中,DBMS 作为 独立的服务器进程 运行。应用程序充当客户端:
- 它们 不 直接执行 DBMS 代码。
- 只包含一个轻量级的 DBMS 驱动。
- 通过进程间通信(IPC)与 DBMS 服务器交互。
常见的 IPC 机制
- TCP/IP 套接字
- 共享内存
- 其他操作系统支持的 IPC 机制
客户端发送 请求,服务器执行并将结果作为 响应 返回。
与嵌入式模型的区别
- 没有回调进入应用代码。
- DBMS 与应用程序的错误相互隔离。
- 服务器集中管理并发和事务。
大多数商业和生产级 DBMS 采用此模型,通常被称为 数据库服务器。
客户端‑服务器模型为何占主导
- 应用程序与 DBMS 之间的强隔离。
- 高并发支持。
- 集中式事务管理。
- 更好的故障容限。
- 可跨机器和网络扩展。
该模型使应用程序的地址空间保持小巧,防止应用程序崩溃导致数据库内部损坏。
Source: …
交互语言:工作如何表达
连接到 DBMS 只是故事的一半。应用程序还必须 描述它们希望数据库执行的操作。主要有两种方法。
过程式(规定式)
- 用户指定每一步 如何 执行。
- DBMS 在低层次上接受指令。
- 控制流和执行顺序是显式的。
这种方法将应用程序与执行策略及存储细节紧密耦合。
声明式(描述式)
现代 DBMS 绝大多数使用 声明式语言。
- 用户指定 想要什么。
- DBMS 决定 如何 执行。
- 执行策略对应用程序隐藏。
这种分离是有意为之且非常强大。
SQL:关系数据库的语言
最广泛使用的关系数据库声明式语言是 结构化查询语言(SQL)。
SQL 使应用程序能够:
- 描述期望的结果。
- 忽略存储布局。
- 不必考虑索引、块或访问路径。
每条 SQL 语句:
- 是一个独立的程序或子程序。
- 指定 要 计算什么,而不是 如何 计算。
这种职责划分让:
- 应用程序开发者专注于正确性和意图。
- DBMS 开发者专注于优化和执行。
SQL 组件
SQL 定义了:
- 一套标准的原始数据类型(INTEGER、VARCHAR、DATE、TIMESTAMP、BLOB 等)。
- 由这些原始类型组成的用户自定义域。
- 与关系数据交互的语法和语义。
SQL 语句分为两大类。
数据定义语言(DDL)
用于定义数据库结构:
- 表
- 索引
- 约束
- 域
- 视图
- 触发器
DDL 形成数据库的 模式(schema) 和完整性规则。
数据操作语言(DML)
用于处理数据:
- 查询行
- 插入新行
- 更新已有行
- 删除行
DML 语句在事务内部执行,并受 ACID 保证的约束。
资源
👉 查看: FreeDevTools
欢迎任何反馈或贡献!它是在线的、开源的,随时供任何人使用。
⭐ 在 GitHub 上给它加星: freedevtools
