• 《数据库设计入门经典》读书笔记——第三章:数据库建模构建块


    规范化用于粒度化和组织在数据库中使用的数据。

    在第4章中将详细介绍规范化和应用范式的过程。在这个阶段只需要知道规范化是用于将数据划分到单独表中的方法或公式——根据一组规则。

    不信任将视图用于除了安全性目标之外的任何事情。

    表的概念

    在数据模型理论中,表是连续存入数据的存储桶。关系数据库模型和规范化的思想是,特定表中的数据直接与相同表中的所有其他项关联。

    相同表中的所有记录具有相同的字段结构。

    表、字段、记录、元组

    字段、列、属性都是用于描述表中字段的术语。

    数据类型

    数据类型可以分为3中类型:

    • 简单数据类型——这些是在单值上应用模式或者值限制的数据类型。
    • 复杂数据类型——包括连接对象和关系数据库的任何数据类型,包括二进制对象和集合数组等项。
    • 专门的数据类型——存在较为高级的关系数据库中,这些数据库可以存储固有的结构化数据,比如XML文档、空间坐标数据、多媒体数据。

    关于规范化

    规范化通常设法将信息划分为较小的、更容易管理的部分,但最好不要太小。大多数明显的冗余通常可以删除。从商业上来说,主要的目标是节省空间和组织数据以实现可用性和可管理性。非常繁忙的应用程序和终端用户的要求可能会迫使在许多方面违反规范化的规则,以满足性能需要。第三范式以上的范式通常被忽略,有时甚至第三范式也被忽略。

    规范化是自增的过程。换言之,每个范式层添加到已经应用的范式。例如,第二范式只可以应用于第一范式中的表,而第三范式不可以应用于第四范式中的表,因为根据定义,第四范式中的表是已经在第三范式中表的积累。

    规范化的优点

    • 减少存储数据的物理需求
    • 数据组织得更好
    • 规范化允许立刻修改表中的少量数据(也就是一条记录)。

    潜在的规范化危险

    在规范化的一些细节方面的积极影响可能具有消极的副作用,并且有时是产生反效果,这取决于数据库的应用程序关注对象。性能总是又这样的问题:由过度的应用程序规范化造成的过分粒度化。过分要求并发的OLTP数据库可能受到过分粒度化的负面影响。要注意以下几点:

    • 涉及的物理空间不断增大
    • 过度的最小化冗余暗示过细的粒度和过多的表。过多的表可能导致特别大的SQL连接查询。SQL连接查询的表越多,该查询的执行就越慢。性能受到彻底的影响,从而使应用程序彻底无用。
    • 使用过度数量的冗余最小化较好地组织数据实际上可能导致更多的复杂性。规范化层次越深入,模型就变得越数学化。

    用ERD表示关系

    表和表之间可以有各种类型的关系,可以通过实体关系图(Entity Relationship Diagram, ERD)中的显示最好描述不同类型的表之间的关系。

    鸟足结构

    鸟足结构(crow's foot)用于描述一对多关系或多对多关系的"多"边。应该可以了解到,许多脚趾是指多于一个,因此是多个。

    一对一

    一对一关系用的比较少,除非在因为存储空间的价格非常便宜的例外情况中。一对一关系是第四范式转换的典型情况。

    一对多

    一对多关系在关系数据库模型的表之间特别常见。

    多对多

    多对多关系意味着,对于一个表中的每一条记录,在另一个表中有许多可能的对应记录,反之亦然。多对多关系的经典示例是多个学生注册大学中的多门课程。含义是每个学生注册多门课程,而每门课程有多个学生注册。

    多对多的关系可以用中间关联表来解决,用两个一对多来解决。

    零、一或多

    表之间的关系可以是零、一或多。零是指记录不需要存在于目标表中,具有零的一是指它可以存在,没有零的一是指它必须存在,而多就是指多个。

    即使出版商当前没有出版任何图书,也可以称之为出版商。

    标识和非标识的关系

    图3-20显示了标识关系、非标识关系、以及依赖表。

    • 标识关系——子表由父表部分标识,并且部分取决于父表。父表的主键包括在子表的主键中。
    • 非标识关系——子表不取决于父表,从而子表作为外键包括父表的主键,而不是作为子表主键的一部分。
    • 依赖实体或表——CoAUTHOR表依赖于AUTHOR和PUBLICATION表。对于具有于父表的标识关系的表,存在依赖表。
    • 非依赖实体或表——这是依赖表的对立面。

    键用于标识并最终用于在日后从数据库中检索记录。

    主键

    主键用于唯一标识表中的记录。每个记录的唯一标识是必要的,因为如果没有使用唯一标识符,则没有其他方法来查找唯一的记录。

    唯一键

    类似于主键,在整个表中只包含唯一值的字段上创建唯一键。为啥要创建不是主键的唯一键?如果使用代理键并且需要作者名字是唯一的,则经常会在名字上创建唯一键。唯一键可以确保整个表中的唯一性。主键总是唯一的,或者至少是唯一键:然而,主键也用于定义表与表之间的关系。唯一键不用于定义表之间的关系。

    外键

    外键是在子表中创建的主键的副本,用于组成表间关系的对立面:建立关系数据库关联。外键定义子表中每个记录的引用,反向引用父表中的主键。

    第4章将更多地解释如何使用主键和外键以及为什么使用它们。此处只需要记住主键唯一地标识表中的每个记录。外键是主键的副本,从父表中复制而来,用于建立父表和子表之间的关系。唯一键只是确保表中某值的唯一性。

    参照完整性

    它确保表之间参照关系的完整性,由主键和外键定义这种关系。在这两个表之间的关系中,一个表有主键,而另一个表有外键。主键唯一标识第一个表中的每个记录。外键放置在关系中的第二个表中,因此外键包含来自于相关表中记录的主键的副本。

    参照完整性就是保证相关表中主键值和外键值之间关系的完整性。大多数关系数据库引擎使用通常所谓的约束。主键和外键都是约束。记住,约束是为表定义的一种元数据,用于定义值上的限制。主键约束强制主键字段唯一。主键约束也强制对引用回主键约束的任何外键约束进行检查。引用(或参照)外键约束可以在任何表中,包括与由外键引用的主键约束字段(自连接)相同的表。

    • 将新的记录添加到子表时,如果输入外键值,把必须存在于父表的相关主键字段中。外键字段可以包含NULL值,主键字段值永远不可以包含NULL值,因为它们必须唯一。
    • 如果在修改主键时修改父表中的记录,这种修改必须级联到任何相关子表中的所有外键记录值。
    • 当修改子表中的记录时,对外键的修改需要检查相关的主键是否存在。如果外键被改为NULL,则不需要任何主键。如果外键被改为非NULL值,则外键值必须作为相关父表中的主键值存在。
    • 当删除父表中的记录时,则子表中的相关外键记录必须也被级联删除,或者首先从子表中删除。

    索引

    索引并不是真正关系型数据库自身的一部分;然而,索引对性能和整体的数据库可用性是非常重要的。

    索引的基本概念

    索引通常并且最好是表的非常小部分的副本。创建索引的操作在物理上复制一个或多个字段,将这些字段索引到磁盘的单独区域中,而不是表的单独区域中。在一些数据库中,索引可以存储在完全于表的文件分离的文件中。在物理层上,不同的数据库具有不同的结构。重要的因素是底层的物理分离。当访问表时,进程通常调用优化器来决定是否访问表,扫描表中所有的记录,或者是较快地读取更小的索引连同表的非常小的一部分。

    索引在本质上的行为类似于书前面的目录。下面是创建索引需要避免的一些事情:

    • 创建过多的索引——表上多度的索引可能导致非常缓慢的数据库修改响应。这是因为表的修改更新附加在表上的每个索引以及该表。为表创建更多的索引,则需要更多物理上的修改。
    • 索引过多的字段——索引过多的字段不仅使通过查询时使用索引更为复杂,而且使索引在物理上过大,索引必须相对小于表,并且应该是表中尽可能少的字段上的索引。

    辅助索引

    这个在文中写得不是很清楚,还要在查一下它的概念。

    外键索引

    子表中的外键不仅可以重复(一对多),而且可以在子表中的NULL值(一对零、一或多)。

    索引的类型

    索引的溢出是什么意思?

    • B树索引——B树意味着"二叉树"。
    • 位图索引——位图索引包含使用0和1的每个记录的二进制表示。
    • ISAM索引——索引顺序访问方法(Indexed Sequential Access Method, ISAM)使用具有记录号列表的简单结构。ISAM索引最适用于静态数据。
    • 散列表——散列表是数据的副本,但是根据散列算法,以不同的和更有效的访问顺序重新安排这些数据。对于读访问,散列索引可能非常有效,但在进行任何类型的数据修改时,最好避免使用它。将记录的修改从表推入到索引中的唯一方法是重新生成整个散列表索引。
    • 索引组织表——索引组织表(Index Organized Table, IOT)以索引的排序顺序构建表,一般使用B树索引。

    构建索引的不同方法

    • 升序和降序索引——可以以正常的升序升序或降序顺序有序地构建索引。
    • 唯一索引——索引值可以是唯一的(不可以包含重复的值)。
    • 非唯一索引——索引中包含重复的值。
    • 复合索引——可以在多个字段上构建索引。
    • 压缩索引——允许压缩复合索引,其中重复的前缀值在索引中被有效地索引,并且删除前缀索引字段中的重复内容。
    • 反向键索引——怪异的和不常用的索引。非常少的数据库允许构建索引,从而将索引的字段值存储为反向字符串。当一次性将极大数量的记录添加到非常繁忙的数据库的索引时,添加顺序的索引值(而不是反向的)会一次性将许多记录全部添加到索引中的相同物理空间。结果一些关系数据库称为锁定,其他的关系数据库称为热阻塞,导致完全停滞。
  • 相关阅读:
    那一定都是你的错!- 一次FastDFS并发问题的排查经历
    程序员和烟民
    Spring Boot(十六):使用 Jenkins 部署 Spring Boot
    阿里Dubbo疯狂更新,关Spring Cloud什么事?
    从架构演进的角度聊聊Spring Cloud都做了些什么?
    FastDFS 集群 安装 配置
    中小型互联网公司微服务实践-经验和教训
    jvm系列(十一):JVM演讲PPT分享
    jvm系列(十):如何优化Java GC「译」
    Spring Boot (十五): Spring Boot + Jpa + Thymeleaf 增删改查示例
  • 原文地址:https://www.cnblogs.com/tuhooo/p/8469027.html
Copyright © 2020-2023  润新知