常用的约束条件有6种:主键(Primary Key)约束;外键(Foreign Key)约束;唯一性(Unique)约束;默认值(Default)约束;非空(Not NULL)约束;检查(Check)约束。
表间父表与子表关系如图1.19所示。

图1.19 父表与子表关系
1.6.1 评价数据库表设计的质量
设计数据库时,有两个不争的事实:
① 数据库中冗余的数据需要额外维护,因此质量好的一套表应该尽量“减少冗余数据”。
② 数据库中经常发生变化的数据需要额外维护,因此质量好的一套表应该尽量“避免数据经常发生变化”。
1.6.2 使用规范化减少数据冗余
冗余的数据需要额外维护,并且容易导致“数据不一致”“插入异常”以及“删除异常”等问题,如表1.3所示。
表1.3 学生表中数据冗余

规范化是通过最小化数据冗余来提升数据库设计质量的过程。规范化是基于函数依赖以及一系列范式定义的,最为常用的是第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。
函数依赖:一张表内两个字段值之间的一一对应关系称为函数依赖。
第一范式:如果一张表内同类字段不重复出现,该表就满足第一范式的要求。
第一范式,如表1.4所示。
表1.4 第一范式设计表(https://www.xing528.com)

第二范式:一张表在满足第一范式的基础上,如果每个“非关键字”字段“仅仅”函数依赖于主键,那么该表满足第二范式的要求。
第二范式,如表1.5所示。
表1.5 第二范式设计表

第三范式:如果一张表满足第二范式的要求,并且不存在“非关键字”字段函数依赖于任何其他“非关键字”字段,那么该表满足第三范式的要求。
第三范式,如表1.6所示。
表1.6 第三范式设计表

1.6.3 避免数据经常发生变化
统计学生的个人资料时,如果读者是一名数据库开发人员,应该让学生上报年龄信息,还是让学生上报出生日期?
如何确保每一门课程选报学生的人数不超过人数上限?
方案一:
course(course_no,course_no,course_name,
up_limit,description,status,teacher_no,available)
方案二:数据库表无需进行任何更改。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
