范式化是指通过分析表中各属性之间的互相依赖,并把大表映射为多个小表的过程
    超键是一个或多个属性的集合,其能帮助我们唯一确定一条记录。若组成超键属性列的
    子集仍为一个超键,但该子集少了任何一个属性都将使其不再是一个超键,则该属性列
    子集称为候选键。主键是从一张表的候选键集合中任意挑选出的,作为该表的一个索引。
    候选键是超键中最精简的能做超键的键组合;
    主键是从候选键集合中选出来的一组键。
    数据库(第一范式,第二范式,第三范式)
    第一范式:当且仅当一张表的所有列只包含原子值时,即表中每行中的每一个列只有一个值,则
    该表符合第一范式。
    不能有重复字段,且每个字段不能再拆分。
    但是存在:更新异常 插入异常 删除异常
    第二范式:一张表满足第二范式( 2NF)的条件是当且仅当该表满足第一范式且每个非键属性完全依赖于主键。
    但由于存在传递依赖(transitivedependency),满足第二范式的表仍会存在数据操作异常(anomaly)。
    第三范式:
    定 义: 一张表满足第三范式( 3NF)当且仅当其每个非平凡函数依赖 X –> A,其中 X 和 A可为简单或复合属性,必须满足以下两个条件之一。

    1. X 为超键
    2. A 为某候选键的成员。

    若 A 为某候选键的成员,则 A 被称为主属性。注:平凡函数依赖的形式为 YZ –> Z
    不允许传递依赖,各个非主键必须直接依赖于主键
    第二范式(2NF)和第三范式(3NF)的概念很容易混淆,区分它们的关键点在于:
    2NF:非主键列是否完全依赖于主键,还是依赖于主键的一部分;
    3NF:非主键列是直接依赖于主键,还是直接依赖于非主键列
    BCNF范式:
    定义:一张表 R 满足 Boyce-Codd 范式( BCNF),若其每一条非平凡函数依赖 X –> A 中 X 为超键。
    BCNF 范式是比第三范式更高级别的范式因为其去除了第三范式中的第二种条件(允许函数
    依赖右侧为主属性),即表的每一条函数依赖的左侧必须为超键。每一张满足 BCNF 范式的
    表同时满足第三范式、第二范式和第一范式。
    无损分解是指把一张表分解为两张小表后,通过对两张小表进行 natural join 得到的表与原始表相同,不会产生任何多余行
    如果是一对多就用外键
    如果是多对多就再多建一张关系表
    如果是一对一,其中一张表的数据属性多,另一张表的属性少,就把属性少的表的字段冗余进去,建一张表 (冗余进属性多的表)
    当然也可以分开建,一个表的主键是另外一个表的外键
    不冗余的话,建两张表,查询的时候查两张,做笛卡尔积运算,耗时间
    这些表里面的终端ID就是冗余字段了
    在数据库操作中应该要尽量避免判断字段为不为空的情况。
    我理解了,客户端查询是这样的,先点终端,再点探头
    范式化 - 图1
    甘颖认为,布设表中探头1和探头2这样的设计很不合理,不利于他们那边的数据库查询操作
    例如:当我想要查询某个终端对应几个探头时,我得查这个布设表,并且判断探头ID1和探头ID2为不为空。而在数据库操作中应该要尽量避免判断字段为不为空的情况。
    如果按照标准化的设计的话,我只需要查询探头表中终端ID等于我想要查询的终端ID,然后看查询结果有几条记录就好了
    反范式化 反规范化:故意引入冗余
    范式化 - 图2
    多值属性:弱实体
    多对多:
    表分割
    表合并