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