05 数据表示
1 数据项的表示(Data Items)
数据项是字节序列,表示关系数据库中元组的属性值。
SQL 数据类型:

char(n)- 占用 n 字节的空间
- 多余的空间用特殊字符填充
varchar(n)- 长度+内容
- 终止符
boolean- true:1111 1111
Date表示方式YYYY-MM-DDYYYYMMDDYYYYDDD- 整数:自 1900-01-01 以来的天数
TimeHH:NN:SS整数秒HH:NN:SS:FF带小数秒- 整数:自00:00:00以来的秒数
Bit- 长度+内容
- 按字节表示
2 记录的表示(Records)
记录是数据项的集合
记录类型包括
- 固定格式和可变格式
- 固定长度和可变长度
2.1 固定格式定长记录
所有记录具有相同的逻辑结构
记录的模式为:
# fields- Name of each field
- Type of each field
- Order in record
- offset of each field in the record
在 SQL 中构造固定格式定长记录:
-- SQL中固定格式定长记录的构造
CREATE TABLE Student(
name CHAR(30) PRIMARY KEY,
adress VARCHAR(255),
gender CHAR(1),
birthdate DATE
)
2.1.1 不考虑寻址

2.1.2 考虑寻址

- 每个字段起始地址都为某个数(例如 4) 的倍数
- 例如 gender 虽然分配了 1 字节,实际上会填充空字节到 4 字节
- 交换记录的顺序,
- 需要在首部描述记录的信息
- 记录类型(模式信息)
- 记录长度
- 时间戳
- 其它信息
2.2 可变格式记录
- 每个记录的格式不同
- 记录的格式存储于记录中

记录的格式
- 字段数:表明有多少字段
- 标识码:标识一个字段的开始
- 类型
- data
KEY-VALUE
typedef struct{
void *data; //字节流指针
int size; //字节流长度
} DBT;
- KEY和VALUE都以字节流的形式存储
- 数据类型没有限制
- 应用与数据库之间不需要转换数据格式
- 不提供key和value的内容和结构信息
- 应用必须知道value的含义
- 优点
- 灵活的记录格式,适合“松散”记录,如病人的检验结果
- 适合处理重复字段
- 适合记录格式演变
- 缺点
- 标记存储方式空间代价高
- KV方式难以支持复杂查询
- 应用负担重且事务处理等实现困难
2.3 固定格式变长记录表示
首部指针法
定长字段在前,变长字段在后

混合格式
定长记录+变长记录

3 记录在块中的组织(Block)
假设:1. 块大小固定 2. 记录组织成单个文件
定长记录在块中的组织:记录地址 rid = <块号,槽号>

变长记录在块中的组织:槽目录+<记录偏移量,长度>

3.1 记录在块内的分隔
- 定长记录:不需要分隔
- 变长记录分隔方法:
- 特殊标记
- 块内偏移
3.2 记录是否跨块
- Unspanned:实现简单,但空间浪费
- Spanned:有效利用空间,实现更复杂
如果记录大小超过块大小,则必须跨块
3.3 不同类型的记录聚簇
即在一个块中存储多个不同类型的记录(多关系聚簇)

- 优点:形成聚簇,将经常一起访问的记录存储在同一块或连续块中
- 缺点:如果经常只单独查询其中一个类型的记录,反而降低了效率。
STUDENT(s#,sname,age)
SC(s#,cname,score)
Q1: select student.s#,sc.cname from student s,sc where s.s# = sc.s#
Q2: select * from student
如果Q1经常被查询,则聚簇非常有效
若Q2经常被查询,则聚簇反而降低了效率
3.4 在块中按序存储记录
将记录按照某个字段的顺序排列(单关系上的聚簇)
- 加快按排序字段查询记录时的效率
- 利于归并联接
3.5 记录的分裂
适合于变长记录的混合格式表示
- 定长部分存储于某个块中
- 变长部分存储于另一个块中
- 与 spanned 存储类似
3.6 记录地址
物理地址:

逻辑地址:

- 增加映射表
- 缺点:增加了代价、占用存储空间、地址转换过程
- 优点:更加灵活,删除或移动只需要修改表项
flowchart LR
文件号 --文件系统--> 块号 --加上偏移--> 记录物理地址
4 记录的修改
4.1 插入
- 无序的情况:
- 插入任意空闲空间
- 如果无空间空间则申请一个新块
- 有序的情况:
- 找到应插入的位置
- 有空间则插入,否则
- 在“邻近块”中找空间
- 创建溢出块

4.2 删除
- 若删除的记录位于溢出块链上,则删除记录后可对整个链进行重新组织以去除溢出块
- 使用删除标记
- 若使用偏移表,则可以将偏移表项指针置空
- 若使用映射表,则可以将物理地址置空
- 在记录首部预留一个开始位标识是否删除此记录
5 块在文件中的组织
-
堆文件(Heap File)
- 最基本、最简单的文件结构
- 记录不以任何顺序排序
- 记录可能存放在物理不邻接的块上
- 插入容易,但查找和删除代价高
-
链表式堆文件组织
![]()
-
目录式堆文件组织
![]()


浙公网安备 33010602011771号