前言
为什么要写这篇文章呢,从去年年底开始,就和很多做技术的朋友交流过,从数据库设计到数据库架构各个方面的内容。有一些朋友执着于ORM,执着于所谓的数据库设计,却忘记了一切技术是要为业务服务这个基石。当然这文章里也有一些自己的理解,想向大家表达。
范式是什么
范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求,即满足不同的范式。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。
范式的原理
-
第一范式(1NF)无重复的列
所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。
说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
-
第二范式(2NF)属性完全依赖于主键[消除部分子函数依赖]
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。
例如员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是惟一的,因此每个员工可以被惟一区分。这个惟一属性列被称为主关键字或主键、主码。
第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是属性完全依赖于主键。
-
第三范式(3NF)属性不依赖于其它非主属性[消除传递依赖]
满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。
那么在的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。
范式的说明
- 第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;
通俗的理解是字段还可以再分吗?如过不能,则是符合1NF的设计。
- 第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
简单的解释,比如你和一个女生约会建立一张表,不用每条约会记录都记录她的身高、体重,将身高体重单独的存在一张表中供查询即可。
- 第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。
打个比方,比如评论表,如果你将用户ID,用户头像都放在这留言表中,就是不合适的了。用户头像是依赖于用户ID,而不依赖该评论。
我对范式的理解
一个严格恪守数据库设计范式来进行数据库设计的人,必定是个傻球;
一个没有研究过数据库设计范式就进行数据库设计的人,必定也是个傻球;
在现代数据库设计中,尤其是web 2.0的系统中的数据库设计,我可以断言,大多数都是违反2NF、3NF的,少数设计甚至是违反1NF的。数据库设计范式只是对数据库惯用设计的一些说明,并不能定性为标准。
而从数据库的发展来看,以MySQL举例,随着MySQL实现越来越多的功能,它的宣传材料上会越来越多的出现以前被MySQL所摒弃的复杂设计理念,并且宣称这是MySQL所独创或一贯倡导的。这是一个数据库系统发展所必然经历的过程。而这却会给MySQL的使用者以极大的误导,从而忽视了是否新特性是业务所真正需要的。
数据库设计不是一种编程语言这么简单,与面向对象、面向过程无关。数据库设计代表的是一种与应用开发语言完全不同的思想。现在绝大多数的程序,无论任何人采用什么方式进行程序开发,其最终还是会回归到对数据库的操作上(当然如果你的程序只是个教学演示则不在此范围内)。
数据库发展
各种缓存方案,说到底是以key为基础的数据解决方案,而数据库与应用层之间的中间件,为了实现逻辑的简单和高性能,更多的也会是基于key的实现。比如我所使用过的腾讯的TTC。
从下面的列表可以看出当前SNS的网站对于高并发、高性能的数据库解决方案有多么渴求,Facebook贡献了Cassandra、Linkedin贡献了Voldemort、mixi.jp贡献了Tokyo Cabinet和Tokoy Tyrant、green.jp贡献了Flare、甚至包括Google的BigTable。
总结
写到这里,我发现单单是这些新的数据库解决方案就有太多可写的内容,而这些已经超过了本文所要说明的主要内容,而现在所写的内容就全当是个引子吧,我写的很意犹未尽。后面会就反范式设计实例,内存缓存方案、NoSQL数据库等逐渐展开。
PS:这篇文章写的很杂乱,尤其是后面两端,见谅!
相关推荐
数据库范式理解例题 数据库范式是relation database设计中的一种规范,旨在确保数据库的结构正确性和数据的一致性。其中包括第一范式(1NF)、第二范式(2NF)和第三范式(3NF)等。 第一范式(1NF) 第一范式是...
数据库范式理解例题 数据库范式是关系数据库设计的基础,它定义了关系数据库的结构和约束,以确保数据的一致性和完整性。数据库范式理解例题是学习数据库范式的重要步骤,本文将对数据库范式的基本概念进行详细的...
关系数据库三个范式理解实例,举例,20个字补丁
"数据库范式理解例题" 数据库范式是数据库设计中的一种原则,它可以帮助我们设计出高效、可维护的数据库。下面我们将对数据库范式的相关知识点进行详细的讲解。 函数依赖 函数依赖是指关系中一个或一组属性的值...
### 数据库范式理解知识点详解 #### 一、基本概念 **1. 主属性与非主属性** - **主属性**:包含在任一候选关键字中的属性。 - **非主属性**:不包含在候选关键字中的属性。 **2. 函数依赖** - **定义**:关系...
大数据库范式理解例题.doc
总结来说,理解并应用数据库范式对于构建高效、稳定、易于维护的数据库系统至关重要。通过正确设计数据库模式,遵循这些范式,可以显著减少数据冗余,提高查询效率,避免插入、更新和删除操作时可能出现的问题。在...
理解这些范式有助于数据库设计者创建更高效、更稳定的关系数据库。在实际应用中,通常会根据需求和性能考虑选择达到哪个级别的范式。通常,满足BCNF已经足够解决大部分问题,但对于非常复杂的关系模型,可能需要...
这些证明不仅加深了我们对范式理解的深度,也为数据库设计提供了理论依据。然而,即便是最高级别的范式,如BCNF,也可能存在操作复杂性或数据冗余等问题,因此在实际应用中,选择合适的范式级别是数据库设计的重要...
在数据库设计领域,范式(Normal Form)是衡量数据模型是否规范化的重要标准,它有助于减少数据冗余,提高数据的一致性和完整性。...总的来说,理解和应用范式对于创建高效、稳定、易于维护的数据库至关重要。
理解并遵循这些范式,可以构建出结构清晰、高效且易于维护的数据库。然而,过度规范化也可能导致查询复杂性增加,所以在实际设计时需要找到规范化和性能之间的平衡点。通过合理地应用范式,数据库设计者可以创建出更...
斯坦福大学作为世界知名的学府,其开设的编程范式课程被认为是帮助学生深入理解编程范式的有效途径。通过对该课程资源的分析,我们可以获得一份系统性学习编程范式的路线图,进而提升自身的编程能力和软件开发的整体...
通过阅读《范式(7).doc》、《范式.doc》、《范式(5).doc》和《我对的范式的理解.txt》等文档,你可以深入理解不同范式的概念、应用以及如何在实际项目中实现这些范式。这些文档可能包含了范式的详细解释、实例分析...
理解并应用数据库范式对于构建高效、可靠的数据库系统至关重要。通过遵循这些规范,我们可以有效地避免数据冗余、更新异常等问题,从而提高数据完整性和查询性能。此外,随着技术的发展,虽然第六范式可能在实际应用...
总之,这个Python代码提供了一个实用的工具,帮助学习者理解和实现合取范式到析取范式的转换,这对于理解逻辑系统和人工智能中的知识表示至关重要。无论是学术研究还是实际应用,掌握这些基础概念和转换技巧都是非常...
5. 三个范式理解:1NF要求属性不可再分解,2NF确保记录有唯一标识,3NF避免字段冗余。在设计中,理解这三个范式可以帮助优化数据结构。 6. 多对多关系处理:多对多关系需要转换为一对多关系,通过引入第三个实体来...