• 2020 HIT Database 复习


    第一部分 基本知识与关系模型

    • 数据库管理系统功能
      - 数据库定义:DDL,定义表的信息
      - 数据库操纵:DML,对数据进行修改等操作
      - 数据库控制:DCL,定义不同操作和操作者的约束
      - 数据库维护
    • DDL、DML、DCL构成SQL(结构化的数据库语言)
    • DBMS的功能:编译与执行控制、查询优化实现、存储与索引、通信控制、事务管理、故障恢复、安全性控制、完整性控制、数据字典管理、应用程序接口、数据库数据装载、重组、数据库性能分析等等。
    • 三级模式两层映像
      - 外部模式(用户模式):用户看到的数据的结构化描述
      - 概念模式(逻辑模式):数据之间的内在联系
      - 内部模式(物理模式):数据的存储路径、存储方式、索引方式等
      - E-C 映像:便于用户观察和使用
      - C-I 映像:便于计算机进行存储和处理
    • 两个独立性:
      - 逻辑数据独立性:概念模式变化,只需改变E-C映像
      - 物理数据独立性:内部模式变化,只需改变C-I映像
    • 候选键/候选码:关系中能够唯一标识一个元组的属性组。
    • 主键/主码:DBMS通过主码作为主要线索管理元组,多个候选码时选定一个作为主码。
    • 全码:所有属性构成这个关系的候选码
    • 外码/外键:一个关系R中的属性组不是R的候选码而是与另一个关系S的候选码相对应,这个属性组是R的外码或外键。
    • 实体完整性:关系的主码属性值不能为空值。
    • 参照完整性:如果关系R1的某个元组t1参照了关系R2的某个元组t2,则t2必须存在。
    • 并相容性:关系R和S存在相容性当且仅当R和S的属性数目相同且对于任意i关系R的第i个属性域和S的第i个属性域相同。
    • 关系代数的基本运算:并、差、笛卡尔积(( imes))、选择((sigma))、投影((prod))
    • ( heta)连接运算无需删除属性,而自然连接和外连接需要去掉重复的属性列。
    • 外连接:两个关系R和S进行连接时,如果关系R(S)中的元组在S(R)中找不到相匹配的元组,则为了避免该元组信息丢失,从而将该元组与S(R)中假定存在的全为空值的元组形成连接,放置在结果关系中。
    • 关系元组运算符的优先次序:括号、( heta)(exists)(forall)( eg)(land)(lor)
    • 元组运算中使用<>表示不等于
    • 元组演算是以元组为变量,以元组为基本处理单位,先找到元组然后再找到元组分量,进行谓词判断;域演算是以域变量为基本处理单位,先有域变量,然后再判断由这些域变量组成的远足是否存在或是否满足谓词判断。
    • QBE操作框架:
      tcsnV1.png
    • QBE操作种类:Print(P.)、Delete(D.)、Update(U.)、Insert(I.)
    • QBE查询:
      - 简单条件:( heta)参量
      - QBE上不同属性的与条件可以写在同一行中
      - 示例元素与投影:条件( heta)参量中的参量也可以是域变量,用任何一个值带有下划线表示,被称为示例元素。示例元素下划线上面的值不起作用,被当作域变量名称来对待,只用于占位或是连接条件。当不是显示所有内容时,可在条件区对应要显示的列下面书写显示输出命令。
      - 用示例元素实现与和或运算:当写或运算时,可以采用多行书写并在打印命令之后使用不同的示例元素来表征;与运算的情况下,在相互存在与关系的行使用相同的示例元素,
      - 括号的条件表示:将( eg)(land)(lor)运算符写在操作区时,是对整行条件而言,相当于该行条件放在括号中。
      - 用示例元素实现多个表的连接:当检索涉及多个表时,可利用同一连接条件使用相同的示例元素,来实现多个表的连接。
    • 关系代数是一种集合运算,是安全的;关系演算不一定是安全的。不产生无限关系和无穷验证的运算被称为是安全的。
    • 满足下面条件的元组演算表达式{t| (psi)(t)}称为安全表达式
      - 只要t满足(psi)、t的每个分量就是DOM((psi))的一个成员
      - 对于(psi)中形如((exists)u)((omega)(u))的子表达式,若u满足(omega),则u的每个分量都是DOM((psi))中的一个成员。
      - 对于(psi)中形如((forall)u)((omega)(u))的子表达式,若u不满足(omega),则u的每个分量都是DOM((psi))中的一个成员。

    第二部分 数据库语言-SQL

    • SQL语言中定义的标准数据类型(部分)
      - numeric(p, q)固定精度数字,小数点左边p位,右边p-q位
      - date:日期
      - time:时间
    • SQL的结果排序问题:order by 列名 [asc|desc]
    • SQL中多表连接时,如果两个表的属性名相同,则需采用表名.属性名方式来限定该属性属于哪一个表。
    • 使用( heta) some/ ( heta) all来进行查询,如果表达式的值至少与子查询结果的某一个值相比较满足( heta)关系,则( heta) some的查询结果为真;如果表达式的值与子查询结果的所有值相比较都满足( heta)关系,则表达式( heta) all的结果为真。
    • not in 等价于 <> all
    • 结果计算:Select-From-Where语句中,Select子句后面不仅可以是列名,而且可以是一些计算表达式或聚集函数,表名在投影的同时直接进行一些运算
    select 列名|expr|agfunc(列名) [[, 列名|expr|agfunc(列名)]...] from 表名1[, 表名2] [where 条件];
    
    • expr可以是常量、列名或由常量、列名、特殊函数及算术运算符构成的算术运算式。agfunc是一些聚集函数,例如COUNT、SUM、AVG、MAX、MIN
    • 使用Group by进行分组查询,通过Having进行分组过滤。
    • SQL实现关系代数操作,其中带ALL的保留着重复的元组
      - 并 Union (ALL)
      - 交 Intersect (ALL)
      - 差 Except (ALL)
    • SQL的高级语法引入内连接与外连接:
    select 列名 [[,列名]...]
    from 表名1 [NATURAL]
                       [INNER | {LEFT | RIGHT | FULL} [OUTER]] JOIN 表名2
                {ON 连接条件 | Using (Colname, {, Colname ...}) }
    [Where 检索条件]...;
    
    • 数据库完整性是指DBMS应保证的DB的一种特性--在任何情况下的正确性、有效性和一致性
    • 完整性约束
      - 域完整性约束条件:施加于某一列上,对给定列上所要更新的某一候选值是否可以接受进行约束条件判断。
      - 关系完整性约束条件:施加于Table上,对给定表上所要更新的某一候选远足是否可以接受进行约束条件判断,或是对一个关系中的若干元组和另一个关系中的若干元组间的联系是否可以接受进行约束条件判断
      - 结构约束:来自模型的约束
      - 内容约束:来自用户的约束
      - 静态约束:要求数据库在任一时候均应满足的约束
      - 动态约束:要求数据库从一状态变为另一状态应满足的约束
    • 实现约束的方法:
      tRd06H.png
    • Col_constr列约束:只能应用在单一列上,其后面的约束如UNIQUEPRIMARY KEYsearch_cond只能是单一列唯一、单一列为主键和单一列相关
      tRdoBn.png
    • table_constr约束:对多列或元组的值进行约束。
      tRwA3D.png
    • check中的条件可以是Select-From-Where内任何Where后的语句,包含子查询
    • 断言:表达了希望数据库总能满足的条件,当创建了一个断言之后,系统将检测其有效性,并在每一次更新中测试更新是否违反该断言。
    create assertion <assertion-name> check <predicate>
    
    • 触发器:实现动态约束以及多个元组之间的完整性约束。Trigger是一种过程完整性约束,是一段程序,该程序可以在特定的时刻被自动触发执行,比如在一次更新操作之前执行,或在更新操作之后执行。当某一事件发生时AFTER|BEFORE,对该事件产生的结果(或是每一元组,或是整个操作的所有元组),检查条件search_condition,如果满足条件就执行后面的程序段。条件或程序段中引用的变量可用corr_name_def来限定
      tRBSFx.png
    • 对corr_name_def的定义如下:
      tRBilD.png
    • 数据库安全性:免受非法、非授权用户的使用、泄漏、更改或破坏。
    • 数据的安全级别;绝密Top Secret、机密 Secret、可信Confidental、无分类Unclassified
    • 数据库系统DBS的安全级别:物理控制、网络控制、操作系统控制、DBMS控制
    • DBMS的安全机制
      - 自主安全性机制:存取控制,通过权限在用户之间的传递,使用户自主管理数据库安全性,通过存储矩阵和SQL视图实现
      - 强制安全性机制:通过对用户和数据进行强制分类,使得不同类别用户能够访问不同类别的数据
      - 推断控制机制
      - 数据加密存储机制
    • 当一个用户的权利被收回时,通过其传播给其他用户的权利也将被收回;如果一个用户从多个用户处获得了授权,则当其中某一个用户收回授权时,该用户可能仍保有权利。
    • 强制安全性机制规则:
      - 用户S,不能读取数据对象O,除非Level(S) >= Level(O)
      - 用户S,不能写数据对象O,除非Level(S) <= Level(O)
    • SQL语句在执行过程中,必须有提交和撤销语句才能确认其操作结果
    • 事务的特性:ACID
      - 原子性:保证事务的一组更新是原子不可分的
      - 一致性:保证事务的操作状态是正确的
      - 隔离性:保证并发执行的多个事务之间不受影响
      - 持久性:保证已提交事务的影响是持久的,被撤销事务的影响是可恢复的
      注:考嵌入式自求多福

    第三部分 数据建模与数据库设计

    • E-R模型中,通过关键字/码来唯一区分每一实例的属性或属性组合
    • E-R模型中,联系指一个实体的实例和其他实体实例之间所可能发生的联系。
    • 完全参与联系:即该端实例至少有一个参与到联系中,最小基数为1(1..m)
    • 部分参与联系:即该端实例可以不参与联系,最小基数为0(0..m)
    • chen方法:
      tIDjQ1.md.png
      tIrEQI.md.png
      tIrmef.md.png
    • Chen方法中,在直线上标记有文字来表示联系的角色。
    • Crow foot's 方法:
      tIr0fJ.png
      tIrhfH.png
      tIrb0f.png
    • IDEF1x方法中,实体表示一个现实和抽象事物的集合,这些食物必须具有相同的属性和特征。这个集合的一个元素就是该实体的一个实例。分为独立实体/强实体和从属实体/弱实体。
      • 独立实体:一个实体的实例都被唯一的标识而不决定于它与其他实体的联系。独立实体的主关键字中没有外键。
        tIse39.png
      • 从属实体:一个实体的实例的唯一标识需要依赖于该实体与其他实体的联系。其中,从属实体需要从其他实体继承属性作为关键字的一部分。主关键字中包含了外来属性的实体称为从属实体。
        tIsJ9H.png
      • 外来关键字:其他实体的关键字
        tIsODx.png
      • 标定联系:子实体的实例都是由它与父实体的联系而确定。父实体的主关键字是子实体主关键字的一部分。
        tIsxUO.png
      • 非标定联系:子实体的实例能够唯一标识而无需依赖与其实体的联系。父实体的主关键字不是子实体的主关键字。
        tIykrt.png
      • 非确定联系:实体之间的多对多联系,非确定联系必须分解为若干个一对多的联系来表达。
      • 相交实体/相关实体:
        tIyGZV.png
      • 确定联系通过属性继承实现两实体之间的联系;非确定联系通过引入相交实体实现两实体的联系。
      • 分类联系:一个实体实例是有一个一般实体实例和多个分类实体实例构成的。一个一般实体是若干具体实体(分类实体)的类,分类实体与一般实体具有相同的主关键字,不同分类实体除具有一般实体特征外,各自还可能具有不同的属性特征。
        tI6dk8.png
        tI6cmq.png
      • 完全分类联系与非完全分类联系:
        • 一圆圈带两横线:完全分类联系
        • 一圆圈带一横线:非完全分类联系
          tI6I1J.png
    • 点评IDEFX1模型:
      • 通过图理解需求
      • 检查每个实体能否用重叠量词形容
      • 检查实体的关键字能否唯一确定每个实例
      • 检查实体之间联系绘制及命名的正确性
      • 检查属性继承的正确性
    • 数据库设计的4个过程
      • 需求分析:收集需求和理解需求
      • 概念数据库设计:建立概念模型
      • 逻辑数据库设计:建立逻辑模型,关系模式,包括用户模式和全局模式
      • 物理数据库设计:建立物理模型,建立表,包括物理数据组织等,依赖于具体的DBMS
    • 函数依赖:设R(U)是属性集合U={(A_1),(A_2),...,(A_n)}上的一个关系模式,X、Y是U上的两个子集,若对于R(U)的任意一个可能的关系r,r中不可能有两个元组满足在X中的属性相等而在Y中的属性值不等,则称“X函数决定Y”或“Y函数依赖于X”,记作(X ightarrow Y)
    • 函数依赖的特性:
      • (X ightarrow Y),但是(Y otsubset X),则称(X ightarrow Y)为非平凡的函数依赖。
      • (X ightarrow Y),则任意两个元组,若X上值相等,则Y上值必然相等,则称X为决定因素。
      • (X ightarrow Y)(Y ightarrow X),则记作(X leftrightarrow Y)
      • 若Y不函数依赖于X,则记作(X ot ightarrow Y)
      • (X ightarrow Y)有基于模式R的,则要求对任意的关系r成立;有基于具体关系r的,则要求对某一关系r成立。
      • 如一关系r的某属性集X,r中根本没有X上相等的两个元组存在,则称(X ightarrow Y)恒成立。
    • 部分或完全函数依赖:
      tIc78g.png
    • 传递函数依赖:
      tIg0Mj.png
    • 候选键:其中可以选择任一候选键作为R的主键;包含在任一候选键中的属性称为主属性,其他属性称为非主属性;若K是R的一个候选键(K subset S),则称S为R的一个超键
      tIg7o6.png
    • 外来键:若R(U)中的属性或属性组合X并非R的候选键,但X却是另一关系的候选键,则称X为R的外来键,简称外键。
    • 逻辑蕴含:
      tI2SeI.png
    • 闭包:被F逻辑蕴含的所有函数依赖集合称为F的闭包,记作(F^+)。若(F^+ = F),则说F是一个全函数依赖族(函数依赖完备集)。
    • Armstrong公理:设R(U)是属性集合U={(A_1),(A_2),...,(A_n)}上的一个关系模式,F为R(U)的一组函数依赖,记为R(U, F),则有如下规则成立:
      tI2ZOs.png
    • 根据引理可得:
      tI2QYT.png
    • 属性(集)闭包:
      tI23pF.png
    • 覆盖:
      tI2G6J.png
    • 属性闭包的计算算法:
      tI2tmR.png
    • 函数依赖集的性质:每个函数依赖集F可被一个其右端至多有一个属性的函数依赖之集G覆盖。
    • 最小覆盖:
      tI2dk6.png
    • 第一范式(1NF):若关系模式R(U)中关系的每个分量都是不可分的数据项(值、原子),则称R(U)属于第一范式,记为:R(U) (in) 1NF。1NF要求关系中不能有复合属性、多值属性及其组合。转换的方法是将复合属性处理为简单属性;将多值属性与关键字单独组成一个新的关系。
    • 第二范式(2NF):若(R(U) in 1NF)且U中的每一非主属性完全函数依赖于候选键,则称R(U)属于第二范式,记作:(R(U) in 2NF)。第二范式消除了非主属性对候选键的部分依赖。
    • 第三范式(3NF):第三范式消除了非主属性对候选键的传递依赖。
      t7kezt.png
    • Boyce-Codd范式(BCNF):若关系满足BCNF,则一定满足第三范式,反之未然。
      t7kezt.png
    • 将关系模式分解成3NF:将每一个函数依赖单独组成一个关系。
    • 将关系模式分解成BCNF:将左侧不含候选键的函数依赖单独组成一个关系,将包含候选键的组成一个关系。
    • 多值依赖:
      t7Ab4J.png
    • 多值依赖的特性:
      - 直观地,对于X给定值,Y有一组值与之对应(0或n个)且这组Y值不以任何方式与U-X-Y中属性值相联系,有(X ightarrow ightarrow Y)
      - 若交换t,s的Y值而得到的新元组仍然在r中,则(X ightarrow ightarrow Y)
      - X,Y不必不相交,u、v可以和t、s相同。
      - 函数依赖是多值依赖的特例。
      - 令Z = U-X-Y,有(X ightarrow ightarrow Z),若(Z = phi),则必有(X ightarrow ightarrow Y)
    • 对Armstrong公理的补充:
      t7ERaD.png
    • 引理,从Armstrong公理可得:
      t7E4Gd.png
    • 第四范式(4NF):第四范式消除了非主属性对候选键以外属性的多值依赖,如果有多值依赖,则一定依赖于候选键。
      t7ELdS.png
    • (R in 4NF),则必有(R in BCNF)
    • 若R上仅存在函数依赖,则若有(R in BCNF)即有(R in 4NF),反之也成立。
    • 弱第四范式(W4NF):
      t7VKL6.png
    • 模式分解:
      t7eA29.png
    • 模式分解引理1:
      t7euVK.png
    • 无损连接分解:
      t7mZWQ.png
    • 无损连接性检验算法:
      t7m0w6.png
      t7mBTK.png
    • 定理:设F是关系模式R上的一个函数依赖集合,( ho = {R_1, R_2})是R的一个分解,则:当且仅当(R_1 igcap R_2 ightarrow R_2 - R_1)属于(F^+)时,( ho)是关于F无损连接的。
    • 设关系模式R具有函数依赖集F,( ho = {R_1,....,R_k})是R的一个分解,且是关于F无损连接的分解,则有:
      t7mLXn.png
    • 保持依赖分解:对于关系模式R(U, F),U是属性全集,F是函数依赖集合,( ho = {R_1,...,R_k}是R的一个分解,如在)pi_{R_i}(F)(中的所有依赖只并集(i = 1...k)逻辑蕴含F的每一个依赖,则称分解) ho(保持依赖集F。其中)pi_{R_i}(F)(是F在)R_i(上的投影,即F中的任意投影)X ightarrow Y(,如果X、Y均包含于)R_i(,则有)X ightarrow Y in pi_{R_i}(F)(。其中)R_i(指)R_i$的属性集。其中保持依赖的分解可能不是无损连接的,无损连接的分解可能不是保持依赖的。
    • 保持依赖性检验算法:
      t7KZWD.png
    • 无损连接分解成BCNF的算法:
      t7KUyj.png
    • 保持依赖分解成3NF的算法:
      t7KHpD.png
    • 即保持依赖,又无损连接的分解:设(sigma)是按照前述算法构造的R的一个第三范式分解,X是R的候选键,则有:( au = sigma igcup {X})将是R的一个分解,且该分解中所有的关系范式是第三范式的,且( au)有保持依赖和无损连接性。其中( au)并不一定具有定理性质的最小可能关系模式的集合。我们可以一次去掉一个关系模式,只要所要求的性质仍具备,直至求得上述最小集合。
    • 无损连接分解成4NF:
      t7Q2ZR.png
    • 连接依赖:
      t7QHLd.png
    • 第五范式(5NF):当且仅当关系模式R的每个连接依赖均按其候选键进行连接运算时(均由R的候选键所隐含),则称R是第五范式的,记为(R in 5NF)。需要注意的是:
      - 第五范式消除了不按候选键连接的连接依赖,但其语义背景抽象。
      - (5NF subseteq 4NF)。第五范式也称投影连接范式,即PJNF。
      - 虽然总能把一个关系无损分解成多个5NF的关系,但由于目前尚不清楚如何找到关系的所有JD,故不清楚如何确定5NF关系。
    • 关系模式设计需要折中
      - 遵循关系范式原则,则需要将一个关系模式,拆解成两个或多个小的模式;而查询时,需要将这两个或多个小的模式联结成一个模式。
      - 遵循关系范式原则避免了冗余、插入异常、删除异常等问题,但是由于联结运算的低效率,使得查询速度很慢。
      - 通常建议关系模式符合BCNF

    第四部分 数据库管理系统实现技术

    • 盘面、磁道、扇区、块(连续的多个扇区)
    • 磁盘容量 = (n imes t imes s imes b),其中n表示总盘面数、t为每面磁道数、s为每道的扇区数、b为每个扇区存储的字节数。
    • 磁盘数据读写时间
      • 寻道时间
      • 旋转时间
      • 传输时间
      • tqIoQA.png(注:这个平均时间没找到公式)
    • RAID技术:
      • 并行处理:并行读取多个磁盘
        • 比特级拆分:一个字节被拆分成8个比特位,不同比特位存储于不同磁盘
        • 块级拆分:一个文件由多个块组成,不同块存储于不同磁盘
      • 可靠性:奇偶校验与纠错
        • 扇区/块读写校验:对一个扇区/块读写做校验
        • 磁盘间读写校验:多个磁盘间共同构成的信息读写做校验
    • RAID技术的等级划分:
      1. 块级拆分但无冗余
      2. 镜像处理:每一个磁盘有一个镜像磁盘
      3. 位交叉纠错处理:4个磁盘存储4位+3个校验盘存储3个校验位
      4. 位交叉检验:4个磁盘存储4位+1个校验盘存储1校验位,位拆分存储(借助于扇区读写校验判断出错磁盘,再依据校验盘进行纠错)
      5. 块交叉检验:块拆分存储
      6. 块交叉分布式校验:块拆分存储,互为校验盘
      7. 更为复杂的冗余处理
    • 数据库-表所占磁盘块的分配方法:
      • 连续分配:存在扩展困难问题
      • 链接分配:访问速度问题
      • 按簇分配
      • 索引分配
    • 文件组织:数据组织成记录、块和访问结构的方式,包括把记录和块存储在磁盘上的方式,以及记录和块之间相互联系的方法。
    • 存取方法:指的是对文件所采取的存取操作方法,一个文件组织可以采取多种存取方法进行访问。
    • 无序记录文件:记录存储于任一有空间的位置,存储的记录是无序的。更新效率高,但是检索效率可能低。方法一:新记录总插入到文件尾部;删除记录时,可以直接删除该记录所在位置的内容,也可以在该纪录前标记“删除标记”;方法二:在前者基础上,新增纪录可以利用那些标记为“删除标记”的记录空间。
    • 无序记录中的数据库重组:通过移走被删除的记录使有效纪录连续存放,从而回收那些由删除记录而产生的未利用空间。
    • 有序记录文件:记录按某属性或属性组值的顺序插入,磁盘上存储的记录是有序的。检索效率可能高。用于存储排序的属性通常称为排序字段,通常,排序字段使用关系中的主码,所以又称为排序码。当按排序字段进行检索时,速度得到很大提高;当按非排序字段检索时,速度可能不会提高很多。有序记录文件的更新效率可能很低,由于在更新时要移动其他记录,为插入记录留出空间。改进措施是可为将来有可能插入的元组预留空间或者再使用一个临时的无序文件保留新增的记录。当采取溢出文件措施时,检索操作既要操作主文件,又要操作溢出文件。
    • 有序记录中的数据库重组:将溢出文件合并到主文件中,并恢复主文件中的记录顺序。
    • 散列文件:可以把记录按某属性或属性组的值,依据一个散列函数来计算其应存放的位置:桶号。检索效率和更新效率都有一定程度的提高。用于进行散列函数计算的属性通常称为散列字段,散列字段通常也采用关系中的主码,所以又称为散列码。不同记录可能被hash成同一桶号,此时需在桶内顺序检索出某一记录。
    • 聚簇文件:聚簇是将具有相同或相似属性值的记录存放于连续的磁盘簇快中。多表聚簇是将若干个相互关联的Table存储于一个文件中,这可提高多表情况下的查询速度。
    • Oracle数据库的内容略过,因为实验啥的都是MySQL,我也不知道zdc哪里nc讲这个。
    • 索引是定义在存储表基础之上,有助于无需检查所有记录而快速定位所需记录的一种辅助存储结构,由一系列存储在磁盘上的索引项组成,每一索引项又由两部分构成:
      • 索引字段:由Table中某些列中的值串接而成。索引中通常存储了索引字段中的每一个值。
      • 行指针:指向Table中包含索引字段值的记录在磁盘上的存储位置。
      • 存储索引项的文件为索引文件,对应,存储表又称为主文件。
    • 索引文件是一种辅助存储结构,其存在与否不改变存储表的物理存储结构,其存在可以明显提高存储表的访问速度。
    • 索引文件组织方式有两种:
      • 排序索引文件:按索引字段值的某一种顺序组织存储
      • 散列索引文件:依据索引字段值使用散列函数分配散列桶的方式存储
    • 有索引时,更新操作必须同步更新索引文件与主文件。
    • 衡量索引性能好坏:
      • 访问时间
      • 插入时间
      • 删除时间
      • 空间负载
      • 支持存取的有效性
    • SQL中创建索引:
      CREATE [unique] INDEX indexname ON tablename(colname [asc|desc] {, colname [asc|desc]...});
      
    • 稠密索引:对于主文件中每一个记录,都有一个索引项和它对应,指明该记录所在位置。这样的索引称为稠密索引。
    • 稀疏索引:对于主文件中部分记录,有索引项与它对应。
    • 稀疏索引定位记录的方法:
      • 定位索引字段值为K的记录,需要
        • 首先找相邻的小于K的最大索引字段值所对应的索引项
        • 从该索引项所对应的记录开始顺序进行Table的检索
      • 稀疏索引的使用要求:主文件必须是按对应索引字段属性排序存储
      • 相比稠密索引:空间占用更少,维护任务更轻,但速度更慢
      • 平衡:索引项不指向记录指针,而是指向记录所在存储块的指针,即每一存储块有一个索引项,而不是每条记录有一索引项(主索引)。
    • 候选键属性的稠密索引:先查索引,然后再依据索引读主文件。
    • 无论是候选键属性的稠密索引,还是非候选键属性的稠密索引:索引文件中不存在搜索码的值,就代表着主文件中没有对应搜索码的记录。
    • 非候选键属性的稠密索引:
      • 索引文件中索引字段的值是不重复的,主文件按索引字段排序且索引字段不是候选键。
      • 索引文件中索引字段是有重复的,主文件未按索引字段排序且索引字段不是候选键。
      • 引入指针桶处理非候选键索引的多记录情况,主文件未按索引字段排序且索引字段不是候选键。
    • 主索引:通常是对每一存储块有一个索引项,索引项的总数和存储表所占 的存储块数目相同,存储表的每一存储块的第一条记录,又称为锚记录,或简称为块锚。主索引的索引字段值为块锚的索引字段值,而指针指向其所在的存储块。主索引是按索引字段值进行排序的一个有序文件,通常建立在有序主文件的基于主码的排序字段上,即主索引的索引字段与主文件的排序码(主码)有对应关系。主索引是稀疏索引。
    • 辅助索引:是定义在主文件的任一或多个非排序字段上的辅助存储结构。辅助索引通常是对某一非排序字段上的每一个不同值有一个索引项:索引 字段即是该字段的不同值,而指针则指向包含该记录的块或该记录本身;当非排序字段为索引字段时,如该字段值不唯一,则要采用一个类似链表 的结构来保存包含该字段值的所有记录的位置。辅助索引是稠密索引,其检索效率有时相当高。
    • 主索引和辅助索引的对比:
      • 一个主文件仅可以有一个主索引,但可以有多个辅助索引。
      • 主索引通常建立于主码/排序码上面;辅助索引建立于其他属性上面。
      • 可以利用主索引重新组织主文件数据,但辅助索引不能改变主文件数据。
      • 主索引是稀疏索引,辅助索引是稠密索引。
    • 聚簇索引:指索引中邻近的记录在主文件中也是临近存储的。
    • 非聚簇索引:指索引中邻近的记录在主文件中不一定是邻近存储的。
    • 如果主文件的某一排序字段不是主码,则该字段上每个记录取值便不唯 一,此时该字段被称为聚簇字段;聚簇索引通常是定义在聚簇字段上。
    • 聚簇索引通常是对聚簇字段上的每一个不同值有一个索引项(索引项的总数和 主文件中聚簇字段上不同值的数目相同),索引字段即是聚簇字段的不同值,由于有相同聚簇字段值的记录可能存储于若干块中,则索引项的指针指向其中的第一个块。
    • 一个主文件只能有一个聚簇索引文件,但可以有多个非聚簇索引文件。
    • 主索引通常是聚簇索引(但其索引项总数不一定和主文件中聚簇字段上不同值的数目相同,其和主文件存储块数目相同);辅助索引通常是非聚簇索引。
    • 主索引/聚簇索引是能够决定记录存储位置的索引;而非聚簇索引则只能用于查询,指出已存储记录的位置。
  • 相关阅读:
    大杂烩 -- 查找单向链表倒数第m个元素
    大杂烩 -- 单向链表是否存在环或是否相交
    大杂烩 -- 四种生成和解析XML文档的方法详解
    延伸 -- 泛型 -- 通配符的使用
    延伸 -- 泛型 -- 泛型的内部原理:类型擦除以及类型擦除带来的问题
    延伸 -- 泛型 -- 泛型的基本介绍和使用
    大杂烩 -- HashMap、HashTable、ConCurrentHashMap 联系与区别
    大杂烩 -- ArrayList的动态增长 源码分析
    Java -- 异常的捕获及处理 -- 自定义异常类
    Java字符串占位符(commons-text)替换(转载)
  • 原文地址:https://www.cnblogs.com/winston8086/p/13057458.html
Copyright © 2020-2023  润新知