[转]数据库设计三大范式
http://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html
数据库设计三大范式
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。
在实际开发中最为常见的设计范式有三个:
1.第一范式(确保每列保持原子性)
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
第一范式的合理遵循需要根据系统的实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样设计才算满足了数据库的第一范式,如下表所示。
上表所示的用户信息遵循了第一范式的要求,这样在对用户使用城市进行分类的时候就非常方便,也提高了数据库的性能。
2.第二范式(确保表中的每列都和主键相关)
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的联合主键,如下表所示。
订单信息表
这样就产生一个问题:这个表中是以订单编号和商品编号作为联合主键。这样在该表中商品名称、单位、商品价格等信息不与该表的主键相关,而仅仅是与商品编号相关。所以在这里违反了第二范式的设计原则。
而如果把这个订单信息表进行拆分,把商品信息分离到另一个表中,把订单项目表也分离到另一个表中,就非常完美了。如下所示。
这样设计,在很大程度上减小了数据库的冗余。如果要获取订单的商品信息,使用商品编号到商品信息表中查询即可。
3.第三范式(确保每列都和主键列直接相关,而不是间接相关)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。如下面这两个表所示的设计就是一个满足第三范式的数据库表。
这样在查询订单信息的时候,就可以使用客户编号来引用客户信息表中的记录,也不必在订单信息表中多次输入客户信息的内容,减小了数据冗余。
[转]数据库设计三大范式
标签:
小编还为您整理了以下内容,可能对您也有帮助:
数据库三大范式是什么?
表二
表三
三、第三范式(3NF)
官方的说法就不写了,简单来说就是,某一列除了完全依赖于主键外,不能依赖于别的非主键的列,否则就不符合第三范式了。比如下面的表四:
表四
上表中,主键是学号,我们知道导师办公室依赖于主键学号,但是同时也依赖于导师ID,因此不符合第三范式。可以通过拆分成下面两个表:表五和表六,符合第三范式。
表五
表六
说明:(1)3NF和2NF有点儿类似,2NF要求不能依赖于主键的一部分,而3NF要求不能依赖于除主键以外的列。
(2)之所以是要符合第三范式,是为了避免太多重复的内容,例如对于导师ID为12的,该表里面就有两条重复的,以后如果ID为12的导师更换办公地址,那么就需要对表中ID为12的导师办公地点全部进行更新,虽然数据量少的时候update一下花不了多长时间,可是万一有好多好多条,更新起来,估计死的心都有了。
BCNF、第四范式、第五范式,实在不想说了,真的感觉没什么用,当然如果为了防止被某些学术权威唬住,倒是可以学习学习。
最后祝愿大家在三大范式的指导下,建的一手好表。
数据库范式到底是怎么个回事
标签:
数据库三大范式是什么?
表二
表三
三、第三范式(3NF)
官方的说法就不写了,简单来说就是,某一列除了完全依赖于主键外,不能依赖于别的非主键的列,否则就不符合第三范式了。比如下面的表四:
表四
上表中,主键是学号,我们知道导师办公室依赖于主键学号,但是同时也依赖于导师ID,因此不符合第三范式。可以通过拆分成下面两个表:表五和表六,符合第三范式。
表五
表六
说明:(1)3NF和2NF有点儿类似,2NF要求不能依赖于主键的一部分,而3NF要求不能依赖于除主键以外的列。
(2)之所以是要符合第三范式,是为了避免太多重复的内容,例如对于导师ID为12的,该表里面就有两条重复的,以后如果ID为12的导师更换办公地址,那么就需要对表中ID为12的导师办公地点全部进行更新,虽然数据量少的时候update一下花不了多长时间,可是万一有好多好多条,更新起来,估计死的心都有了。
BCNF、第四范式、第五范式,实在不想说了,真的感觉没什么用,当然如果为了防止被某些学术权威唬住,倒是可以学习学习。
最后祝愿大家在三大范式的指导下,建的一手好表。
数据库范式到底是怎么个回事
标签:
数据库三大范式是什么
数据库三大范式是:
第一范式(1NF):属性不可分割,即每个属性都是不可分割的原子项。(实体的属性即表中的列)
第二范式(2NF):满足第一范式;且不存在部分依赖,即非主属性必须完全依赖于主属性。(主属性即主键;完全依赖是针对于联合主键的情况,非主键列不能只依赖于主键的一部分)
第三范式(3NF):满足第二范式;且不存在传递依赖,即非主属性不能与非主属性之间有依赖关系,非主属性必须直接依赖于主属性,不能间接依赖主属性。(A -> B,B ->C,A -> C)
数据库管理系统是数据库系统的核心组成部分,主要完成对数据库的操作与管理功能,实现数据库对象的创建、数据库存储数据的查询、添加、修改与删除操作和数据库的用户管理、权限管理等。它的安全直接关系到整个数据库系统的安全,其防护手段主要有:
(1)使用正版数据库管理系统并及时安装相关补丁。
(2)做好用户账户管理,禁用默认超级管理员账户或者为超级管理员账户设置复杂密码;为应用程序分别分配专用账户进行访问;设置用户登录时间及登录失败次数, 防止暴力破解用户密码。
(3)分配用户访问权限时,坚持最小权限分配原则,并用户只能访问特定数据库,不能同时访问其他数据库。
(4)修改数据库默认访问端口,使用防火墙屏蔽掉对 外开放的其他端口,禁止一切外部的端口探测行为。
(5)对数据库内存储的重要数据、敏感数据进行加密存储,防止数据库备份或数据文件被盗而造成数据泄露。
(6)设置好数据库的备份策略,保证数据库被破坏后能迅速恢复。
(7)对数据库内的系统存储过程进行合理管理,禁用掉不必要的存储过程,防止利用存储过程进行数据库探测与攻击。
(8)启用数据库审核功能,对数据库进行全面的事件跟踪和日志记录。