- 數(shù)據(jù)庫應用基礎教程(Visual FoxPro 9.0)
- 程東勝 廣樹建主編
- 5122字
- 2018-12-29 02:16:00
1.4 關系數(shù)據(jù)庫
1.關系數(shù)據(jù)庫概述
關系數(shù)據(jù)庫是在層次和網(wǎng)狀數(shù)據(jù)庫之后發(fā)展起來的。1970年,E.F.Codd提出了關系數(shù)據(jù)模型的概念,之后相繼發(fā)表了一系列關系模型的論文,奠定了關系數(shù)據(jù)庫的理論基礎。關系數(shù)據(jù)庫是采用關系模型作為數(shù)據(jù)的組織方式的數(shù)據(jù)庫。關系數(shù)據(jù)庫與非關系數(shù)據(jù)庫的區(qū)別在于:關系數(shù)據(jù)庫只有“表”這一種結構,而非關系數(shù)據(jù)庫還有其他數(shù)據(jù)結構。
① 關系模型(Relational Model):用二維表格結構來表示實體及實體間聯(lián)系的模型。
② 屬性(Attribute)和值域(Domain):在二維表中的列稱為屬性,列值稱為屬性值,屬性值的取值范圍稱為值域。
③ 關系模式(Relation Schema):在二維表格中,行定義(記錄的型)稱為關系模式。
⑤ 元組(Tuple)和關系:在二維表中的行(記錄的值)稱為元組,元組的集合稱為關系,關系模式通常也稱為關系。
⑥ 碼(Key)或關鍵字:在關系的屬性中,能夠用來唯一標志元組的屬性(或屬性組合)。關系中的元組由碼值唯一確定,碼不能為空。例如,學生表中的學號就是碼。
⑦ 候選碼(Candidate Key)或候選關鍵字:如果一個關系中存在著多個屬性(或屬性的組合)都能唯一標志該關系的元組,這些屬性或屬性的組合都稱為該關系的候選碼或候選關鍵字。
⑧ 主碼(Primary Key)或主關鍵字:若一個關系中存在若干候選碼,則從中指定為關鍵字的屬性(或屬性組合)稱為該關系的主碼或主關鍵字。
⑨ 非主屬性(Non Primary Attribute)或非關鍵字屬性:關系中不能組成碼的屬性均為非主屬性或非關鍵字屬性。
外鍵(Foreign Key)或外部關鍵字:當關系中的某個屬性或屬性組合雖不是該關系的關鍵字或只是關鍵字的一部分,卻是另一個關系的關鍵字時,稱該屬性或屬性組合為這個關系的外部關鍵字或外鍵。
⑩ 從表與主表:以某屬性為主鍵的表稱為主表,以此屬性為外鍵的表稱為從表。例如,有兩個表
學生(學號,姓名,性別,出生日期,入學時間,系部代碼)
選課(學號,課程號,成績)
對于選課表,學號是外鍵,對于學生表,學號是主鍵。學生表為主表,選課表為從表。
關系模型由三部分組成:數(shù)據(jù)結構、關系操作、關系的完整性。
2.表間的關聯(lián)關系
在一個關系數(shù)據(jù)庫中,若想將依賴于關系模型建立的多個數(shù)據(jù)表組織在一起,反映客觀事物數(shù)據(jù)間的多種對應關系,通常將這些數(shù)據(jù)表放入同一個數(shù)據(jù)庫中,并建立表間關聯(lián)。
在同一個數(shù)據(jù)庫中,相關聯(lián)的表間關系的類型有一對一、一對多和多對一。在E-R圖中,多對多的聯(lián)系在關系數(shù)據(jù)庫設計階段要轉化成一對多的聯(lián)系。
(1)一對一關系
一對一關系即在兩個數(shù)據(jù)表中選一個相同屬性字段作為碼,把其中一個數(shù)據(jù)表中的碼稱為主碼,該字段值是唯一的,而另一個數(shù)據(jù)表中的碼稱為外碼,該碼值也是唯一的。
例如,通過相同字段“編號”,可將教師基本信息表與教師工資表聯(lián)系起來,教師基本信息表中的“編號”為主碼(該碼值是唯一的),而教工工資表中的“編號”為外碼(該碼值是唯一的),兩個表便構成了一對一的關系,如圖1-20。

圖1-20
(2)一對多關系
一對多關系,即在兩個數(shù)據(jù)表中選一個相同屬性字段作為碼,其中一個數(shù)據(jù)表的碼稱為主碼,該字段值是唯一的,而把另一個數(shù)據(jù)表中的碼稱為外碼,該碼值是重復的。
例如,相同字段通過“編號”,可將教工基本信息表與教師授課表聯(lián)系起來,教師基本信息表中的“編號”為主碼(該字段值是唯一的),而教師授課表中的“編號”為外碼(該碼值是重復的),兩個表便構成了一對一的關系,如圖1-21所示。從圖1-21中可以看出,一個復雜的表可以分成一對多的關系,雖然還存在重復,但僅是外碼的重復。這就減少了數(shù)據(jù)輸入及數(shù)據(jù)存儲的復雜性。

圖1-21
(3)多對一關系
多對一關系與一對多關系是類似的,唯一的區(qū)別是在兩個相關聯(lián)的數(shù)據(jù)表中,選擇哪個數(shù)據(jù)表中的碼作為主碼。該碼值是重復的,與它相關聯(lián)的另一個數(shù)據(jù)表中的碼為外碼,該碼的值是唯一的。
在教師授課表與教師基本信息表中,如果以教師授課表中的“編號”為主碼(其值是重復的),而教師基本信息表中的“編號”為外碼(該碼值是唯一的),兩個表便構成了多對一的關系,如圖1-22所示。

圖1-22
通過上面的介紹可知,為兩個數(shù)據(jù)表建立關聯(lián)關系,其關系類型取決于主碼和外碼的取值是否重復。如果主碼和外碼的值都是唯一的,兩表間的關聯(lián)關系是一對一的關系;如果主碼和外碼的值中,一個是唯一的,另一個是重復的,則兩表間的關聯(lián)關系是一對一或多對一的關系。在一般情況下,把包含主碼的數(shù)據(jù)表稱為父表,把包含外碼的數(shù)據(jù)表稱為子表。
根據(jù)不同數(shù)據(jù)處理問題的實際需要設計數(shù)據(jù)庫中數(shù)據(jù)表的個數(shù)以及數(shù)據(jù)表間的關系,都有不同的要求,而遇到的問題對象都是個案化、個性化的對象,但是只要遵循關系模型理論和關系規(guī)范化原則,就能夠使所建的數(shù)據(jù)庫達到最佳效果。當然,關系規(guī)范化原則并不是僵硬的教條,它只是在建立數(shù)據(jù)庫以及數(shù)據(jù)表結構時起到一個指導性的作用,以減少對應用程序的靈活性的限制,提高數(shù)據(jù)的使用率。
3.關系運算
在Visual FoxPro中沒有提供傳統(tǒng)的集合運算,可以通過其他操作或編寫程序來實現(xiàn)。對關系數(shù)據(jù)庫進行查詢時,需找到用戶感興趣的數(shù)據(jù),這就需要對關系進行一定的關系運算。關系運算包括選擇、投影、連接和除法運算。考慮到非計算機專業(yè)學生的特點,也考慮到除法運算用得多,這里對除法運算不作介紹。這類運算將“關系”看做是元組的集合,其運算不僅涉及關系的水平方向(表中的行),而且涉及關系的垂直方向(表中的列)。
在Visual FoxPro中,查詢是高度非過程化的,用戶只需提出“要干什么”,而不需指出“怎么去干”。系統(tǒng)將自動對查詢過程進行優(yōu)化,可以實現(xiàn)對多個相關聯(lián)的表的高速存取。
(1)選擇運算(Selection)
從關系中找出滿足給定條件的元組的操作稱為選擇。選擇的條件以邏輯表達式給出,使邏輯表達式的值為真的元組將被選取。選擇是從行的角度進行的運算,即從水平方向抽取記錄。經(jīng)過選擇運算得到的結果可以構成新的關系,其關系模式不變,但其中的元組是原關系的一個子集。
比如,已知“人才檔案”關系模式如下:
人才檔案(編號,姓名,性別,出生日期,學歷,政治面貌,民族,工資現(xiàn)狀,工作簡歷,照片)
若想由“人才檔案”關系組成新關系,選出滿足條件的元組(僅要男性信息),其關系模式不變,可通過選擇操作來實現(xiàn)。
(2)投影運算(Projection)
從關系模式中指定若干個屬性組成新的關系稱為投影。投影是從列的角度進行的運算,相當于對關系進行垂直分解。經(jīng)過投影運算可以得到一個“新關系”,其關系模式所包含的屬性個數(shù)往往比原關系少,或者屬性的排列順序不同。投影運算提供了垂直調整關系的手段,體現(xiàn)出關系中列的次序無關緊要這一特點。
比如,已知有“人才檔案”關系,其關系模式如下:
人才檔案(編號,姓名,性別,出生日期,學歷,政治面貌,民族,工資現(xiàn)狀,工作簡歷,照片)
若想由“人才檔案”關系組成新關系,其關系模式是“新人才檔案(編號,姓名,性別,出生日期,學歷,政治面貌)”,可通過投影操作來實現(xiàn)。
(3)聯(lián)接運算(Join)
聯(lián)接是關系的橫向結合。聯(lián)接運算將兩個關系模式拼接成一個更寬的關系模式,生成的新關系中包含滿足聯(lián)接條件的元組。聯(lián)接過程是通過聯(lián)接條件來控制的,聯(lián)接條件中將出現(xiàn)兩個表中的公共屬性名,或者具有相同語義、可比的屬性。聯(lián)接結果是滿足條件的所有記錄,相當于Visual FoxPro中的“內部聯(lián)接”。
選擇和投影運算的操作對象只是一個表,相當于對一個二維表進行切割。聯(lián)接運算需要兩個表作為操作對象。如果需要聯(lián)接兩個以上的表,應兩兩進行聯(lián)接。
自然聯(lián)接:在聯(lián)接運算中,以字段值對應相等為條件進行的聯(lián)接操作稱為等值聯(lián)接。自然聯(lián)接是去掉重復屬性的等值聯(lián)接。自然聯(lián)接為最常用的聯(lián)接運算,前面的例子均屬于自然聯(lián)接。
例如,已知“人才檔案”關系和“成就成果”關系,其關系模式如下:
人才檔案(編號,姓名,性別,出生日期,學歷,政治面貌,民族,工資現(xiàn)狀,工作簡歷,照片)
成就成果(編號,成果名稱,成果類別,成果出處)
若想由編號JI04001組成新關系,可通過選擇和聯(lián)接操作來實現(xiàn)。
4.關系的完整性
數(shù)據(jù)完整性是指關系模型中數(shù)據(jù)的正確性和一致性。關系模型允許定義三類完整性約束:實體完整性、參照完整性和用戶自定義完整性約束。實體完整性和參照完整性是關系模型必須滿足的完整性約束條件,稱為關系的兩個不變,應該由關系系統(tǒng)自動支持,也就是在插入、修改、刪除操作時,數(shù)據(jù)庫系統(tǒng)自動保證數(shù)據(jù)的正確性和一致性。
(1)實體完整性約束(Entity Integrity Rule)
實體完整性約束:若屬性A是基本關系R的主屬性,則屬性A不能取空值。
例如,在關系“學生{學號,姓名,性別}”中,“學號”屬性為主碼,則“學號”不能取空值。
實體完整性約束要求關系中的元組在組成主鍵的屬性列上的值不能為空。例如,在學生選課關系“選課(學號,課程號,成績)”中,“學號”、“課程號”為碼,則“學號”和“課程號”兩個屬性都不能取空值。
對于實體完整性約束的說明如下:
① 實體完整性約束是針對基本關系而言的。一個基本表通常對應現(xiàn)實世界的一個實體集,如學生關系表對應于學生的集合,教師關系對應于教師的集合。
② 現(xiàn)實世界中的實體是可區(qū)分的,即它們具有某種唯一性標志。
③ 相應地,關系模型中以主碼作為唯一性標志。
④ 主碼中的屬性即主屬性不能取空值。所謂空值,就是“不知道”或“無意義”的值。如果主屬性取空值,就說明存在某個不可標志的實體,即存在不可區(qū)分的實體,這與第②點相矛盾,因此這個規(guī)則稱為實體完整性。
(2)參照完整性約束(Reference Integrity Rule)
現(xiàn)實世界中的實體之間往往存在某種聯(lián)系,在關系模型中實體及實體間的聯(lián)系都是用關系來描述的,這樣就自然存在著關系與關系間的引用。參照完整性約束要求不能在從表中引用主表中不存在的元組。
〖例1-10〗 學生實體和專業(yè)實體可以用下面的關系表示,其中主碼用下劃線標志:
學生(學號,姓名,性別,專業(yè)號,年齡)
專業(yè)(專業(yè)號,專業(yè)名)
這兩個關系之間存在著屬性的引用,即學生關系引用了專業(yè)關系的主碼“專業(yè)號”。顯然,學生關系中的“專業(yè)號”值必須是確實存在的專業(yè)的專業(yè)號,即專業(yè)關系中有該專業(yè)的記錄。也就是說,學生關系中的某個屬性的取值需要參照專業(yè)關系的屬性取值。
〖例1-11〗 學生、課程、學生與課程之間的多對多關系可以用如下3個關系表示:
學生(學號,姓名,性別,專業(yè)號,年齡)
課程(課程號,課程名,學分)
選修(學號,課程號,成績)
這3個關系之間存在著屬性的引用,即選修關系引用了學生關系的主碼“學號”和課程關系的主碼“課程號”。同樣,選修關系中的“學號”值必須是確實存在的學生的學號,即學生關系中有該學生的記錄;選修關系中的“課程號”值也必須是確實存在的課程的課程號,即課程關系中有該課程的記錄。換句話說,選修關系中某些屬性的取值需要參照其他關系的屬性取值。
兩個或兩個以上的關系之間存在引用關系,同一關系內部的屬性之間也可能存在引用關系。
〖例1-12〗 在關系“學生(學號,姓名,性別,專業(yè)號,年齡,班長)”中,“學號”屬性是主碼,“班長”屬性表示該學生所在班級的班長的學號,它引用了本關系的“學號”屬性,即“班長”必須是確實存在的學生的學號。
參照完整性約束:若屬性(或屬性組)F 是基本關系 R 的外碼,它與基本關系 S 的主碼 K1相對應(基本關系R和S不一定是不同的關系),則R中每個元組在F上的值必須:或者取空值(F的每個屬性值均為空值),或者等于S中某個元組的主碼值。
參照完整性約束就是定義外碼與主碼之間的引用規(guī)則。
對于例1-10,學生關系中每個元組的“專業(yè)號”屬性只能取下面兩類值:① 空值,表示尚未給該學生分配專業(yè);② 非空值,即該值必須是專業(yè)關系中某個元組的“專業(yè)號”值,表示該學生不可能分配到一個不存在的專業(yè)中,即被參照關系“專業(yè)”中一定存在一個元組,它的主碼值等于該參照關系“學生”中的外碼值。
對于例1-11,按照參照完整性約束,“學號”和“課程號”屬性也可以取兩類值:空值或目標關系中已經(jīng)存在的值,但由于“學號”和“課程號”是選修關系中的主屬性,按照實體完整性規(guī)則,它們均不能取空值,所以選修關系中的“學號”和“課程號”屬性實際上只能取相應被參照關系中已經(jīng)存在的主碼值。
在參照完整性規(guī)則中,R和S可以是同一個關系。對于例1-12,按照參照完整性約束,“班長”屬性值可以取兩類值:① 空值,表示該學生所在班級尚未選出班長;② 非空值,這時該值必須是本關系中某個元組的學號值。
(3)用戶定義的完整性
任何關系數(shù)據(jù)庫系統(tǒng)都應該支持實體完整性和參照完整性。除此之外,不同的關系數(shù)據(jù)庫系統(tǒng)根據(jù)其應用環(huán)境的不同,往往需要一些特殊的約束條件,用戶定義的完整性就是針對某一具體關系數(shù)據(jù)庫的約束條件。用戶自定義完整性約束是根據(jù)應用領域的需要,由用戶定義的約束條件,體現(xiàn)了具體應用領域的語義約束。例如,某個屬性必須取唯一性、某些屬性值之間應滿足一定的函數(shù)關系、某個屬性的取值范圍為0~100等。關系模型應提供定義和檢驗這類完整性的機制,以便用統(tǒng)一、系統(tǒng)的方法處理它們,而不要由應用程序承擔這一功能。
- 公有云容器化指南:騰訊云TKE實戰(zhàn)與應用
- 達夢數(shù)據(jù)庫編程指南
- 使用GitOps實現(xiàn)Kubernetes的持續(xù)部署:模式、流程及工具
- App+軟件+游戲+網(wǎng)站界面設計教程
- 卷積神經(jīng)網(wǎng)絡的Python實現(xiàn)
- iOS and OS X Network Programming Cookbook
- 數(shù)據(jù)革命:大數(shù)據(jù)價值實現(xiàn)方法、技術與案例
- 智能數(shù)據(jù)時代:企業(yè)大數(shù)據(jù)戰(zhàn)略與實戰(zhàn)
- Visual Studio 2013 and .NET 4.5 Expert Cookbook
- 貫通SQL Server 2008數(shù)據(jù)庫系統(tǒng)開發(fā)
- Doris實時數(shù)倉實戰(zhàn)
- 數(shù)據(jù)指標體系:構建方法與應用實踐
- Kubernetes快速進階與實戰(zhàn)
- 大數(shù)據(jù)技術體系詳解:原理、架構與實踐
- Redis 6開發(fā)與實戰(zhàn)