2014-10-11 81 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 

總之,要刪除冗餘。

這只是一個示例,也是一種方法。像這樣的手動規範化在建模工具時並不常見,但重點是,我們可以查看數據,找出冗餘並將這些冗餘分解到新表中,並通過外鍵和連接將這些新表關聯起來,然後將視圖構建到代表原始數據。