《高级数据库系统》笔记—— 第三章 数据元素和表示

回到上一章

内容概览

本章主要解决如下问题:

  • 如何将SQL数据类型表示成字段? (3.1)
  • 如何将元组表示成记录? (3.2)
  • 如何在存储块中表示记录或元组的集合? (3.2)
  • 如何用块的集合表示和存储关系? (4,5)
  • 如果不同的元组可能具有不同的记录大小,或者记录大小不能整除块大小,或两者兼而有之,如何处理记录大小? (3.4)
  • 如果因为修改一些宇段而导致记录大小发生改变,那么将会发生什么情况?我们如何在记录所在的块内找到存储空间,特别是当记录增大 时? (3.5)

下面具体介绍

数据元素和字段

基本SQL数据类型表示成记录的字段

  • 定长字符串 char(n)
    • n字节的数组。假如这个属性的值是长度小于n的字符串,则用特定符号填充
  • 变长字符串 varchar(n)
    • 长度加内容:分配一个n+1字节的数组
    • 空值-终止字符串
      string存储
  • 布尔类型:
    • true
      true
    • false
      false
  • Date类型
    • 日期通常表示为符合某种格式的定长字符串,因此我们可以像表示其它定长字符串一样表示日期。
    • 例如.SQL2标准中日期表示为形如YYYY-MM-DD的10字符字符串,即前四个字符是表示年的数字;第五个字符是连字符;第六个和第七个 字符是表示月的数字,如果必要以0打头
    • 时间也可类似地像字符串一样表示。
  • 二进制位

    • 二进制位序列(在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
      moviestar
  • 地址的要求
    • 假设对数据的唯一要求是字段从地址为4的倍数的字节处开始
    • 每一条记录在块内从4的倍数的字节处开始,而且
    • 记录中所有的宇段都从与记录起始偏移量为4的倍数的字节处开始;address

记录首部

  • 通常在记录中需要保存—些信息
    • 记录模式,或更可能是指向DBMS中存储该类记录模式的位置的一个指针
    • 记录长度
    • 快速地找到下一条记录的开始,避免存取记录的模式,引起额外的磁盘I/O时间戳,指明记录最后一次被修改或被读的时间以及其他可能 的信息。 记录首部

定长记录在块中的位置

  • 表示关系元组的记录存储在磁盘块中块记录举例

  • 它有一个可选的块首部,存储如下各种信息:

    • 与一个或多个其他块的链接,这些块构成一个块网络
    • 这个块在这样一个网络中所扮演的角色的信息
    • 这个块的元组属于哪个关系的信息
    • 一个给出每一条记录在块内偏移量的“目录”
    • 一个“块ID”
    • 指明块最后一次修改和/或存取时间的时间戳

例如:假设记录长度为316字节,使用4096字节的块,其中,12个字节用于块首部,剩余4084字节由数据使用。在这个空间中,我们能装入12条给定的316字节格式的记录,余下的292空闲。例子

小结:

  到目前为止,最简单的情况是块存储一个关系的元组,并且元组的记录有固定格式。在这种情况下,在块首部的后面,我们把尽可能多的记录装入块内,而留下剩余空间不用。

块和记录的地址表示

  • 块的物理地址
    • 主机名(如果数据库存储在不只一台机器上)
    • 设备号;
    • 磁盘的柱面号;
    • 柱面内磁道号(如果磁念有不只—‘个盘向);
    • 磁道内块号;
    • (某些情况下)记录起始在块内的偏移量。
  • 记录的物理地址
    • 块的物理地址+该记录在此块的偏移量表项中的偏移量
  • 块或记录的逻辑地址
    • 具有固定长度的一个任一字节串
  • 逻辑地址与物理地址的映射
    • 映射表
      映射表

变长数据和记录

所谓变长可以归为以下几类:

  • 大小变化的数据项
  • 重复字段
  • 可变格式记录
  • 极大的字段
具有变长字段的记录

对于这类记录,一个简单而有效的模式是将所有定长字段放在变长字段之前。例如:
举例

具有重复字段的记录

某一定长字段重复出现(长度为L)

  • 方法1:记录首部存储一个指针,指向该重复字段出现的第一个位置,例如:
    例子
  • 方法2:保持记录定长,而将变长部分放在另一个块上,在记录本身中存储:指向每一个重复字段开始处的指针,和重复次数或重复结束处
    例子
    注:该方法同样适用于变长字段
可变格式记录
  • 记录没有固定的模式
  • 标记字段序列
    • 属性或字段名
    • 字段类型
    • 字段长度
    • 字段值
      可变格式记录例子
不能装入一个块中的记录
  • 大值数据类型
    • 视频或音频“片断”
  • 跨块记录
    • 一个记录太大,不能装入一个块中
    • 即使记录比块小,为减少存储空间的浪费,也可以实施跨块记录
    • 一个跨块记录由若干记录片断组成
      在跨块记录或记录片断的首部包含一个二进制位,标明是否为一个片断
      几个二进制位,用于标明是否为第一个或最后一个片断
      指向前后片断的指针
      不能装入一个块中的记录
BLOBS
  • 真正大的记录值或字段值
    • GIF或JFEG等格式的图像
    • MPEG等格式的电影
    • 声音、雷达等各种信号
  • 二进制大对象BLOBS
    • 存储
      尽可能存储在连续的块上,以有效检索,或分割,存储在不同的磁盘上
    • 检索
      检索整个BLOB,或其中一部分片断,如“最后45分钟的影片内容”

记录的修改

  • 插入
  • 删除
  • 更新

插入

将一条新记录插入到关系中
若关系的记录无序

  • 插入到一个有空闲空间的块,或一个新块中
  • 若元组必须以某个固定次序有序
    • 首先,找到该记录应放置的块
    • 若当前块中有空闲空间,则将记录插入块中,并根据需要,在块中滑动记录
    • 否则
      查找临近块
      建立溢出块

删除

  • 直接删除记录、清理数据块或删除溢出块等是危险的
  • 在记录首部设置删除标记,其余部分继续可用

更新

  • 更新定长记录
  • 更新变长记录
    • 若更新后记录比旧版本长
      记录滑动,或创建溢出块
    • 若更新后记录比旧版本短
      合并空间,删除溢出块

下一章 索引结构

文章目录
  1. 1. 回到上一章
  • 内容概览
  • 数据元素和字段
  • 记录
    1. 1. 字段->记录
    2. 2. 定长记录的构造
    3. 3. 记录首部
    4. 4. 定长记录在块中的位置
      1. 4.1. 小结:
  • 块和记录的地址表示
    1. 1. 变长数据和记录
      1. 1.1. 具有变长字段的记录
      2. 1.2. 具有重复字段的记录
      3. 1.3. 可变格式记录
      4. 1.4. 不能装入一个块中的记录
      5. 1.5. BLOBS
  • 记录的修改
    1. 1. 插入
    2. 2. 删除
    3. 3. 更新
  • 下一章 索引结构
  • ,