数据库视图

数据库中的视图是一个虚拟的表,它是由一个或多个表的数据经过特定的查询语句组成的。视图的作用如下:

  • 简化复杂查询:视图可以将多个表的数据组合起来,使得复杂的查询可以被简化。使用视图可以将多个SELECT语句组合在一起,从而减少代码量和提高代码可读性。
  • 数据安全性:视图可以对数据库的敏感数据进行保护。通过限制用户对表的访问权限,只能通过视图查询敏感数据,可以避免敏感数据被恶意篡改和删除。
  • 简化数据访问:视图可以隐藏数据表的细节,只暴露必要的数据给用户。这样用户只需关注他们需要的数据,而不用关心数据表的具体实现。
  • 可以向应用程序提供标准视图:应用程序可以通过访问视图而不是表来获取数据,这可以使应用程序更加灵活。当数据表结构发生变化时,只需要更改视图而不是应用程序代码。
  • 提高性能:视图可以提高查询性能,因为它可以缓存一些常用的查询结果。当多个用户需要相同的查询结果时,视图可以避免重复查询。
  • 数据一致性:视图可以保证数据的一致性,因为它可以对多个表的数据进行联合查询。当修改一个视图时,它会自动更新涉及到的所有数据表,从而保证数据的一致性。

总的来说,视图是一种非常有用的数据库对象,可以提高查询性能、保护敏感数据、简化数据访问等。但是需要注意的是,视图可能会占用额外的存储空间和计算资源。

开发数据库应用

不要把数据库当“黑盒”,每个数据库都是非常不同的,必须深入了解你所使用的数据库的体系结构和特征

  • 不同数据库实现的锁和并发控制机制不同
    • Oracle 实现的锁机制
      • 只有修改才加行级锁
      • Read 绝对不会对数据加锁
      • Writer 不会阻塞 Reader
      • 读写器绝对不会阻塞写入器
  • 不同的数据库对于 Null 值的实现不同
    • 认为 Null 是未知值,与其他任何值都不相等,使用 IS NULL / IS NOT NULL 来进行判断
    • 认为 Null 是合法值,用来表示缺失或未知的数据,在使用比较运算符时,一个操作数为 Null 则结果为 false
    • 认为 Null 是合法值,用来表示缺失或未知的数据,在使用比较运算符时,一个操作数为 Null 则结果为 Null
    • …….
    处理空值:
    1
    select avg(coalesce(t.x, 0)) from t;

性能、安全性都是适当的被设计出来的

索引结构

  • 更适合磁盘实现的树必须具备以下属性:

    • 高扇出,以改善临近键的数据局限性

    • 低高度,以减少遍历期间的寻道次数

  • B 树(B+树)

    • B 树(B+树)结构
    image-20230411094735661
    • 最小度数 t,除根结点外每个内部结点至少有 t-1 个关键字,至多可包含 2t-1 个关键字

    • B 树的分裂操作(插入新结点时发现叶结点个数已满):

      • 将包含 2t-1 个元素的满结点,从中间分裂成两个包含 t-1 个关键字的子结点
      • 将中间关键字提升到父结点,标识两棵新树的划分点
      • 如果此操作导致父结点也成为满结点,则递归地进行分裂操作
      image-20230411101755823
    • B 树的查找算法

      • 查找,从根节点到叶节点的单向遍历
      • 从根节点上执行⼆分搜索算法,将要搜索的 $K$ ,与存储在根节点中的 $K_{n}$ 进行比较,直到找到大于 $K$ 的第⼀个分隔键,这样定位了⼀个要搜索的子树,顺着相应指针继续相同的搜索过程,直到目标叶节点,找到数据主文件指针
    • B 树(B+树)逻辑存储结构

      image-20230411102820978
  • 索引对数据的访问

    image-20230411103148171
    • 通过主键索引访问基本表:先访问索引,得到文件的偏移量,再以此来访问基本表
    • 通过二级索引访问基本表:
      • 二级索引直接指向基本表(读数据时只需要访问一次索引,写数据时需要访问两次索引)
      • 二级索引指向主键索引(读数据时只需要访问两次索引,写数据时需要访问一次索引)
    • 复合键索引,本质上是按照排名第⼀的字段进行索引(查询的字段全在复合索引中则可不使用基本表)

数据表的物理实现

在数据库物理实现中,一个数据页(page)通常被划分为若干个固定大小的数据块(block),每个数据块包含一个或多个数据项(record),而这些数据项的大小并不固定

为了能够高效地管理这些数据项,数据库系统采用了一种称为 slotted page 的技术

image-20230411140044656

其中,Header 中包含的数据一般有:

  • Page 类型:该 page 的类型,如数据页、索引页、系统页等
  • Page 编号:该 page 在数据库文件中的唯一标识符
  • 空闲空间:该 page 中还剩余的可用空间大小
  • 版本号:用于记录该 page 的版本信息,主要用于并发控制
  • 标记位:用于标记该 page 的状态,如是否被锁定、是否被修改等
  • Checksum:用于校验该 page 的数据完整性,防止数据损坏或篡改
  • ……
image-20230411141454871

为了能够回收已删除记录的空间,构建指针链表 Freeblock,并指向第⼀个空闲块的指针保存在页头部,保存可用字节数(确定是否能在碎片整理后被放入该页)

  • 使用空闲块的策略:
    • 首次适配优先(找第⼀个适配的空闲块,会带来额外开销)
    • 最佳适配优先(找⼀个剩余段最小的空间)
image-20230411142944111

行迁移:页溢出时,在原页面中留出一个指针大小的空间,然后将该记录的剩余部分存储在新的页面中

额外的小问题:

  • 经验规律 70% / 30% 原则,留下一定的空间,最大程度上避免行迁移的产生
  • 校验和:checksum / XOR,循环冗余校验 CRC(检测连续比特位的损坏)

SQL 语法技巧

  • 聚合计算时处理 null

    使用 COALESCE 函数:coalesce(expr_1, expr_2, …, expr_n),遇到非 null 值即停止判断并返回该值

    1
    select avg(coalesce(t.x, 0)) from t;
  • 删除字符串中部分内容

    使用 REPLACE 函数:replace(original-string,search-string,replace-string)

    • original-string: 被搜索的字符串
    • search-string: 要搜索并被 replace-string 替换的字符串(若为空串,则返回原始字符串)
    • replace-string: 该字符串用于替换 search-string(若为空串,则删除出现的所有 search-string)
    1
    update `article` set title=replace(title, 'w3cschool', 'hello');
  • 计算中位数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    -- Oracle
    select median(sal) from emp where deptno=20;

    -- MySQL/PostgreSQL
    select avg(sal)
    from (
    select e.sal
    from emp e, emp d
    where e.deptno=d.deptno
    and e.deptno=20
    group by e.sal
    having
    sum(case when e.sal=d.sal then 1 else 0 end)
    >= abs(sum(sign(e.sal-d.sal)))
    ) t;

数据库模式设计之层次结构

  • 树状结构

    • 只要对象的类型相同,而对象的层树可变,其关系就应该被建模为树结构

    • 数据库模式设计中的三种树模型

      • Adjacency Model:邻接模型

        image-20230411114131470
      • Materialized Path Model:物化路径模型

        image-20230411114156857
      • Nested Set Model:嵌套集合模型

        image-20230411114252955 image-20230411114320531