回到上一章
内容概览
本章主要解决如下问题:
- 如何将SQL数据类型表示成字段? (3.1)
- 如何将元组表示成记录? (3.2)
- 如何在存储块中表示记录或元组的集合? (3.2)
- 如何用块的集合表示和存储关系? (4,5)
- 如果不同的元组可能具有不同的记录大小,或者记录大小不能整除块大小,或两者兼而有之,如何处理记录大小? (3.4)
- 如果因为修改一些宇段而导致记录大小发生改变,那么将会发生什么情况?我们如何在记录所在的块内找到存储空间,特别是当记录增大 时? (3.5)
下面具体介绍
数据元素和字段
基本SQL数据类型表示成记录的字段
- 定长字符串 char(n)
- n字节的数组。假如这个属性的值是长度小于n的字符串,则用特定符号填充
- 变长字符串 varchar(n)
- 长度加内容:分配一个n+1字节的数组
- 空值-终止字符串
- 布尔类型:
- true
- false
- true
- Date类型
- 日期通常表示为符合某种格式的定长字符串,因此我们可以像表示其它定长字符串一样表示日期。
- 例如.SQL2标准中日期表示为形如YYYY-MM-DD的10字符字符串,即前四个字符是表示年的数字;第五个字符是连字符;第六个和第七个 字符是表示月的数字,如果必要以0打头
- 时间也可类似地像字符串一样表示。
二进制位
- 二进制位序列(在SQL2中用类型BIT(n)描述的数据)可以按每8位构成一个字节的方式组装起来。
- 二进制位序列(在SQL2中用类型BIT(n)描述的数据)可以按每8位构成一个字节的方式组装起来。
枚举类型
- 可以使用整数编码表示一个枚举类型的值
- 例如,red->0, bule->1, yellow->2 ……
记录
字段->记录
数据库系统使用的每一种记录类型必须有一个模式。模式由数据库存储,包括记录中字段的名称和数据类型,以及在记录内它们的偏移量。需要存取记录的组成部分时将参考模式。
定长记录的构造
- 最简单的情况是记录的所有字段均为定长、则我们可将字段连接成记录
- 例如,关系MovieStar的声明如下:
- name:一个30字节的字符串。
- addres s:VARCHAR(255)类型,用256个字节表示
- Gender:单一字节, ‘Y’或 ‘N’。
- birthdate:DATE类型。假设用10字节长的SQL2日期表示这个字段。
- 所以,MovieStar类型的记录占30+256+1+10=297
- 地址的要求
- 假设对数据的唯一要求是字段从地址为4的倍数的字节处开始
- 每一条记录在块内从4的倍数的字节处开始,而且
- 记录中所有的宇段都从与记录起始偏移量为4的倍数的字节处开始;
记录首部
- 通常在记录中需要保存—些信息
- 记录模式,或更可能是指向DBMS中存储该类记录模式的位置的一个指针
- 记录长度
- 快速地找到下一条记录的开始,避免存取记录的模式,引起额外的磁盘I/O时间戳,指明记录最后一次被修改或被读的时间以及其他可能 的信息。
定长记录在块中的位置
表示关系元组的记录存储在磁盘块中
它有一个可选的块首部,存储如下各种信息:
- 与一个或多个其他块的链接,这些块构成一个块网络
- 这个块在这样一个网络中所扮演的角色的信息
- 这个块的元组属于哪个关系的信息
- 一个给出每一条记录在块内偏移量的“目录”
- 一个“块ID”
- 指明块最后一次修改和/或存取时间的时间戳
例如:假设记录长度为316字节,使用4096字节的块,其中,12个字节用于块首部,剩余4084字节由数据使用。在这个空间中,我们能装入12条给定的316字节格式的记录,余下的292空闲。
小结:
到目前为止,最简单的情况是块存储一个关系的元组,并且元组的记录有固定格式。在这种情况下,在块首部的后面,我们把尽可能多的记录装入块内,而留下剩余空间不用。
块和记录的地址表示
- 块的物理地址
- 主机名(如果数据库存储在不只一台机器上)
- 设备号;
- 磁盘的柱面号;
- 柱面内磁道号(如果磁念有不只—‘个盘向);
- 磁道内块号;
- (某些情况下)记录起始在块内的偏移量。
- 记录的物理地址
- 块的物理地址+该记录在此块的偏移量表项中的偏移量
- 块或记录的逻辑地址
- 具有固定长度的一个任一字节串
- 逻辑地址与物理地址的映射
- 映射表
- 映射表
变长数据和记录
所谓变长可以归为以下几类:
- 大小变化的数据项
- 重复字段
- 可变格式记录
- 极大的字段
具有变长字段的记录
对于这类记录,一个简单而有效的模式是将所有定长字段放在变长字段之前。例如:
具有重复字段的记录
某一定长字段重复出现(长度为L)
- 方法1:记录首部存储一个指针,指向该重复字段出现的第一个位置,例如:
- 方法2:保持记录定长,而将变长部分放在另一个块上,在记录本身中存储:指向每一个重复字段开始处的指针,和重复次数或重复结束处
注:该方法同样适用于变长字段
可变格式记录
- 记录没有固定的模式
- 标记字段序列
- 属性或字段名
- 字段类型
- 字段长度
- 字段值
不能装入一个块中的记录
- 大值数据类型
- 视频或音频“片断”
- 跨块记录
- 一个记录太大,不能装入一个块中
- 即使记录比块小,为减少存储空间的浪费,也可以实施跨块记录
- 一个跨块记录由若干记录片断组成
在跨块记录或记录片断的首部包含一个二进制位,标明是否为一个片断
几个二进制位,用于标明是否为第一个或最后一个片断
指向前后片断的指针
BLOBS
- 真正大的记录值或字段值
- GIF或JFEG等格式的图像
- MPEG等格式的电影
- 声音、雷达等各种信号
- 二进制大对象BLOBS
- 存储
尽可能存储在连续的块上,以有效检索,或分割,存储在不同的磁盘上 - 检索
检索整个BLOB,或其中一部分片断,如“最后45分钟的影片内容”
- 存储
记录的修改
- 插入
- 删除
- 更新
插入
将一条新记录插入到关系中
若关系的记录无序
- 插入到一个有空闲空间的块,或一个新块中
- 若元组必须以某个固定次序有序
- 首先,找到该记录应放置的块
- 若当前块中有空闲空间,则将记录插入块中,并根据需要,在块中滑动记录
- 否则
查找临近块
建立溢出块
删除
- 直接删除记录、清理数据块或删除溢出块等是危险的
- 在记录首部设置删除标记,其余部分继续可用
更新
- 更新定长记录
- 更新变长记录
- 若更新后记录比旧版本长
记录滑动,或创建溢出块 - 若更新后记录比旧版本短
合并空间,删除溢出块
- 若更新后记录比旧版本长