2014-10-11 37 views
1

我正在介绍数据库管理课程,并且我们正在学习规范化数据(1NF,2NF,3NF等),而且我对如何真正去做和做到了超级困惑。我已阅读了这个,咨询了各种网站和youtube视频,我仍然无法找到它点击。如果有任何帮助,我正在使用Microsoft Access 2013。如何正常化数据库中的数据?

https://i.imgur.com/vZ3QNjr.jpg

这是我的工作数据。

谢谢。

编辑1:好的,我想我已经正确设置了表格。但是现在我无法真正输入数据从一个表格移动到另一个表格。这是我的关系表。

enter image description here

+0

你能否具体解释一下标准化的哪些方面没有点击?例如,我可以解释在您发布的示例中,如何依赖其他列的列不属于该表。但是,你在问什么? – 2014-10-11 04:51:52

+0

看看这个... http://www.studytonight.com/dbms/database-normalization.php – 2014-10-11 04:52:43

+0

这里有一个很好的规范化描述:http://stackoverflow.com/questions/246701 – VoiceOfSoftware 2014-10-11 04:53:17

回答

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 
+0

好吧很酷,这很有道理。我没想过要为手术制作一张单独的桌子。不过,你是在哪里做的?因为我必须使用工作人员不患病和不患病,那么如何应用而不是基本的1,2,3?我需要使用S1011,P100等。这有意义吗? – Onikouzou 2014-10-11 05:19:24

+0

是的,如果你想要的话,你可以使用员工和病人号码作为你的主键,然后用这些号码来形成你的关系。这是http://en.wikipedia.org/wiki/Natural_key。然而,在现实世界中,我们倾向于使用http://en.wikipedia.org/wiki/Surrogate_key,就像我上面所做的那样。请阅读这些文章,了解每个文章的优缺点。 – 2014-10-11 06:17:03

+0

非常感谢您的帮助! – Onikouzou 2014-10-11 14:51:00

1

的第一步是数据建模和非规范化是了解你的数据。研究它,了解模型中存在的域“对象”或表。这会给你一个如何开始的想法。有时,单个表或查询样本不足以完全理解数据库,但在您的情况下,我们可以使用样本数据并做出一些假设。

其次,寻找重复/冗余数据。如果你看到名字的副本,那么很可能是一个外键的候选人。我们的假设告诉我们,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 

总之,要删除冗余。

这只是一个示例,也是一种方法。像这样的手动规范化在建模工具时并不常见,但重点是,我们可以查看数据,找出冗余并将这些冗余分解到新表中,并通过外键和连接将这些新表关联起来,然后将视图构建到代表原始数据。