`
suiyuan17
  • 浏览: 48324 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

建表三大范式

 
阅读更多

数据库三范式实例
文章分类:数据库
第一范式:消除组中的重复,也就是说列中是否存储了其他列中的信息(字段不可再分)
第二范式:消除部分依赖列,也就是说是否有依赖于一部分主键的列 (非主键字段完全依赖主键字段)
第三范式:消除非依赖列,是否有依赖于非主键的列 (消除传递依赖)

例如:

学生信息表

学生ID,姓名,地址,城市,邮政编码,所在年级,性别,参加课程,课程级别,课程ID,名称,描述,教师ID,教

师姓名,时间表,地点,先决课程

如果这么多字段在同一个表里,那么这种设计会被认为没有正规化,这里有很多重复的信息,为了把数据库设计转化

为第一范式,需要把信息分成两个表,并在两个表之间建立关系,如下:

学生表
学生ID,姓名,地址,城市,邮政编码,所在年级,性别

学生课程表
学生ID,课程ID,名称,描述,教师ID,教师姓名,时间表,地点


通过把学生从课程中分离,我们可以消除由不同的逻辑组引入的重复,我们必须满足消除信息重复的目标。接下来,

从第一范式到第二范式,我们需要消除表中仅仅部分依赖主键的列,这些列应该被分割到不同的表中。在学生课程表

中,许多列仅仅依赖于课程ID,而不依赖于学生ID,这个表的主键是学生ID+课程ID,因此把这个表分成两个表,如下



学生课程表
学生ID,课程ID,课程级别


课程表
课程ID,名称,描述,教师ID,教师姓名,先决课程,时间表,地点

既然对主键的部分依赖已经消除,数据库就已经满足第二范式了。为了进一步把数据库转化为第三范式,需要把表中

对构成主键的列的不依赖部分分离出去,教师姓名依赖于教师ID,而不依赖于课程ID,索引,这些列应该被分离以形

成一个新表,如下:

教师表
教师ID,教师姓名

最终的课程表如下
课程ID,名称,描述,教师ID,时间表,地点




归结起来3句话:

1NF:字段不可分;
2NF:有主键,非主键字段依赖主键;
3NF:非主键字段不能相互依赖;

解释:
1NF:原子性 字段不可再分,否则就不是关系数据库;
2NF:唯一性 一个表只说明一个事物;
3NF:每列都与主键有直接关系,不存在传递依赖;

不符合第一范式的例子(关系数据库中create不出这样的表):

表:字段1, 字段2(字段2.1, 字段2.2), 字段3 ......

存在的问题: 因为设计不出这样的表, 所以没有问题;

不符合第二范式的例子:

表:学号, 姓名, 年龄, 课程名称, 成绩, 学分;

这个表明显说明了两个事务:学生信息, 课程信息;

存在问题:

数据冗余,每条记录都含有相同信息;
删除异常:删除所有学生成绩,就把课程信息全删除了;
插入异常:学生未选课,无法记录进数据库;
更新异常:调整课程学分,所有行都调整。

修正:

学生:Student(学号, 姓名, 年龄);

课程:Course(课程名称, 学分);

选课关系:SelectCourse(学号, 课程名称, 成绩)。

满足第2范式只消除了插入异常。


不符合第三范式的例子:

学号, 姓名, 年龄, 所在学院, 学院联系电话,关键字为单一关键字"学号";

存在依赖传递: (学号) → (所在学院) → (学院地点, 学院电话)

存在问题:

数据冗余:有重复值;

更新异常:有重复的冗余信息,修改时需要同时修改多条记录,否则会出现数据不一致的情况

删除异常

修正:
学生:(学号, 姓名, 年龄, 所在学院);
学院:(学院, 地点, 电话)。
分享到:
评论

相关推荐

    数据库建表原则 数据库建表原则

    在数据库设计中,为了更好地应用三个范式,就必须通俗地理解三个范式(通俗地理解是够用的理解,并不是最科学最准确的理解):第一范式是对属性的原子性约束,要求属性具有原子性,不可再分解;第二范式是对记录的...

    sql数据库建表建议

    此外,让我们来通俗地理解三个范式:第一范式、第二范式和第三范式。在数据库设计中,为了更好地应用三个范式,就必须通俗地理解三个范式。 最后,让我们来讨论一下多对多的关系。若两个实体之间存在多对多的关系,...

    SQL建表范例

    12. **范式理论**:在设计表结构时,遵循数据库范式(如第一范式、第二范式、第三范式等)可以帮助减少数据冗余和提高数据一致性。 通过学习和实践这些SQL建表的基本概念和范例,你可以更好地理解和设计数据库表...

    数据库建表原则-设计思想-查询优化

    ### 数据库建表原则详解 #### 一、原始单据与实体之间的关系 在数据库设计过程中,原始单据与实体之间的关系是理解数据结构的基础。根据业务需求的不同,这种关系可以表现为一对一、一对多或者多对多的形式。最...

    做需求的一些收集,包括建表脚本等内容

    4. 规范化设计:为了减少数据冗余和提高数据一致性,数据库设计往往遵循一定的规范化原则,如第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。在需求分析中,理解业务规则有助于判断是否需要进行规范化设计。 ...

    十次方建表语句

    在数据库管理中,建表语句(Table Creation Statement)是用于创建新的数据表结构的关键命令。在SQL(Structured Query Language)中,这...同时,良好的数据库设计还需遵循范式理论,减少数据冗余,提高数据的一致性。

    SQL建库建表.rar

    7. **数据库设计原则**:在设计数据库时,应遵循范式理论,如第一范式(1NF)、第二范式(2NF)、第三范式(3NF),甚至更高层次的BCNF(Boyce-Codd范式),以减少数据冗余和提高数据一致性。 8. **索引优化**:...

    oracle建表开发手册.docx

    本篇文章将深入探讨Oracle建表时遵循的规范,特别是关于数据库设计的三个范式,以及原子性、唯一性和字段冗余性的概念。 首先,我们来理解一下创建表的三范式: 1. **第一范式(1NF)**:原子性约束。这是所有关系...

    数据库建表原则

    3. **范式化设计**:遵循数据库范式(第一范式到第五范式),通过消除数据冗余和提高数据独立性来减少更新异常和插入异常。 4. **考虑扩展性**:设计时需考虑到未来可能的需求变化,预留扩展字段,或者使用EAV...

    关于建表应注意的事项

    1NF(第一范式)要求每个字段不可再分,2NF(第二范式)确保不存在部分依赖,3NF(第三范式)消除了传递依赖。更高级的规范化如BCNF(博科斯范式)和4NF(第四范式)进一步优化了关系模型。 2. **数据类型选择**: ...

    SQL教学课程建库建表约束等PPT课件PPT学习教案.pptx

    3. 范式理论:在设计关系型数据库时,我们遵循第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。这些范式确保数据的原子性、非依赖性和最小传递依赖,从而避免数据冗余和更新异常。 接下来,我们深入探讨SQL...

    oracle相关数据库的知识,包括建表语句,索引视图,触发器存储过程等

    #### 六、数据库设计规范——三大范式 - **第一范式**:确保表中的每个字段都是不可分割的基本数据项。 - **第二范式**:在满足第一范式的前提下,表中的每一列都必须完全依赖于主键。 - **第三范式**:在满足第二...

    建表项目总结最终的88张表导入即可

    "建表项目总结最终的88张表导入即可"这个标题暗示了一个完整的数据库结构设计已经完成,其中包括了88个不同的数据表。这可能是某个业务系统的数据模型,涵盖了各种业务场景的数据存储需求。这种类型的项目总结通常会...

    哈工大数据库课件

    还包括范式理论,如第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和BCNF(巴斯-科德范式)。 5. **数据库安全性与并发控制**:介绍权限管理、角色、访问控制和事务处理,以及并发操作可能导致的问题(如死锁...

    MySQL面试专题(带答案).pdf

    数据库三范式是关系型数据库设计的基础理论,它们分别是第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。 * 第一范式(1NF):字段具有原子性,不能再分。所有关系型数据库系统都满足第一范式,数据库表中的...

    自动创建表

    6. 数据库设计原则:如范式理论(第一范式、第二范式、第三范式等),用于优化数据冗余和提高数据一致性。 7. 数据库事务:保证数据库操作的原子性、一致性、隔离性和持久性,确保数据的完整性和一致性。 总结,...

    本人整理的十一道Mysql面试题

    数据库三范式是关系型数据库设计的基本准则,包括第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。 1. 第一范式(1NF):字段具有原子性,不能再分。所有关系型数据库系统都满足第一范式,数据库表中的字段都...

    SQLServer总结.docx

    * 第三范式(3NF):确保每列都和主键列直接相关 四、SQL语句回忆 * 添加数据:insert into 表名(字段1,字段2,…)values(值1,值2,…) * 修改数据:update 表名 set 字段1=值1,字段2=值2,…where(条件)...

Global site tag (gtag.js) - Google Analytics