數(shù)據(jù)庫基礎(chǔ)Database4-數(shù)據(jù)庫設(shè)計
六 關(guān)系設(shè)計庫設(shè)計
一個關(guān)系模式: R(U, F)
其中:
- 關(guān)系名R是符號化的元組定義
- U為一組屬性
- F為屬性組U上的一組數(shù)據(jù)依賴
函數(shù)依賴和碼
6.1.1 函數(shù)依賴
數(shù)據(jù)依賴是一個關(guān)系內(nèi)部屬性與屬性之間的一種約束關(guān)系。這種約束關(guān)系是通過屬性間值的相等與否體現(xiàn)出來的數(shù)據(jù)間相關(guān)聯(lián)系。數(shù)據(jù)依賴包括:函數(shù)依賴(Functional Dependency, FD)和多值依賴(Multi-Value Dependency, MVD)。
函數(shù)依賴非常普遍舶担,我們可以用y=f(x)來表示。當(dāng)x確定的時候柿赊,y也就確定趋急。那么我們稱y函數(shù)依賴于x蒋川,記作: x->y
比如: 對于關(guān)系r(id, name, dept_name, address)廉油。根據(jù)id可以確定唯一的一個人惠险。那么顯而易見: id->name, id->dept_name, id->address
定義1 設(shè)R(U)是屬性集U上的關(guān)系模式,X抒线,Y是U的子集班巩。若對于R(U)的任意一個可能的關(guān)系r,r中不可能存在兩個元組在X上的屬性值相等十兢,而在Y上的屬性值不等趣竣,則稱X函數(shù)確定Y或Y函數(shù)依賴于X,記作X -> Y (參照前面的y=f(x))旱物。
下面介紹一些術(shù)語和記號:
- X->Y, 但Y?X遥缕,則稱X->Y是非平凡的函數(shù)依賴。
- X->Y, 但Y?X宵呛,則稱X->Y是平凡的函數(shù)依賴单匣。(對任何非空集都成立,因為X真包含Y)
- 若X->Y宝穗,則X稱為這個函數(shù)依賴的決定屬性組户秤,也稱決定因素(determinant)。
- 若X->Y, Y->X逮矛,則記作X<-->Y.
- 若Y不依賴于X鸡号,則記作Y?X.
定義2 ?在R(U)中,如果X->Y须鼎,并且對與X的任何一個真子集X’鲸伴,都有X’?Y,則稱Y對X完全函數(shù)依賴晋控,記作X->FY. (每一個y=f(x)汞窗,這種映射是一一對應(yīng))
????若X->Y, 但Y不完全函數(shù)依賴于X,則稱Y對X部分依賴(partial functional dependency),記作:X->PY.
注意:完全依賴和不完全依賴兩個符號有問題赡译,F(xiàn)和P是在->正上面仲吏,請搜一下。
6.1.2 碼(后面我都稱作鍵)
定義4 設(shè)K為R(U,F)的屬性或?qū)傩越M合蝌焚,若K->FU裹唆,則K為R的候選鍵(Candidate Key). 如果U部分依賴于K,即K->PU只洒,則稱K為超鍵(Superkey)品腹。候選鍵是最小的超鍵,即K的任意一個真子集都不能成為一個候選鍵红碑。
若候選鍵多于一個舞吭,則選取其中一個為主鍵(Primary Key)。否則主鍵就是候選鍵析珊。
包含在任何一個候選鍵中的屬性成為主屬性(prime attribute)羡鸥;其他的稱為非主屬性(nonprime attribute)。最極端的情況是忠寻,整個屬性組都是主屬性惧浴,成為全鍵(all-key)。
后面奕剃,把主鍵或者候選鍵簡稱為鍵衷旅。
定義5 關(guān)系模式R中屬性或?qū)傩越MX并非R的鍵捐腿,但X是另一個關(guān)系模式的鍵,則稱X是R的外鍵(Foreign Key).
6.2 第一范式 (First Normal Form, 1NF)
關(guān)系數(shù)據(jù)庫中的設(shè)計是要滿足一定要求的柿顶,滿足不同程度要求的為不同范式茄袖。
一個低一級范式的關(guān)系模式通過模式分解(schema decomposition)可以轉(zhuǎn)換為若干個高一級范式的關(guān)系模式的集合,這種過程就叫規(guī)范化(Normalization)。
各范式之間:5NF?4NF?3NF?2NF?1NF
對于關(guān)系模式R,一個域是原子的鼓蜒,如果該域的元素被認為是不可分割的單元。我們稱一個關(guān)系模式R屬于第一范式: R∈1NF蝗羊。
組合單元由不可分割單元或組合單元構(gòu)成。比如street, city, provice 和 zipcode是不可分的仁锯,但是包含了這些屬性的Address是可分的耀找,是組合單元。
6.3 第二范式 (Second Normal Form业崖, 2NF)
若R∈1NF,且每一個非主屬性完全函數(shù)依賴于任何一個候選鍵涯呻,則稱R屬于第二范式:R∈2NF。
一個關(guān)系模式如果不屬于2NF腻要,就會出現(xiàn)如下問題:
- 插入異常
- 刪除異常
- 修改復(fù)雜
6.4 第三范式 (Third Normal Form, 3NF)
設(shè)關(guān)系模式R<U,F>∈1NF,若R中不存在這樣的鍵X复罐,屬性組Y及非主屬性Z(Z?Y)是的X->Y, Y->Z成立,Y?X,則稱R<U,F>∈3NF雄家。
6.5 BCNF(Boycee Codd Normal Form)
關(guān)系模式R<U,F>∈1NF效诅,若X->Y且Y?X時必含有鍵,則R<U,F>∈BCNF趟济。
也就是說關(guān)系模式R<U,F>中乱投,每一個決定因素都包含鍵,則R<U,F>∈BCNF顷编。
由BCNF的定義可以得到結(jié)論戚炫,一個滿足BCNF的關(guān)系模式有:
- 所有非主屬性對每一個鍵都是完全函數(shù)依賴
- 所有主屬性對每一個不包含它的鍵也是完全函數(shù)依賴
- 沒有任何屬性完全函數(shù)依賴于非鍵的任何一組屬性
BCNF?3NF。
注意:對范式的講解媳纬,這里是摘抄自《數(shù)據(jù)庫系統(tǒng)概論》5th(王珊双肤,薩師煊)。我覺得《數(shù)據(jù)庫系統(tǒng)概念》6th, (Abraham Silberschatz ...)例子更多钮惠,更容易理解一點茅糜。
6.5 多值依賴(Multi-Value Dependency)
暫時省略
以后會修改關(guān)于范式的講解
七 E-R模型
7.1 實體-聯(lián)系(entity relationship, E-R)
實體-聯(lián)系數(shù)據(jù)模型的提出旨在方便數(shù)據(jù)庫的設(shè)計,它是通過允許定義代表數(shù)據(jù)庫全局邏輯結(jié)構(gòu)的企業(yè)模式實現(xiàn)的素挽。
E-R數(shù)據(jù)模型采用了三個基本概念:
- 實體集
- 聯(lián)系集
- 屬性集
E-R模型的相關(guān)圖形表示是E-R圖蔑赘。
實體(entity)是現(xiàn)實世界中可區(qū)別所有其他對象的一個“事務(wù)”或“對象”。實體集(entity set)是相同類型即具有相同性質(zhì)(或?qū)傩裕┑囊粋€實體集合。
實體通過屬性(attibute)來表示缩赛。屬性是實體集中每個成員所擁有的描述性性質(zhì)耙箍。每個實體的每個屬性都有一個值。
屬性分為簡單(simple)屬性和復(fù)合(composite)屬性酥馍。簡單屬性不可再劃分為更小的部分辩昆。復(fù)合屬性可以再劃分為更小的部分。
屬性也可以被分為單值屬性物喷、多值屬性。
聯(lián)系(relationship)是指多個實體間的相互關(guān)聯(lián)遮斥。聯(lián)系集(relationship set)峦失。實體集間的關(guān)聯(lián)稱為參與(participate)。
7.2 約束
7.2.1 映射基數(shù)(mapping cardinality)
映射基數(shù)或基數(shù)比率术吗,表示一個實體通過一個聯(lián)系能關(guān)聯(lián)的實體的個數(shù)尉辑。
對于實體集A和B之間的二元聯(lián)系集R來說,映射基數(shù)必然是以下情況之一:
- 一對一(one-to-one)较屿。A中的一個實體至多與B中的一個實體相關(guān)聯(lián)隧魄,并且B中的一個實體也至多與A中的一個實體相關(guān)聯(lián)。
- 一對多(one-to-many)隘蝎。A中一個實體可以與B中任意數(shù)目(零個或多個)實體相關(guān)聯(lián)购啄,而B中的一個實體至多與A中的一個實體相關(guān)聯(lián)。
- 多對一(many-to-one)嘱么。A中一個實體至多與B中的一個實體相關(guān)聯(lián)狮含,而B中的一個實體可以與A中任意數(shù)目(零個或多個)實體相關(guān)聯(lián)。
- 多對多(many-to-many)曼振。A中的一個實體可以與B中的任意數(shù)目實體相關(guān)聯(lián)几迄,B中的一個實體可以與A中的任意數(shù)目實體相關(guān)聯(lián)。
7.2.2 參與約束
如果實體集E中的每個實體都參與到聯(lián)系集R中的至少一個聯(lián)系中冰评,實體集E在聯(lián)系集R中的參與稱為全部的(total)映胁。如果E中只有部分實體參與到聯(lián)系集R中,則<稱實體集E在聯(lián)系集R中的參與是部分的(partial)甲雅。
7.3 實體聯(lián)系圖
舉個例子:
實體集:(主鍵用下劃線標出)
instructor(<u>ID</u>, name, salary)
student(<u>ID</u>, name, tot_cred)
屬性集:
advisor:關(guān)聯(lián)教師和學(xué)生
分別用一對一解孙、一對多、多對多來表示:
《數(shù)據(jù)庫系統(tǒng)概念》中用的是箭頭抛人。有的用的是數(shù)字(比如維基百科)妆距。有不同的表示方法.
映射基數(shù):
![er_stud_cardinality]
advisor左邊0..*表示,每個instructor對應(yīng)0個或多個學(xué)生函匕。advisor右邊1..1表示每個學(xué)生對應(yīng)1個(最少1個娱据,最大1個)教師。 這個圖還表示了,student在advisor中的參與是完全的中剩。忌穿、
下面是用MySQL Workbench根據(jù)上面副圖(映射基數(shù))來畫的:
黃色的是主鍵。student中instructor_ID是外鍵结啼,引用instructor的主鍵ID掠剑。
7.4 轉(zhuǎn)化為SQL語句:
下面是前一節(jié)MySQL Workbench導(dǎo)出的SQL:
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
USE `mydb` ;
-- -----------------------------------------------------
-- Table `mydb`.`instructor`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`instructor` (
`ID` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NOT NULL,
`salary` INT NULL,
PRIMARY KEY (`ID`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`student`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`student` (
`ID` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NOT NULL,
`tot_cred` INT NULL,
`instructor_ID` INT NOT NULL,
PRIMARY KEY (`ID`),
INDEX `fk_student_instructor_idx` (`instructor_ID` ASC),
CONSTRAINT `fk_student_instructor`
FOREIGN KEY (`instructor_ID`)
REFERENCES `mydb`.`instructor` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
[er_stud_cardinality]:https://upload-images.jianshu.io/upload_images/11086962-2a904c3849dc7330.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)