问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

设计了sample表,下表存在什么问题,如何修改来解决存在的问题,满足数据库规范

发布网友 发布时间:2022-04-09 11:36

我来回答

2个回答

热心网友 时间:2022-04-09 13:05

规范化实例

为了说明方便,我们在本文中将使用一个SAMPLE数据表,来一步一步分析规范化的过程。

首先,我们先来生成一个的最初始的表。

CREATE 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-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');

表1-2

表 1-3

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 NumberEmployee NameSalary CategorySalary Package
200001JohnsonA2000
200002ChristineB3000
200003KevinC4000
200004AppleB3000

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-4

这时候我们仔细观察一下表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拆开,我们得到:

表 1-5



表 1-6

这时候如果 200003 Kevin 离开公司,我们只需要从表 1-5 中删除他就可以了, 存在于表1-6中的Salary
C信息并不会丢失。但是我们要注意到除了表 1-5 中存在 Kevin 的信息之外, 表1-4中也存在 Kevin 的信息, 这很容易理解, 因为 Kevin
参与了项目 100001, TPMS, 所以当然也要从中删除。

至此,我们将表1-1经过规范化步骤,得到四张表,满足了三范式的约束要求,数据冗余、更新异常、插入异常和删除异常。

在三范式之上,还存在着更为严格约束的BC范式和四范式,但是这两种形式在商业应用中很少用到,在绝大多数情况下,三范式已经满足了数据库表规范化的要求,有效地解决了数据冗余和维护操作的异常问题。

回页首

结束语

在本文描述的过程中,我们通过结合实例的方法,通俗地演绎了数据表规范化的过程,并展示了在此过程中数据冗余、数据库操作异常等问题是如何得到解决的。

在具体的工程应用中,运用数据库规范化的方法来设计数据库表,将是具有现实意义的。

热心网友 时间:2022-04-09 14:23

where is your table
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
ef英语哪个好 EF英孚英语培训怎么样? 英孚英语好不好 EF英孚教育到底好不好 大佬们,麦芒7和荣耀10那个值得入手?2500以下的机子还有啥好推荐的么... 介绍几款2500元以前的手机 像素一定要高 其他的不做要求 近期想入手一部安卓手机,价格2200到2500左右…买HTC desire Z还是 三星... 笔记本忘记开机密码怎么办急死了 笔记本电脑屏幕开机锁忘记密码 怎么办?急死了 华硕笔记本电脑开机密码忘记了怎样找回?系统是Windows 7旗舰版... 哪位大哥帮着编英语作文啊 长垣 春游去哪玩作文300字? 关于到苗圃生态园春游的作文400字 您好!请问个体工商营业执照两年没有年审,现在去注销,需要罚款吗 有幼师证可以考编制吗? 我们公司因需要注销营业执照而未年检怎么办? 没有幼师证能考幼师编制吗? 幼师可以考哪些编制?其他事业单位的可以么? 营业执照今年未年检想要注销怎么办 学的是幼儿教师,但是想先考了幼师资格证然后再往小学考考可以吗(? 个体户营业执照已经3年没有审了,现在还能注销吗? 我老婆是幼师有编制 但我觉得她不太适合这个工种 请问幼师还能考其他 营业执照没有年审工商局没有通知把执照注销可以吗 安装windows10在mac上突然开机就不见了win10系统怎么找回来? 我学的是幼师。可是什么都不懂,要考什么证,不用考什么证!怎莫考或者以后什么考编制,教师资格证都不懂 Mac装win10过程中,在win10四个方块出来界面关机了,现在开不机怎么办? 请问考到幼师编制可以再考小学编制吗? mac安装win10启动不了怎么办 有人在微信群黑我,请问要怎么澄清? 江阴微马队微信群号是多少 sat写作怎么分析? 模板问题 高手进 戴尔笔记本电脑充不进电是哪里有问题? 戴尔笔记本电脑不能充电 DELL笔记本电脑,充满电后电池老是自动禁用电池充电。 小班语言《我认识的交通标志》语言 如何教幼儿园小朋友认识交通标志? 小班社会《认识交通标志》 互联网的核心协议是什么 小班《拿低一点》安全教育活动记录 在Internet使用的协议中,()是最核心的两个协议 我在创建数据库的时候,字段 上课时间 一般为什么格式的数据 创建数据库时有出身日期字段,其数据类型是什么??插入信息的格式是怎样的?? SQL数据库 制作表格时候时间数据类型是什么 急在线等 sqlserver 建数据库时表示时间,金额和重量的字段用什么数据类型好,有人说全用nvarchar因为好操作,求解 第一节 什么是Internet和协议 数据库sql表创建时日期时间类型可以设默认值为男吗? 数据库里开始时间用的是char(19)&nbsp;,在生成实体类的时候应该用什么类型 VIP被自动续费的现象是否普遍,收费金额可以追回吗? 中诺电话录音怎样播放