轉(zhuǎn)帖|使用教程|編輯:鮑佳佳|2020-08-06 09:50:39.600|閱讀 308 次
概述:通常DB架構(gòu)師通常必須設(shè)計一個針對特定解決方案的關(guān)系數(shù)據(jù)庫,為了設(shè)計數(shù)據(jù)庫模式,7種規(guī)范形式以及規(guī)范化和非規(guī)范化的概念我們必須了解,它們是所有設(shè)計規(guī)則的基礎(chǔ)。本文針對這七中規(guī)范做了一一的解釋說明。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
dbForge Studio For MySQL是一個在Windows平臺被廣泛使用的MySQL客戶端,它能夠使MySQL開發(fā)人員和管理人員在一個方便的環(huán)境中與他人一起完成創(chuàng)建和執(zhí)行查詢,開發(fā)和調(diào)試MySQL程序,自動化管理MySQL數(shù)據(jù)庫對象等工作。
點擊下載dbForge Studio For MySQL最新試用版
數(shù)據(jù)庫設(shè)計基礎(chǔ)
為了設(shè)計數(shù)據(jù)庫模式,讓我們回顧7種規(guī)范形式以及規(guī)范化和非規(guī)范化的概念。它們是所有設(shè)計規(guī)則的基礎(chǔ)。
讓我詳細(xì)說明7種正常形式:
1.1強制性關(guān)系:
一個例子是擁有護(hù)照的公民(每個公民必須擁有護(hù)照,護(hù)照是每個公民的護(hù)照)。
此關(guān)系以兩種方式實現(xiàn):
1.1.1在一個實體(表)中:
圖1。“公民”實體
在這里,公民表代表公民實體,并且PassportData屬性(字段)包含公民的所有護(hù)照數(shù)據(jù),并且不能為空(NOT NULL)
1.1.2。在兩個不同的實體(表)中:
圖2。公民和PassportData實體之間的關(guān)系
“公民”表代表公民實體,“護(hù)照數(shù)據(jù)”表代表公民護(hù)照數(shù)據(jù)的實體。公民實體包含PassportID屬性(字段),該屬性引用PassportData表的主鍵。護(hù)照數(shù)據(jù)實體具有CitizenID屬性(字段),該屬性引用Citizen表的CitizenID主鍵。
確保CitizenID字段和PassportData表的完整性,以提供一對一的關(guān)系也很重要。也就是說,Citizen表中的PassportID字段和PassportData表中的CitizenID字段必須引用相同的記錄,就好像它是第1.1.1段中說明的一個實體(表)一樣。
1.2可選關(guān)系:
這里的一個示例是可以擁有護(hù)照數(shù)據(jù)并且可能沒有指定國家/地區(qū)的人。因此,在第一種情況下,他是給定國家的公民,而在第二種情況下,他不是。
此關(guān)系以兩種方式實現(xiàn):
1.2.1在一個實體(表)中:
圖3。人員實體
在此,“人”表代表人實體,“ PassportData”屬性(字段)包含一個人的所有護(hù)照數(shù)據(jù),并且可以為空(NULL)
1.2.2在兩個實體(表)中:
圖4。Person和PassportData之間的關(guān)系
在此,“人”表代表人實體,“護(hù)照數(shù)據(jù)”表代表人的護(hù)照數(shù)據(jù)實體(即護(hù)照本身)。人員實體包含PassportID屬性(字段),該屬性引用PassportData表的主鍵。而護(hù)照數(shù)據(jù)實體在“個人”表中具有“個人ID”屬性(字段)。人員表的PassportID字段可以為空(NULL)。
保證PersonID字段和PassportData表的完整性,以提供一對一的關(guān)系也很重要。也就是說,Person表的PassportID字段和PassportData表的PersonID字段必須引用相同的記錄,就好像它是第1.2.1節(jié)中所示的一個實體(表)一樣,或者這些字段必須未指定,即,包含NULL。
2.1強制性關(guān)系:
這方面的一個例子可以是父母及其子女。每個父母都有至少一個孩子。
您可以通過兩種方式實現(xiàn)這種關(guān)系:
2.1.1在一個實體(表)中:
圖5。上級實體
這里,Parent表代表父實體,而ChildList屬性(字段)包含有關(guān)子項(即子項本身)的信息。該字段不能為空(NOT NULL)。ChildList字段類型通常是半結(jié)構(gòu)化數(shù)據(jù)(NoSQL),例如XML,JSON等。
2.1.2在兩個實體(表)中:
圖6。父子實體之間的關(guān)系
在此,父表代表父實體,子表代表子實體。子表的ParentID字段引用了Parent表的主ParentID鍵。子表的ParentID字段不能為空(NOT NULL)。
2.2)可選關(guān)系:
例如可能有孩子或沒有孩子的人。
此關(guān)系以兩種方式實現(xiàn):
2.2.1在一個實體(表)中:
圖7。人員實體
在這里,Parent表代表父實體,而ChildList屬性(字段)包含有關(guān)子項(即子項本身)的信息。該字段可以為空(NULL)。通常的ChildList字段類型是半結(jié)構(gòu)化數(shù)據(jù)(NoSQL),例如XML,JSON等。
2.2.2在兩個實體(表)中:
圖8。人與子實體之間的關(guān)系
在此,父表代表父實體,子表代表子實體。子表的ParentID字段引用了Parent表的主ParentID鍵。子表的ParentID字段可以為空(NULL)。
同樣,在子實體和父實體(表)具有相同的屬性集(字段)而不引用父實體的情況下,存在引用自身的第三種方法:
圖9。具有自我參照的Person實體
這里,Person實體(表)包含引用同一表Person的主PersonID鍵的ParentID屬性(字段),并且可以具有空值(NULL)。
這是具有可選性質(zhì)的多對一關(guān)系的實現(xiàn)。
該關(guān)系反映了上面所示的一對多關(guān)系。這就是子實體與父實體之間的關(guān)系,如果孩子至少有一個父輩,并且如果我們帶走所有孩子(包括孤兒院中的孩子),則這種強制關(guān)系是可能的,那么這種關(guān)系具有選擇性。
通過添加引用相應(yīng)實體主鍵的必要屬性,也可以通過兩個以上的實體來實現(xiàn)一對多和一對多關(guān)系。此實現(xiàn)類似于上面的1.1.2和1.2.2段中的示例。
在這種情況下,一個示例可能是一個人或幾個人擁有的房地產(chǎn)。同時,一個人可以擁有幾所房屋或擁有許多房屋的所有權(quán)份額。
您可以按照上面針對先前關(guān)系描述的方式,使用NoSQL來實現(xiàn)此關(guān)系。但是,在關(guān)系模型中,通常通過3個實體(表)實現(xiàn)此關(guān)系:
圖10。人與房地產(chǎn)實體之間的關(guān)系
在此,Person和RealEstate表分別代表一個人的實體和不動產(chǎn)。這些實體(表)通過PersonRealEstate實體(表)通過PersonID和RealEstateID屬性(字段)相關(guān)聯(lián),這些屬性分別引用Person表的主鍵PersonID和RealEstate表的RealEstateID。請注意,該對(PersonID; RealEstateID)在PersonRealEstate表中始終是唯一的,因此它可以成為PersonRealEstate鏈接實體(表)的主鍵。
通過添加引用相應(yīng)實體主鍵的必要屬性,可以通過3個以上的實體來實現(xiàn)此關(guān)系。這樣的實現(xiàn)類似于第1.1.2和1.2.2段中描述的示例。
那么您可能想知道這7個范式在哪里?
好吧,這里是:
只是在上面的文本中,這7個范式被分為4個功能塊。
標(biāo)準(zhǔn)化消除了數(shù)據(jù)冗余,因此降低了數(shù)據(jù)異常的風(fēng)險。但是,分解實體(表)時的規(guī)范化將導(dǎo)致更復(fù)雜的查詢構(gòu)建以進(jìn)行數(shù)據(jù)操作(插入,更新,選擇和刪除)。
相反的過程是非規(guī)范化。它通過添加冗余數(shù)據(jù)(例如,如上文在2.1.1和2.2.1中提到的借助于半結(jié)構(gòu)化數(shù)據(jù)(NoSQL))簡化了數(shù)據(jù)訪問的查詢處理。
您確定要使用7種范式嗎?您確實掌握了它,而不僅僅是熟悉它。問問自己,是否會在幾個小時內(nèi)為任何數(shù)據(jù)域或任何信息系統(tǒng)設(shè)計一個數(shù)據(jù)庫模型(即使實體過多)。您可以稍后通過詢問分析人員和客戶代表來完善復(fù)雜性和細(xì)節(jié)。
如果這個問題使您措手不及,并且您認(rèn)為完成此任務(wù)的可能性很小,那么您知道這7種正常形式,但不了解它們。
消息來源中并沒有以某種方式表明,實體之間的這些關(guān)系不僅是被建立而且是被發(fā)現(xiàn)的。也就是說,從一開始,它們實際上就存在于真實世界中,介于主體和客體之間。
除此之外,這些關(guān)系可以改變,從一對一轉(zhuǎn)變?yōu)橐粚Χ啵蜣D(zhuǎn)變?yōu)槎鄬σ唬蜣D(zhuǎn)變?yōu)槎鄬Χ啵瑥亩淖兤鋸娭菩曰虮?留其強制性。
我認(rèn)為您應(yīng)該嘗試觀察人們并檢測主體之間以及主體與客體之間的現(xiàn)有關(guān)系(上面的示例將公民和護(hù)照視為具有強制性質(zhì)的一對一關(guān)系,而將人和護(hù)照視為具有強制性質(zhì)的一對一關(guān)系)。一對一關(guān)系(可選)。
深入了解7種標(biāo)準(zhǔn)形式后,您可以輕松地為任何信息系統(tǒng)設(shè)計具有任何復(fù)雜性的數(shù)據(jù)庫模型。
除此之外,您將了解可以多種方式實現(xiàn)關(guān)系,并且關(guān)系本身可以更改。因此,數(shù)據(jù)庫模型(模式)是實體在特定時間點之間關(guān)系的快照。因此,必須同時指定兩個實體(它們是真實世界或領(lǐng)域?qū)ο蟮膱D像),并考慮到將來的變化來確定它們之間的關(guān)系。
一個經(jīng)過精心設(shè)計的數(shù)據(jù)庫模型,充分考慮了現(xiàn)實中和主題領(lǐng)域中的關(guān)系更改,長期以來不需要任何更改。對于數(shù)據(jù)存儲而言,更改涉及重新保存大量數(shù)據(jù)(從幾GB到幾TB的數(shù)據(jù))特別重要。
注意:在關(guān)系數(shù)據(jù)庫模型中,它是實體之間的關(guān)系,而行(元組)是這些關(guān)系的示例。但是為了簡單起見,我們通常是按表表示實體,按行表示實體實例,并按外部鍵關(guān)系表示它們之間的關(guān)系。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自: