发布网友 发布时间:2022-04-29 23:17
共5个回答
懂视网 时间:2022-04-08 14:28
TABLE "SAMPLE" ( "PRJNUM" INTEGER NOT NULL, "PRJNAME" VARCHAR(200), "EMYNUM" INTEGER NOT NULL, "EMYNAME" VARCHAR(200), "SALCATEGORY" CHAR(1), "SALPACKAGE" INTEGER) IN "USERSPACE1"; ALTER TABLE "SAMPLE" ADD PRIMARY KEY ("PRJNUM", "EMYNUM"); Insert into SAMPLE(PRJNUM, PRJNAME, EMYNUM, EMYNAME, SALCATEGORY, SALPACKAGE) values(100001, ‘TPMS‘, 200001, ‘Johnson‘, ‘A‘, 2000), (100001, ‘TPMS‘, 200002, ‘Christine‘, ‘B‘, 3000), (100001, ‘TPMS‘, 200003, ‘Kevin‘, ‘C‘, 4000), (100002, ‘TCT‘, 200001, ‘Johnson‘, ‘A‘, 2000), (100002, ‘TCT‘, 200004, ‘Apple‘, ‘B‘, 3000);考察表1-1,我们可以看到,这张表一共有六个字段,分析每个字段都有重复的值出现,也就是说,存在数据冗余问题。这将潜在地造成数据操作(比如删除、更新等操作)时的异常情况,因此,需要进行规范化。
参照范式的定义,考察上表,我们发现,这张表已经满足了第一范式的要求。
1、因为这张表中字段都是单一属性的,不可再分;
2、而且每一行的记录都是没有重复的;
3、存在主属性,而且所有的属性都是依赖于主属性;
4、所有的主属性都已经定义
事实上在当前所有的关系数据库管理系统(DBMS)中,都已经在建表的时候强制满足第一范式。因此,这张SAMPLE表已经是一张满足第一范式要求的表。考察表1-1,我们首先要找出主键。可以看到,属性对<Project Number, Employee Number>是主键,其他所有的属性都依赖于该主键。
根据第二范式的定义,转化为二范式就是消除部分依赖。
考察表1-1,我们可以发现,非主属性<Project Name>部分依赖于主键中的<Project Number>; 非主属性<Employee Name>,<Salary Category>和<Salary package>都部分依赖于主键中的<Employee Number>;
表1-1的形式,存在着以下潜在问题:
1. 数据冗余:每一个字段都有值重复;
2. 更新异常:比如<Project Name>字段的值,比如对值"TPMS"了修改,那么就要一次更新该字段的多个值;
3. 插入异常:如果新建了一个Project,名字为TPT, 但是还没有Employee加入,那么<Employee Number>将会空缺,而该字段是主键的一部分,因此将无法插入记录;
Insert into SAMPLE(PRJNUM, PRJNAME, EMYNUM, EMYNAME, SALCATEGORY, SALPACKAGE) values(100003, ‘TPT‘, NULL, NULL, NULL, NULL)
4. 删除异常:如果一个员工 200003, Kevin 离职了,要将该员工的记录从表中删除,而此时相关的Salary信息 C 也将丢失, 因为再没有别的行纪录下 Salary C的信息。
Delete from sample where EMYNUM = 200003
Select distinct SALCATEGORY, SALPACKAGE from SAMPLE
因此,我们需要将存在部分依赖关系的主属性和非主属性从满足第一范式的表中分离出来,形成一张新的表,而新表和旧表之间是一对多的关系。由此,我们得到:
CREATE TABLE "PROJECT" ( "PRJNUM" INTEGER NOT NULL, "PRJNAME" VARCHAR(200)) IN "USERSPACE1"; ALTER TABLE "PROJECT" ADD PRIMARY KEY ("PRJNUM"); Insert into PROJECT(PRJNUM, PRJNAME) values(100001, ‘TPMS‘), (100002, ‘TCT‘);
CREATE TABLE "EMPLOYEE" ( "EMYNUM" INTEGER NOT NULL, "EMYNAME" VARCHAR(200), "SALCATEGORY" CHAR(1), "SALPACKAGE" INTEGER) IN "USERSPACE1"; ALTER TABLE "EMPLOYEE" ADD PRIMARY KEY ("EMYNUM"); Insert into EMPLOYEE(EMYNUM, EMYNAME, SALCATEGORY, SALPACKAGE) values(200001, ‘Johnson‘, ‘A‘, 2000), (200002, ‘Christine‘, ‘B‘, 3000), (200003, ‘Kevin‘, ‘C‘, 4000), (200004, ‘Apple‘, ‘B‘, 3000); Employee Number Employee Name Salary Category Salary Package 200001 Johnson A 2000 200002 Christine B 3000 200003 Kevin C 4000 200004 Apple B 3000 CREATE TABLE "PRJ_EMY" ( "PRJNUM" INTEGER NOT NULL, "EMYNUM" INTEGER NOT NULL) IN "USERSPACE1"; ALTER TABLE "PRJ_EMY" ADD PRIMARY KEY ("PRJNUM", "EMYNUM"); Insert into PRJ_EMY(PRJNUM, EMYNUM) values(100001, 200001), (100001, 200002), (100001, 200003), (100002, 200001), (100002, 200004);
同时,我们把表1-1的主键,也就是表1-2和表1-3的各自的主键提取出来,单独形成一张表,来表明表1-2和表1-3之间的关联关系:
这时候我们仔细观察一下表1-2, 1-3, 1-4, 我们发现插入异常已经不存在了,当我们引入一个新的项目 TPT 的时候,我们只需要向表1-2 中插入一条数据就可以了, 当有新人加入项目 TPT 的时候,我们需要向表1-3, 1-4 中各插入一条数据就可以了。虽然我们解决了一个大问题,但是仔细观察我们还是发现有问题存在。
考察表前面生成的三张表,我们发现,表1-3存在传递依赖关系,即:关键字段< Employee Number > --> 非关键字段< Salary Category > -->非关键字段< Salary Package >。而这是不满足三范式的规则的,存在以下的不足:
1、 数据冗余:<Salary Category>和<Salary Package>的值有重复;
2、 更新异常:有重复的冗余信息,修改时需要同时修改多条记录,否则会出现数据不一致的情况;
3、 删除异常:同样的,如果员工 200003 Kevin 离开了公司,会直接导致 Salary C 的信息的丢失。
Delete from EMPLOYEE where EMYNUM = 200003
Select distinct SALCATEGORY, SALPACKAGE from EMPLOYEE
因此,我们需要继续进行规范化的过程,把表1-3拆开,我们得到:
和
这时候如果 200003 Kevin 离开公司,我们只需要从表 1-5 中删除他就可以了, 存在于表1-6中的Salary C信息并不会丢失。但是我们要注意到除了表 1-5 中存在 Kevin 的信息之外, 表1-4中也存在 Kevin 的信息, 这很容易理解, 因为 Kevin 参与了项目 100001, TPMS, 所以当然也要从中删除。
至此,我们将表1-1经过规范化步骤,得到四张表,满足了三范式的约束要求,数据冗余、更新异常、插入异常和删除异常。
在三范式之上,还存在着更为严格约束的BC范式和四范式,但是这两种形式在商业应用中很少用到,在绝大多数情况下,三范式已经满足了数据库表规范化的要求,有效地解决了数据冗余和维护操作的异常问题。
在本文描述的过程中,我们通过结合实例的方法,通俗地演绎了数据表规范化的过程,并展示了在此过程中数据冗余、数据库操作异常等问题是如何得到解决的。
在具体的工程应用中,运用数据库规范化的方法来设计数据库表,将是具有现实意义的。
转自:http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0605jiangt/
规范化-数据库设计原则
标签:
热心网友 时间:2022-04-08 11:36
数据库设计的三范式所谓范式,是关系型数据库关系模式规范化的标准,从规范化的宽松到严格,分别为不同的范式,通常使用的有第一范式、第二范式、第三范式及BC范式等。范式是建立在函数依赖基础上的。热心网友 时间:2022-04-08 12:54
设计数据库不应该有这些: 1数据冗余 2不一致性 3插入异常 4删除异常 这图就出现了问题 如人工智能的学分不一致 有两个文化学 这就出现了以上的问题 所以要杜绝 我们可以这样分为两个表 如下:右边的表只要把人工智能的删除一个就好了(画错了 不好意思) 在就是函数的一些关系 如函数依赖 : v函数依赖 设R(U)是一个属性集U上的关系,X和Y是U的子集。如果属性集合X中每个属性的值构成的集合唯一地决定了属性集合Y中每个属性的值构成的集合,则属性集合Y函数依赖于属性集合X,计为:X→Y 如下表所示,知道了“课程名”的值,即可知道“授课学时”的值。称“授课学时”函数依赖于“课程名”,或“课程名”可以决定“授课学时”,记作课程名→授课学时。 还有这个 v部分函数依赖:如果非主属性B函数依赖于构成某个候选关键字的一组主属性A的某一个真子集,则称B部分函数依赖于A。 v如“学分”函数依赖于主关键字{学号、课程}。但决定“学分”的只是“课程”,与“学号”无关,则称“学分”部分函数依赖于{学号、课程} 。 传递关系 : v传递函数依赖的关系:在R (U)中,如存在X,Y,Z包含于U ,且满足:X—>Y ,Y—>Z,则称Z传递函数依赖于X。 v学生住宿的楼号依赖于学号,学生应交的住宿费是由楼号决定的,即“收费”依赖于“楼号”,“楼号”依赖于“学号”,则“收费”传递函数依赖于“学号”。 接下来的就是要符合范式:第一范式: 任何符合关系定义的表即满足第一范式。 IDNameSexAgeMaleFemale101张三Y 20102李四 Y21v第二范式 �0�5定义:如果一个关系不存在部分依赖关系,那么该关系就属于第二范式。 �0�5 凡是以单个属性作为主关键字的关系自动就是第二范式。因为主关键字只有一个,不会存在部分依赖的情况。因此,第二范式只是针对主关键字是组合属性的关系。 第三范式 v定义:一个关系如果是第二范式的,并且没有传递依赖关系,则该关系就是第三范式。 v每个非主属性不部分依赖于关键字,也不传递依赖于关键字的关系。 关系规范化的目的:解决关系模式中存在的插入、删除异常,以及数据冗余问题, 基本思想:围绕函数依赖的主线,对一个关系模式进行分解,使关系从较低级范式变换到较高级范式。 以上也就是设计数据库基本注意的问题 我也是初学者 只能帮忙这些不知道是否对你有用!热心网友 时间:2022-04-08 14:29
如果完全按照3个范式,不但对数据库服务器是一个考验,对统计数据也是一种考验哈当你的数据是千万级的时候就会知道其实是个噩梦热心网友 时间:2022-04-08 16:20
这个很抽象!