概念數(shù)據(jù)模型到邏輯數(shù)據(jù)模型的轉(zhuǎn)化
? ?? 本篇文章所介紹的主要是針對(duì)關(guān)系數(shù)據(jù)庫(kù)中概念數(shù)據(jù)模型和邏輯數(shù)據(jù)模型之間的轉(zhuǎn)換。
一、碼
首先,說明一下數(shù)據(jù)庫(kù)中經(jīng)常用到的用于標(biāo)示一條記錄(元組)的的碼的概念,碼又分為超碼、候選碼、主碼。
超碼:在一個(gè)關(guān)系中,可以用來唯一標(biāo)識(shí)一個(gè)元組的屬性的集合稱之為超碼。
候選碼:在一個(gè)關(guān)系中,能夠用來唯一標(biāo)識(shí)一個(gè)元組的最少屬性集合稱之為候選碼。
主碼:在一個(gè)關(guān)系中,如果用來唯一標(biāo)識(shí)一個(gè)元組的候選碼中只有一個(gè)屬性,則這個(gè)屬性稱之為主碼。
三者之間的關(guān)系如下:超碼是候選碼的超集,候選碼是主碼的超集。下面以一個(gè)講解清楚。假設(shè)一個(gè)關(guān)于學(xué)生信息的表格student,其中的屬性有,stu_id(學(xué)號(hào)),name(姓名),age(年齡),address(地址)。那么超碼可以由所有的屬性組成的集合構(gòu)成,例如(stu_id,name,age,adress)、(stu_id,name)、(stu_id,age)等都可以叫做student的超碼;候選碼為(stu_id);因?yàn)楹蜻x碼只是由其中的一個(gè)屬性組成,因此這個(gè)候選碼又可以稱之為主碼。
二、概念數(shù)據(jù)模型到邏輯數(shù)據(jù)模型的轉(zhuǎn)化(以關(guān)系數(shù)據(jù)模型為例)
前面博文討論過,概念數(shù)據(jù)模型是用E-R圖表示的,其中的三要素是實(shí)體、屬性、聯(lián)系。將概念數(shù)據(jù)模型轉(zhuǎn)化為邏輯數(shù)據(jù)模型的步驟其實(shí)就是將E-R圖中的各個(gè)部分轉(zhuǎn)化為邏輯數(shù)據(jù)模型中使用的具體數(shù)據(jù)模型的各個(gè)部分。如果沒有特別的交代,下面所說的邏輯數(shù)據(jù)模型指代的是關(guān)系數(shù)據(jù)模型。將概念數(shù)據(jù)模型轉(zhuǎn)化為邏輯數(shù)據(jù)模型的大體規(guī)則如下:概念數(shù)據(jù)模型中的實(shí)體轉(zhuǎn)化為邏輯數(shù)據(jù)模型中的關(guān)系,對(duì)應(yīng)的實(shí)體的屬性轉(zhuǎn)化為關(guān)系數(shù)據(jù)模型關(guān)系的屬性(也就是列);根據(jù)實(shí)體之間聯(lián)系的不同具有不同的處置策略。
實(shí)體之間的聯(lián)系分為1:1、1:n、和m:n。下面分別對(duì)這三種聯(lián)系轉(zhuǎn)化為關(guān)系的步驟做討論。
1:1:這種關(guān)系是最好理解,同時(shí)也是最容易處理的關(guān)系。實(shí)體之間存在著一一對(duì)應(yīng)的關(guān)系。在這種聯(lián)系中,可以創(chuàng)建新的關(guān)系描述這種聯(lián)系,這事將兩個(gè)實(shí)體的主碼作為新的關(guān)系的候選碼;當(dāng)然也可以不必創(chuàng)建新的關(guān)系,將一方關(guān)系的主碼作為另一方關(guān)系的外鍵。例如兩個(gè)關(guān)系A(chǔ)和B存在1:1聯(lián)系,那么可以將A的主碼作為B的外鍵,同時(shí)將B的主碼作為A的外鍵,具體情況依據(jù)于具體的環(huán)境。以所做的紅包的小練習(xí)為例,注冊(cè)用戶和賬戶之間存在著1:1的聯(lián)系,用戶管理者賬戶。E-R圖如下:

圖 1 用戶與賬戶的E-R圖
用戶與賬戶之間存在一一對(duì)應(yīng)關(guān)系,但是創(chuàng)建賬戶的時(shí)候需要用戶已經(jīng)存在,因此這種情況下需要將用戶的"uid"作為賬戶的外鍵,那么對(duì)應(yīng)的關(guān)系如下:

圖 2 用戶和賬戶的關(guān)系
因?yàn)椋谶@個(gè)例子中額外的創(chuàng)建關(guān)系會(huì)導(dǎo)致不必要的額外存儲(chǔ)空間的增加,因此不再重新創(chuàng)建額外的關(guān)系。
1:n:一個(gè)實(shí)體可以對(duì)應(yīng)額外的多個(gè)實(shí)體。這種聯(lián)系中可以不必創(chuàng)建額外的關(guān)系表示二者之間的1:n的聯(lián)系,此時(shí)只需要將“1”方的關(guān)系的主碼放入到“n”方的關(guān)系的屬性中作為其外鍵即可,同時(shí)將聯(lián)系的屬性加入到“n”方的關(guān)系中;當(dāng)然也可以創(chuàng)建額外的關(guān)系表示二者之間的聯(lián)系,那么“1”和“n”方的關(guān)系的主碼作為候選碼,同時(shí)將聯(lián)系的屬性加入到新建立的關(guān)系中。但是,這種情況下額外的創(chuàng)建新的關(guān)系顯得冗余。還是以所練習(xí)的紅包項(xiàng)目為例,一個(gè)大的紅包根據(jù)指定的數(shù)值可以派生出很多的小紅包。這兩個(gè)實(shí)體分別對(duì)應(yīng)著一個(gè)關(guān)系,其E-R圖如下:

圖 3 小紅包的大紅包的E-R圖
由圖3得知,小紅包必須依賴大紅包存在,因此在小紅包中將大紅包的bid作為小紅包的外鍵即可,這樣就不必建立額外的關(guān)系了。對(duì)應(yīng)的關(guān)系如下:

圖 4 大紅包和小紅包對(duì)應(yīng)的關(guān)系
m:n:對(duì)于這種多對(duì)多的聯(lián)系,必須建立新的關(guān)系以描述這種聯(lián)系。“聯(lián)系”對(duì)應(yīng)的關(guān)系的屬性中至少包含他說關(guān)聯(lián)的雙方實(shí)體的“主鍵”,若聯(lián)系也有自身的屬性,那么該屬性一樣納入新建立的關(guān)系的屬性中。由于紅包項(xiàng)目中沒有遇到類似的聯(lián)系,因此以最經(jīng)典的學(xué)生選課系統(tǒng)為例。很明顯學(xué)生選課系統(tǒng)中的實(shí)體對(duì)應(yīng)有學(xué)生和課程,一個(gè)學(xué)生可以選修多門課程,一門可能可被多個(gè)學(xué)生選修,因此兩個(gè)實(shí)體之間是一種多對(duì)多的關(guān)系,對(duì)應(yīng)的E-R圖如下:

圖 5 學(xué)生與課程多對(duì)多關(guān)系圖?

圖 6 學(xué)生與課程對(duì)應(yīng)關(guān)系
在上例中,學(xué)生與課程之間存在著多對(duì)多的聯(lián)系,因此建立起新的選課關(guān)系來描述這種聯(lián)系。在新的關(guān)系中將學(xué)生的主碼和課程的主碼作為選課的候選碼,學(xué)生的主碼和選課的主碼的組合會(huì)出現(xiàn)在對(duì)應(yīng)的選課關(guān)系中。如果此時(shí)要查詢一個(gè)學(xué)生的成績(jī),需要使用聯(lián)合查詢的方式。
《數(shù)據(jù)科學(xué)與人工智能》公眾號(hào)推薦朋友們學(xué)習(xí)和使用Python語言,需要加入Python語言群的,請(qǐng)掃碼加我個(gè)人微信,備注【姓名-Python群】,我誠(chéng)邀你入群,大家學(xué)習(xí)和分享。
? ? 關(guān)于Python語言,有任何問題或者想法,請(qǐng)留言或者加群討論。
