sql 范式
2015-07-11 09:21
363 查看
范式,英文 normal from ,直接翻译就是通用的形式。也就是在数据库设计中的通用设计标准。
在说明一个范式前先声明几个概念。表中的关键字。
一张表总会有好几个字段,其中有某些字段是有一定作用的,叫做关键字,关键字有几种:公共关键字,主关键字,外关键字,候选关键字。
公共关键字就是在表中能够共同表示同样的意思的几部分;
主关键字,也会简称主键,主键可以代表这张表的存在;
外关键字,也会简称外键,就是在这张表中可以通过这个外键找到对应的其他表,在语法中要加上一个映射;
候选关键字就是加入表中有几部分都可以作为关键字,选好其中一个作为主键,那么其他的几个就是候选关键字了。
create table test(
a int primary key,
b varchar(3)
);
其中表test就是主键
create table test1(
a int primary key ,
b varchar(3),
test_id int,
foreign key(test_a) test(a)
);
其中a 是主键,test_id 是外键,外键的映射在下一句中 foreign key(test_a) test(a) ,表明这个外键对应表test的主键。
对于这几个关键字就好比美国选总统一样,所有参加被选举的人一起就是公共关键字,最后当上总统那个就是代表美国的人,即主键,参选但是没被选上的就是候选关键字,如果总统刚选上就死掉了,这个候选人就有资格继续参选,如果有某些国家的外加大使在那里看着,这个人就可以当做外键了。
函数依赖:函数依赖是 一种依赖关系,这种关系没有绝对的存在,要看具体的环境,函数依赖就是一张表中,里面的某些字段是有关联的,其他的一个或几个的存在可以决定其他的字段的存在,这个比如表 test(name,address,identity,factory_address),对于这张表大部分的情景下都可以认为是一个人的name,可以决定他的 address, identity 的存在,所以存在依赖(name)->(address,identity),这就是函数依赖。
在sql中一般有 几种范式 第一范式(1NF),第二范式(2NF),第三范式(3NF),BC范式,(还有第四范式和第五范式,这两个不提)。
第一范式:就是表的中字段的设计要符合原子性,原子性就是不可分开,比如一个字段 名字,名字有名和姓 的存在,所以这个字段就是不符合原子性的。
第二范式:表中所有的字段都必须和主键有依赖关系,如果主键是组合主键(多个关键字组合形成主键),也必须是同时和组合主键中的所有字段有依赖关系,不能只和主键中部分字段有依赖关系。这样可以看到,如果主键只是一个字段的话,那表就符合第二范式。如果出现不符合第二范式的字段的情况,可将该字段分离出来。
第三范式:在第二范式的基础上不存在传递依赖(X->Y,Y->Z),如果出现这种情况可以将原来的表(X,Y,Z),分离为两张表,表1(X,Y),表2(Y,Z)。
BC范式:在第三方式的基础上,候选关键字不存在相互依赖的关系,比如在一种情景中有(X,Y)->(R,Z),(R,Y)->(X,Z),这样(X,Y)和(R,Y)就属于候选关键字,但注意到有这样的关系X->R 和R->X,这样就不符合第三范式了。
在说明一个范式前先声明几个概念。表中的关键字。
一张表总会有好几个字段,其中有某些字段是有一定作用的,叫做关键字,关键字有几种:公共关键字,主关键字,外关键字,候选关键字。
公共关键字就是在表中能够共同表示同样的意思的几部分;
主关键字,也会简称主键,主键可以代表这张表的存在;
外关键字,也会简称外键,就是在这张表中可以通过这个外键找到对应的其他表,在语法中要加上一个映射;
候选关键字就是加入表中有几部分都可以作为关键字,选好其中一个作为主键,那么其他的几个就是候选关键字了。
create table test(
a int primary key,
b varchar(3)
);
其中表test就是主键
create table test1(
a int primary key ,
b varchar(3),
test_id int,
foreign key(test_a) test(a)
);
其中a 是主键,test_id 是外键,外键的映射在下一句中 foreign key(test_a) test(a) ,表明这个外键对应表test的主键。
对于这几个关键字就好比美国选总统一样,所有参加被选举的人一起就是公共关键字,最后当上总统那个就是代表美国的人,即主键,参选但是没被选上的就是候选关键字,如果总统刚选上就死掉了,这个候选人就有资格继续参选,如果有某些国家的外加大使在那里看着,这个人就可以当做外键了。
函数依赖:函数依赖是 一种依赖关系,这种关系没有绝对的存在,要看具体的环境,函数依赖就是一张表中,里面的某些字段是有关联的,其他的一个或几个的存在可以决定其他的字段的存在,这个比如表 test(name,address,identity,factory_address),对于这张表大部分的情景下都可以认为是一个人的name,可以决定他的 address, identity 的存在,所以存在依赖(name)->(address,identity),这就是函数依赖。
在sql中一般有 几种范式 第一范式(1NF),第二范式(2NF),第三范式(3NF),BC范式,(还有第四范式和第五范式,这两个不提)。
第一范式:就是表的中字段的设计要符合原子性,原子性就是不可分开,比如一个字段 名字,名字有名和姓 的存在,所以这个字段就是不符合原子性的。
第二范式:表中所有的字段都必须和主键有依赖关系,如果主键是组合主键(多个关键字组合形成主键),也必须是同时和组合主键中的所有字段有依赖关系,不能只和主键中部分字段有依赖关系。这样可以看到,如果主键只是一个字段的话,那表就符合第二范式。如果出现不符合第二范式的字段的情况,可将该字段分离出来。
第三范式:在第二范式的基础上不存在传递依赖(X->Y,Y->Z),如果出现这种情况可以将原来的表(X,Y,Z),分离为两张表,表1(X,Y),表2(Y,Z)。
BC范式:在第三方式的基础上,候选关键字不存在相互依赖的关系,比如在一种情景中有(X,Y)->(R,Z),(R,Y)->(X,Z),这样(X,Y)和(R,Y)就属于候选关键字,但注意到有这样的关系X->R 和R->X,这样就不符合第三范式了。
相关文章推荐
- asp下查询xml的实现代码
- SQL语句的各个关键字的解析过程详细总结
- C# 的关键字详细介绍
- C# 参考之访问关键字:base、this
- .net(c#)中的new关键字详细介绍
- C#基础语法:Base关键字学习笔记
- 深入分析C++中几个最不常用的关键字
- 详谈signed 关键字
- 探讨register关键字在c语言和c++中的差异
- C++的static关键字及变量存储位置总结
- C 语言restrict 关键字的使用浅谈
- asp.net中的check与uncheck关键字用法解析
- C# yield关键字详解
- PPK 谈 JavaScript 的 this 关键字 [翻译]
- JavaScript声明变量时为什么要加var关键字
- 浅谈C/C++中的static与extern关键字的使用详解
- Delphi之Pascal语言中的关键字及保留字汇总
- Java中使用synchronized关键字实现简单同步操作示例
- C# dynamic关键字的使用方法
- 网站关键字设置技巧放松了比较不错的关键词设置方法