我正在介紹數據庫管理課程,並且我們正在學習規範化數據(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