最近翻看数据库设计方面的理论部分,遇到一些很有意思的问题,现在记录一下。
第一个问题:第一范式的产生由来,以及产生这种指导意见之后后续的问题
第一范式的定义:若关系模式R的每一个分量是不可再分的数据项,则关系模式R为第一范式。
这是采用严格的数学格式定义形式: 如果... ...,那么... ...。
关系模式R=所有的分量+分量之间的函数依赖=(关系数据库一张表中)字段+字段之间的依赖关系+所有的数据
第一范式强调的是分量的不可再分,但是并没有说不可再分的现实标准是什么。不过非常值得注意的是,这里是数学定义啊,你见过数学的定义带过单位没有,物理吗还差不多。
其次如果严格遵循第一范式之后,还有什么问题呢? R中两个分量名称类似数据一致的冗余问题,R中存在有些关系的内容需要变动的时候,可能会引起其他更新上的问题。只更新一个关系的时候却发现这个关系重复。
第二个问题:为了解决遵循第一范式之后出现的问题,产生了第二范式。
第二范式的定义:如果关系模式R属于1NF,且每一非主属性依赖于码,则关系模式R属于2NF。
还是采用数学定义的形式,不过引入了新的一些名词定义。
非主属性:就是关系模式R中分量组合包含的数据不可以唯一确定一个关系的分量组合的另外一个称呼。
简单的说就是一条数据中字段组合不可以保证当前数据在表中是独一无二的这种字段组合,就是非主属性。
码:码就是关系模式R中可以确定一条关系的分量组合。
简单说就是可以拿来当主键的字段组合。
看上去第二范式进步有点大,不过有点扯着了。万一码不是唯一的,关系模式R里面有多个码,好像还是有冗余问题啊?
这个先暂停一会,我们遵循了2NF之后好像整个关系模式R现在还没有进行真正有效的简化,现在一直在做数据的拆分,组合。1NF是数据的拆分,做到原子性。2NF是组合,组合出非主属性和码,让非主属性函数依赖于码。