05 数据表示

1 数据项的表示(Data Items)

数据项是字节序列,表示关系数据库中元组的属性值。

SQL 数据类型:

  • char(n)
    • 占用 n 字节的空间
    • 多余的空间用特殊字符填充
  • varchar(n)
    • 长度+内容
    • 终止符
  • boolean
    • true:1111 1111
  • Date 表示方式
    • YYYY-MM-DD
    • YYYYMMDD
    • YYYYDDD
    • 整数:自 1900-01-01 以来的天数
  • Time
    • HH:NN:SS 整数秒
    • HH:NN:SS:FF 带小数秒
    • 整数:自00:00:00以来的秒数
  • Bit
    • 长度+内容
    • 按字节表示

2 记录的表示(Records)

记录是数据项的集合

记录类型包括

  1. 固定格式和可变格式
  2. 固定长度和可变长度

2.1 固定格式定长记录

所有记录具有相同的逻辑结构

记录的模式为:

  1. # fields
  2. Name of each field
  3. Type of each field
  4. Order in record
  5. 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的含义
  1. 优点
    1. 灵活的记录格式,适合“松散”记录,如病人的检验结果
    2. 适合处理重复字段
    3. 适合记录格式演变
  2. 缺点
    1. 标记存储方式空间代价高
    2. KV方式难以支持复杂查询
    3. 应用负担重且事务处理等实现困难

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 块在文件中的组织

  1. 堆文件(Heap File)

    1. 最基本、最简单的文件结构
    2. 记录不以任何顺序排序
    3. 记录可能存放在物理不邻接的块上
    4. 插入容易,但查找和删除代价高
  2. 链表式堆文件组织

  3. 目录式堆文件组织

posted @ 2024-01-20 11:15  ConnorLan  阅读(43)  评论(0)    收藏  举报