关系模型的描述

1.1主键

唯一的名称标识表或列的东西。确保列数据的独立性。

主键的特点:

1.必需性。每一个表都要有主键,用来作为每一行数据的标识。表内的数据是无序的,没有主键,将难以找到你要的行。或者,出现重复的行,将难以甄别。因此必须要有主键。

2.唯一性。主键就是为了标识不同的行而存在,因此不能出现两个一样的主键。对组合主键来说,可以出现一样的单个元素,但是整体不能一样。

3.可组合性。主键不一定是单单的列,单列主键叫做简单主键;主键也可以有多个列组成,这样的主键叫做组合主键。

4.非空性。简单主键的值不能为空,组合主键的列不能为空。总之不能空。

5.稳定性。主键的值一旦创建,将很少改变。(必知必会认定是不能改变)。假定某行从表中删除,该主键也不能再被使用在以后的新行内。

6.最小性。主键只包括满足唯一性的必要的列。(这一点是考虑到后续的范式要求)

另外:

1.出于保护隐私的考虑。主键可能不会用例如:生日、身份证号等元素。而采取人造主键。

2.数据库设计人员在一个表中也许选择多个唯一候选键,其中之一被指定为主键。指定以后,其余的候选键则变为预备键。候选键通常有不能为空和唯一的约束。


1.2外键

外键,用于将处在不同的表中的内容,进行连接和定位。通过外键可以使表关联。

外键的特点:

1.它是表中的某一列或者某一组列。它的值,与其他表的值相关联,或者引自其他表的值。

2.它确保表的行,在另一个表中有对应行

3.包含外键的表叫做子表,引出外键的表叫做父表

4.外键建立了子表和父表主键(或任意候选键)的联系。因此外键的值受制于父表的值。这个也叫做引用完整性约束。因此,不可以在子表中插入父表中没有的行;也不可以直接删除父表中已经关联的行。

5.外键可以为空。通常认为是存在待定事项和结果。

6.外键和父表的主键可以有不同的列名

7.外键的值在自己的表中通常不唯一。

8.外键可以引用自己表的主键,这个叫做自引用


1.3联系

联系则是两张表之间的关系描述。分为一对一、一对多、多对多(此处应该配图)。

一对一联系

假设表A、B。在表A中的每一行,在B中最多有一个能匹配上的行,对B来说也是如此,即一对一联系。

虽然我们可以把信息放在一个表里,但为了安全原因、加快查询或者避免键入空值,采用这种方式来构造表。

一对多联系

假设表A、B。在表A中的每一行,可以匹配表B中的0个行或者多个行,反之,表B中的行只能在表A中对应一行。即一对多联系。

多对多联系

假设表A、B。在表A中的每一行,可以匹配表B中的0个行或者多个行,反之,表B中的行也能匹配表A中的0行或者多个行。即一对多联系。

仅当产生第三个联结表的表时,多对多关系就出现了。这种技术将多对多关系转化成两个独立的一对多关系,联结表的每一行都是唯一值。


1.4规范化

我们可以构造一个十分巨大的表,把所有的信息都包含进去。但相应带来的结果,就是数据冗余,查询变慢,更新删除等操作无比困难。规范化就是通过修改表,来达到减少冗余和矛盾的效果。

规范化水平越高,表的数量就越多。

无损分解可以确保表的分割不缺失信息。

依赖-保持分解可以确保联系不丢失。在表被分割时,储存信息的主键和外键列不应认为是冗余的数据。

规范化不是等级越高越好,在够用、满意即可。


第一范式:列仅包含原子值,并且不存在重复组,且每个数据行都存在独一无二的识别项。

原子值是不能再被细分的单一值。即列中出现的内容,针对实际应用来说应该是不能再被细分的内容。

重复组是指:在一个表中,不存在多个列来描述一个实例。如一本书有3个作者,就不要出现三个列来分别存储每一个作者。

有独一无二的识别项,很好理解的就是主键。有一个合适的主键很重要。


第二范式:当满足第一范式的表,满足下列条件之一即符合第二范式:主键是一个列(即不存在组合主键) 或者  表中的所有列是主键的一部分。这也是第一范式转为第二范式的有效方法。

满足第二范式的表,必然满足第一范式,同时消除部分函数依赖(即满足完全函数依赖)。

部分函数依赖:表中非主键的列,依赖于组合主键的某个部分,但是不完全依赖于组合主键。更通俗的说,表中的部分组合主键(不是全部),可以确定一个非键列的值,则部分函数依赖产生。

举例:组合主键为:书名,作者名;非键列:作者电话,作者住址。从作者电话这个角度来看,只依赖于作者名,与书名无关。此即部分函数依赖,同时表格不满足第二范式。

一般简单的判明语句如下:假如我只知道一部分主键的情况,我可以确定非键列的值吗?是的话,就当然符合部分函数依赖了。只需要出现一例,就符合部分函数依赖。要想办法消除啊。

有一个消除部分函数依赖的办法很简单:加入人工主键,即编入id为一个自动增长的数字或者随机的数字,并以此为主键,就可以解决部分函数依赖。


第三范式:满足第二范式,且消除传递函数依赖。第三范式要求非键列相互独立,并且只依赖于主键。

传递函数依赖:在表中出现非键列,而该非键列与另一个非键列存在关联。即改变这个非键列,从而会导致另一个非键列的改变。

举例:主键为:书号;非键列:价格,出版城市,出版社编号。从出版城市这个角度来看,出版社编号不确定,因为出版社在一个地方有很多家。但是,但是,从出版社编号来看,出版城市则确定。因为出版城市,理论上来说是依赖于出版社编号的。

一般简单判断语句如下:假如我知道一些其他非键列的值,可以确定一个非键列吗?是的话,就出现传递函数依赖,需要好好剔除了。在判定时,要注意相互判定,不能只从A到B的角度判定,还要从B到A的角度判定。

消除传递函数依赖的方法一般是:建立一个新的表格,将找到的依赖转化到别处。


当然还有很多其他的范式。但由于不断深入的规范化,表的数量不断增加。有时候为了增加性能,而进行非规范化操作。还是要声明,规范化够用就好了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容