我正在介绍数据库管理课程,并且我们正在学习规范化数据(1NF,2NF,3NF等),而且我对如何真正去做和做到了超级困惑。我已阅读了这个,咨询了各种网站和youtube视频,我仍然无法找到它点击。如果有任何帮助,我正在使用Microsoft Access 2013。如何正常化数据库中的数据?
这是我的工作数据。
谢谢。
编辑1:好的,我想我已经正确设置了表格。但是现在我无法真正输入数据从一个表格移动到另一个表格。这是我的关系表。
我正在介绍数据库管理课程,并且我们正在学习规范化数据(1NF,2NF,3NF等),而且我对如何真正去做和做到了超级困惑。我已阅读了这个,咨询了各种网站和youtube视频,我仍然无法找到它点击。如果有任何帮助,我正在使用Microsoft Access 2013。如何正常化数据库中的数据?
这是我的工作数据。
谢谢。
编辑1:好的,我想我已经正确设置了表格。但是现在我无法真正输入数据从一个表格移动到另一个表格。这是我的关系表。
在一个非常基本的水平,在一个表中的任何重复的值是用于归一化的候选者。重复的数据通常是一个坏主意。假设你需要更新患者的姓氏 - 现在你必须更新该表中的所有事件,并且可能更新数据库其余部分中的所有事件。更好地将每个患者的细节存储在一个地方。
这是正常化进入的地方。往下看柱子,你可以看到关于牙医,病人和手术的数据有重复的值,所以我们应该规范化为每个这些实体的表格,以及包含约会的原始表格,共给您四张表格。
将实体提取到自己的表中,并为每一行赋予一个主键(唯一键) - 现在只需使用递增整数。 (编辑:所建议的评论,我们可以使用PatientNo,StaffNo和SurgeryNo的自然键而不是创造代理人的),在预约表
然后,不是每个病人的名字和出现的数量多的时候,我们只需在患者表中引用主记录的关键字即可。这被称为外键。
然后,为牙医和手术做同样的事情。
你将最终看起来像这样的表:
APPOINTMENT
AppointmentID DentistID PatientID AppointmentTime SurgeryID
----------------------------------------------------------------
1 1 1 12 Aug 03 10:00 1
2 1 2 ... 2
3 2 3 ... 1
4 2 3 ... 1
5 3 2 ... 2
6 3 4 ... 3
DENTIST
DentistID Name StaffNo
--------------------------------------
1 Tony Smith S1011
2 Helen Pearson S1024
3 Robin Plevin S1032
PATIENT
PatientID Name PatientNo
---------------------------------------
1 Gillian White P100
2 Jill Bell P105
3 Ian MackKay P108
4 John Walker P110
SURGERY
SurgeryID SurgeryNo
-------------------------
1 S10
2 S15
3 S13
好吧很酷,这很有道理。我没想过要为手术制作一张单独的桌子。不过,你是在哪里做的?因为我必须使用工作人员不患病和不患病,那么如何应用而不是基本的1,2,3?我需要使用S1011,P100等。这有意义吗? – Onikouzou 2014-10-11 05:19:24
是的,如果你想要的话,你可以使用员工和病人号码作为你的主键,然后用这些号码来形成你的关系。这是http://en.wikipedia.org/wiki/Natural_key。然而,在现实世界中,我们倾向于使用http://en.wikipedia.org/wiki/Surrogate_key,就像我上面所做的那样。请阅读这些文章,了解每个文章的优缺点。 – 2014-10-11 06:17:03
非常感谢您的帮助! – Onikouzou 2014-10-11 14:51:00
的第一步是数据建模和非规范化是了解你的数据。研究它,了解模型中存在的域“对象”或表。这会给你一个如何开始的想法。有时,单个表或查询样本不足以完全理解数据库,但在您的情况下,我们可以使用样本数据并做出一些假设。
其次,寻找重复/冗余数据。如果你看到名字的副本,那么很可能是一个外键的候选人。我们的假设告诉我们,STAFF_NO是牙医主键候选者,因为每一个独特的STAFF_NO相关于一个独特的DENTIST_NAME,所以我看到一个很好的候选人DENTIST表(STAFF_NO,DENTIST_NAME)
例手术的一些表:
ID STAFF_NO DENTIST_NAME
1 1 Fred Sanford
2 1 Fred Sanford
3 3 Lamont Sanford
4 3 Lamont Sanford
为什么一遍又一遍地存储这些?当弗雷德说:“但我的正确名字是弗雷德G
桑福德”,所以你必须更新你的数据库。在当前表中,您必须更新名称很多行。如果你已经规范化了它,你可以在DENTIST
表中找到一个名称。
所以我可以采取独特的牙医,并将它们存储在牙医
create table DENTIST(staff_no integer primary key, dentist_name varchar(100));
-- One possible way to populate our dentist table is to use a distinct query from surgery
insert into DENTIST
select distinct staff_no, dentist_name from surgery;
STAFF_NO DENTIST_NAME
1 Fred Sanford
3 Lamont Sanford
手术台现在指向DENTIST表
ID STAFF_NO
1 1
2 1
3 3
4 3
而且您现在可以创建一个视图,VIEW_SURGERY加入DENTIST_NAME以满足典型查询的需求。
select s.id, d.staff_no, d.dentist_name
from surgery s join dentist d
on s.staff_no = d.staff_no -- join here
所以,现在唯一的更新牙医,牙医主键将更新一行。
update dentist set name = 'Fred G Sanford' where staff_no = 1;
添加查询视图将显示更新的名称N行:
select * from view_surgery
ID STAFF_NO DENTIST_NAME
1 1 Fred G Sanford
2 1 Fred G Sanford
3 3 Lamont Sanford
4 3 Lamont Sanford
总之,要删除冗余。
这只是一个示例,也是一种方法。像这样的手动规范化在建模工具时并不常见,但重点是,我们可以查看数据,找出冗余并将这些冗余分解到新表中,并通过外键和连接将这些新表关联起来,然后将视图构建到代表原始数据。
你能否具体解释一下标准化的哪些方面没有点击?例如,我可以解释在您发布的示例中,如何依赖其他列的列不属于该表。但是,你在问什么? – 2014-10-11 04:51:52
看看这个... http://www.studytonight.com/dbms/database-normalization.php – 2014-10-11 04:52:43
这里有一个很好的规范化描述:http://stackoverflow.com/questions/246701 – VoiceOfSoftware 2014-10-11 04:53:17