數(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)來表示。當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)