目錄
第1關(guān) 關(guān)系模型
關(guān)系型數(shù)據(jù)模型
關(guān)系模型基本術(shù)語
關(guān)系模型的數(shù)據(jù)操縱與完整性約束
數(shù)據(jù)操縱
完整性約束
關(guān)系模型優(yōu)缺點
優(yōu)點
缺點
實驗
頭歌實驗代碼
第2關(guān) 層次模型
層次型數(shù)據(jù)模型
層次模型的數(shù)據(jù)操縱與完整性約束
數(shù)據(jù)操縱
完整性約束
層次模型優(yōu)缺點
優(yōu)點
缺點
層次模型轉(zhuǎn)化為關(guān)系模型
頭歌實驗代碼
第3關(guān) 網(wǎng)狀模型
網(wǎng)狀數(shù)據(jù)庫模型
網(wǎng)狀型數(shù)據(jù)模型
網(wǎng)狀模型的數(shù)據(jù)操縱與完整性約束
數(shù)據(jù)操作
完整性約束條件
網(wǎng)狀模型優(yōu)缺點
優(yōu)點
缺點
網(wǎng)狀模型與層次模型
網(wǎng)狀模型轉(zhuǎn)化為關(guān)系模型
編程要求
頭歌實驗代碼
第1關(guān) 關(guān)系模型
數(shù)據(jù)庫數(shù)據(jù)模型通??煞譃槿N:關(guān)系模型、層次模型和網(wǎng)狀模型。
關(guān)系型數(shù)據(jù)模型
用二維表表示實體類型及實體間聯(lián)系的數(shù)據(jù)模型稱之為關(guān)系數(shù)據(jù)模型。
關(guān)系型數(shù)據(jù)模型對應(yīng)的數(shù)據(jù)庫自然就是關(guān)系型數(shù)據(jù)庫了,這是目前應(yīng)用最多的數(shù)據(jù)庫。
關(guān)系模型基本術(shù)語
在關(guān)系模型種有以下術(shù)語:
-
關(guān)系:一個關(guān)系對應(yīng)通常說的一張表。
-
元組:表中的一行即為一個元組。
-
屬性:表中的一列即為一個屬性,給每一個屬性起一個名稱即屬性名。
-
碼:也稱碼鍵,表中的某個屬性組,它可以唯一確定一個元組。
-
域:是一組具有相同數(shù)據(jù)類型的值的集合,屬性的取值范圍來自某個域。
-
分量:元組中的一個屬性值。
-
關(guān)系模型:對關(guān)系的描述,一般表示為:關(guān)系名(屬性1,屬性2,…,屬性 n)
注意:關(guān)系必須是規(guī)范化的,滿足一定的規(guī)范條件。最基本的規(guī)范條件:關(guān)系的每一個分量必須是一個不可分的數(shù)據(jù)項,不允許表中還有表。
關(guān)系模型的數(shù)據(jù)操縱與完整性約束
-
數(shù)據(jù)操縱
關(guān)系模型的數(shù)據(jù)操縱主要包括查詢、插入、刪除和更新數(shù)據(jù),它的數(shù)據(jù)操縱是集合操作,操作對象和操作結(jié)果都是關(guān)系,如關(guān)系代數(shù)。
-
完整性約束
數(shù)據(jù)及其聯(lián)系所具有的制約和依賴規(guī)則,保證數(shù)據(jù)的正確性、有效性和相容性
關(guān)系必須滿足實體完整性、參照完整性和用戶定義完整性約束
關(guān)系模型優(yōu)缺點
-
優(yōu)點
-
結(jié)構(gòu)簡單,都是一些表格的框架,實體的屬性是表格中列的條目,實體之間的關(guān)系也是通過表格的公共屬性表示,結(jié)構(gòu)簡單明了。
-
存取路徑對用戶而言是完全隱蔽的,使程序和數(shù)據(jù)具有高度的獨立性,其數(shù)據(jù)語言的非過程化程度較高。
-
操作方便,操作的基本對象是集合而不是某一個元祖。
-
有堅實的數(shù)學(xué)理論做基礎(chǔ),包括邏輯計算、數(shù)學(xué)計算等。
-
缺點
-
查詢效率低,關(guān)系數(shù)據(jù)模型提供了較高的數(shù)據(jù)獨立性和非過程化的查詢功能(查詢的時候只需指明數(shù)據(jù)存在的表和需要的數(shù)據(jù)所在的列,不用指明具體的查找路徑),因此加大了系統(tǒng)的負擔(dān)。
-
由于查詢效率較低,因此需要數(shù)據(jù)庫管理系統(tǒng)對查詢進行優(yōu)化,加大了 DBMS 的負擔(dān)。
use mydb;
實驗
例如以學(xué)生選課系統(tǒng)為例進行說明:
學(xué)生選課系統(tǒng)的實體包括:學(xué)生、教師、課程;其聯(lián)系一般為學(xué)生與課程之間是一種多對多的關(guān)系,教師與課程之間是多對多的關(guān)系。學(xué)生可以同時選擇多門課程,一門課程也可以同時被多個學(xué)生同時選擇;一位教師可以教授多門課程,一門可能可以由多個教師教授。因此他們之間的聯(lián)系如下:
將該 E-R 圖映射為關(guān)系數(shù)據(jù)模型中的表格如下:
- 學(xué)生
- 課程
- 教師
- 選課
- 教課
從中我們可以觀察到學(xué)生與課程之間的聯(lián)系以及教師和課程之間的多對多聯(lián)系都被映射成了表格。其中選課表中的 stu_id 和 course_id 分別是引用學(xué)生表和課程表的 course_id 的外鍵,教課表也是如此。
編程要求
編寫 SQL 語句,將 E-R 圖 轉(zhuǎn)換成二維表,創(chuàng)建這些轉(zhuǎn)換的表。 E-R 圖如下:
說明:一共涉及五張表,將表明分別確定為t_player
(參賽選手表)、t_school
(參賽學(xué)校表)、t_product
(參賽作品表)、t_player_product
(參賽選手與作品聯(lián)系表)和t_school_player
(參賽選手與學(xué)校聯(lián)系表),創(chuàng)表時除兩張關(guān)聯(lián)表外,各字段順序按照圖中標(biāo)簽順序擬定,字段類型除編號、學(xué)號、得分、電話、大小為int(11)
,其他字段皆為varchar(32)
。
兩張關(guān)聯(lián)表字段順序如下:
- t_player_product
字段 | 說明 |
---|---|
p_id | 選手編號 |
pr_id | 作品編號 |
pr_grade | 作品成績 |
grade_rates | 獲獎等級 |
- t_school_player
字段 | 說明 |
---|---|
s_name | 學(xué)校名稱 |
p_id | 選手編號 |
頭歌實驗代碼
#請在此添加實現(xiàn)代碼
########## Begin ##########
#在mydb庫中創(chuàng)建表
create table t_player(
p_id int(11) NOT NULL,
p_name varchar(32) NOT NULL,
p_sex varchar(32) NOT NULL,
p_num int(11) NOT NULL,
p_email varchar(32) NOT NULL,
PRIMARY KEY (p_id)
);
create table t_school(
s_name varchar (32) NOT NULL,
s_address varchar(32) NOT NULL,
s_telephone int(11) NOT NULL,
s_email varchar (32) NOT NULL,
PRIMARY KEY (s_name)
);
create table t_product(
pr_id int(11) NOT NULL,
pr_name varchar(32) NOT NULL,
pr_kind varchar(32) NOT NULL,
pr_link varchar(32) NOT NULL,
pr_size int(11) NOT NULL,
PRIMARY KEY (pr_id)
);
create table t_player_product(
p_id int(11) NOT NULL,
pr_id int(11) NOT NULL,
pr_grade int(11) NOT NULL,
grade_rates varchar(11) NOT NULL,
CONSTRAINT fk_player_product1 FOREIGN KEY t_player_product(p_id) REFERENCES t_player(p_id),
CONSTRAINT fk_player_product2 FOREIGN KEY t_player_product(pr_id) REFERENCES t_product(pr_id)
);
create table t_school_player(
s_name varchar(32) NOT NULL,
p_id int(11) NOT NULL,
CONSTRAINT fk_school_stu1 FOREIGN KEY t_school_player(s_name) REFERENCES t_school(s_name),
CONSTRAINT fk_school_stu2 FOREIGN KEY t_school_player(p_id) REFERENCES t_player(p_id)
);
########## End ##########
第2關(guān) 層次模型
層次型數(shù)據(jù)模型
層次模型是數(shù)據(jù)庫系統(tǒng)中最早出現(xiàn)的數(shù)據(jù)模型,層次數(shù)據(jù)庫系統(tǒng)采用層次模型作為數(shù)據(jù)的組織方式。它采用樹形結(jié)構(gòu)來表示各類實體以及實體間的聯(lián)系。
其實層次數(shù)據(jù)模型就是的圖形表示就是一個倒立生長的樹,由基本數(shù)據(jù)結(jié)構(gòu)中的樹(或者二叉樹)的定義可知,每棵樹都有且僅有一個根節(jié)點,其余的節(jié)點都是非根節(jié)點。每個節(jié)點表示一個記錄類型對應(yīng)與實體的概念,記錄類型的各個字段對應(yīng)實體的各個屬性。各個記錄類型及其字段都必須記錄。
上圖中,R1、R2 等表示實體類型,也叫做結(jié)點,每個實體類型可包含若干個屬性,也叫做字段。R1 結(jié)點和 R2 結(jié)點之間的關(guān)系叫做實體間聯(lián)系。R1 結(jié)點叫做根結(jié)點,R2 結(jié)點和 R3 結(jié)點叫做 R1 結(jié)點的子節(jié)點。R1 結(jié)點叫做 R2 結(jié)點的雙親結(jié)點。沒有子結(jié)點的結(jié)點也叫做葉結(jié)點,如 R3 、R4和 R5。
以學(xué)校某個系的組織結(jié)構(gòu)為例:
-
實體系是根結(jié)點,由系編號和系名2個屬性(字段)組成。它有兩個子結(jié)點,分別是教研室實體和學(xué)生實體。
-
實體教研室是系的子結(jié)點,它由教研室編號和教研室名2個屬性(字段)組成。
-
實體學(xué)生是系的子結(jié)點,它由學(xué)號、姓名和成績這3個屬性(字段)組成,由于它沒有子結(jié)點,所以也叫葉結(jié)點。
-
實體教師是教研室的子結(jié)點,它由教師編號、教師姓名和研究方向組成,由于它沒有子結(jié)點,所以也叫葉結(jié)點。
層次模型的數(shù)據(jù)操縱與完整性約束
-
數(shù)據(jù)操縱
層次模型的數(shù)據(jù)操縱主要有查詢、插入、刪除和更新,進行插入、刪除、更新操作時要滿足其完整性約束條件。
-
無相應(yīng)的雙親結(jié)點值就不能插入子女結(jié)點值
-
如果刪除雙親結(jié)點值,則相應(yīng)的子女結(jié)點值也被同時刪除
-
更新操作時,應(yīng)更新所有相應(yīng)記錄,以保證數(shù)據(jù)的一致性
-
完整性約束
-
數(shù)據(jù)及其聯(lián)系所具有的制約和依賴規(guī)則
-
保證數(shù)據(jù)庫中數(shù)據(jù)的正確性、有效性和相容性
-
通過指針維護父子關(guān)系
層次模型優(yōu)缺點
-
優(yōu)點
-
層次模型的數(shù)據(jù)結(jié)構(gòu)比較簡單清晰
-
查詢效率高,性能優(yōu)于關(guān)系模型,不低于網(wǎng)狀模型
-
層次數(shù)據(jù)模型提供了良好的完整性支持
-
缺點
-
結(jié)點之間的多對多聯(lián)系表示不自然
-
對插入和刪除操作的限制多,應(yīng)用程序的編寫比較復(fù)雜
-
查詢子女結(jié)點必須通過雙親結(jié)點
-
層次命令趨于程序化???
層次模型轉(zhuǎn)化為關(guān)系模型
關(guān)系模型是現(xiàn)在數(shù)據(jù)庫的主流模型,要想把層次模型轉(zhuǎn)化為關(guān)系模型,只需把層次模型中的各個實體通過外鍵關(guān)聯(lián)即可。
現(xiàn)有一個層次模型如下:
該層次模型有三個實體,分別是系、教研室和學(xué)生。我們可以把它轉(zhuǎn)化為如下圖的關(guān)系模型:
可以看出轉(zhuǎn)化為關(guān)系模型后,依舊有3個實體,各實體之間通過系編號這一屬性形成關(guān)聯(lián),這一屬性體現(xiàn)在建表語句中就是添加外鍵。
編程要求
編寫 SQL 語句,將指定的層次模型轉(zhuǎn)換為相應(yīng)的關(guān)系模型后創(chuàng)建表并插入數(shù)據(jù)。具體要求如下:
- 層次模型圖
將學(xué)生表命名為 student,教研室表命名為 edu,院系表命名為 dept,職工表命名為 emp。其中表中字段解釋如下:
字段名 | 建表用字段名 |
---|---|
系號 | dept_id |
系名 | dept_name |
地址 | addr |
教研室號 | edu_id |
教研室名 | edu_name |
學(xué)號 | student_id |
姓名 | student_name |
年級 | level_class |
職工號 | emp_id |
姓名 | emp_name |
職稱 | title |
注意:創(chuàng)表時外鍵字段名和主鍵字段名一致
插入數(shù)據(jù)如下圖:
頭歌實驗代碼
#請在此添加實現(xiàn)代碼
########## Begin ##########
#在mydb庫中創(chuàng)建表并插入數(shù)據(jù)
CREATE TABLE dept (
dept_id CHAR (3) PRIMARY KEY,
dept_name VARCHAR (20) NOT NULL,
addr VARCHAR (100)
);
CREATE TABLE edu (
edu_id CHAR (3) PRIMARY KEY,
edu_name VARCHAR (20),
dept_id CHAR (3),
FOREIGN KEY (dept_id) REFERENCES dept (dept_id)
);
CREATE TABLE student (
student_id CHAR (10) PRIMARY KEY,
student_name VARCHAR (10),
level_class CHAR (3),
dept_id CHAR (3),
FOREIGN KEY (dept_id) REFERENCES dept (dept_id)
);
CREATE TABLE emp (
emp_id CHAR (10) PRIMARY KEY,
emp_name VARCHAR (10),
title VARCHAR (10),
edu_id CHAR (3),
dept_id CHAR (3),
FOREIGN KEY (edu_id) REFERENCES edu (edu_id),
FOREIGN KEY (dept_id) REFERENCES dept (dept_id)
);
INSERT INTO dept VALUES ('D02', '計算機', 'R1101');
INSERT INTO edu VALUES ('R01', '數(shù)據(jù)庫', 'D02'),
('R02', '網(wǎng)絡(luò)', 'D02'),
('R03', '人工智能', 'D02');
INSERT INTO student VALUES ('S0012', '王明','G1','D02'),
('S0020', '鄭直','G2', 'D02'),
('S0199', '周密','G3', 'D02');
INSERT INTO emp VALUES ('E1101', '何璧','教授','R01', 'D02'),
('E3721', '劉新','講師','R01', 'D02'),
('E1234', '王思','教授','R03', 'D02'),
('E3722', '付弈','助教','R03', 'D02');
########## End ##########
第3關(guān) 網(wǎng)狀模型
網(wǎng)狀數(shù)據(jù)庫模型
對于層次和非層次結(jié)構(gòu)的事物都能比較自然的模擬,在關(guān)系數(shù)據(jù)庫出現(xiàn)之前網(wǎng)狀 DBMS (數(shù)據(jù)庫任務(wù)組)要比層次 DBMS 用得普遍。
網(wǎng)狀型數(shù)據(jù)模型
用有向圖表示實體和實體間聯(lián)系的數(shù)據(jù)結(jié)構(gòu)模型稱為網(wǎng)狀數(shù)據(jù)模型。
網(wǎng)狀模型是一種比層次模型更具普遍性的結(jié)構(gòu)。滿足下面兩個條件的基本層次聯(lián)系的集合稱為網(wǎng)狀數(shù)據(jù)模型:①允許一個以上的結(jié)點無雙親;②一個結(jié)點可以有多于一個的雙親。
下圖即是一個簡單的網(wǎng)狀模型例子:
層次模型中子女結(jié)點與雙親結(jié)點的聯(lián)系是唯一的,而在網(wǎng)狀模型中,這種關(guān)系可以不唯一。因此節(jié)點之間的對應(yīng)也就是 m:n 的關(guān)系,從而克服了層次狀數(shù)據(jù)模型的缺點。
下面以學(xué)生和課程之間的關(guān)系為例:
以課程和學(xué)生之間的關(guān)系來說,他們是一種 m:n 的關(guān)系,也就是說一個學(xué)生能夠選修多門課程,一門課程也可以被多個學(xué)生同時選修。
網(wǎng)狀模型的數(shù)據(jù)操縱與完整性約束
-
數(shù)據(jù)操作
主要包括查詢、插入、刪除和更新。具體如下:
-
進行插入操作時,允許插入尚未確定雙親結(jié)點值的子結(jié)點值。如可增加一名尚未分配到某個教研室的新老師,也可增加一些剛來報到還未分配宿舍的學(xué)生。
-
進行刪除操作時,允許只刪除雙親結(jié)點值。如可刪除一個教研室,而該科研室所有教師的信息仍保留在數(shù)據(jù)庫中。
-
修改數(shù)據(jù)時,可直接表示非樹狀結(jié)構(gòu),而無須像層次模型那樣增加冗余結(jié)點,因此修改操作時只需要指定更新記錄即可。
-
進行更新操作時只需更新指定記錄即可。
-
完整性約束條件
一般來說,網(wǎng)狀模型沒有層次模型那樣嚴格的完整性約束條件,但具體的網(wǎng)狀數(shù)據(jù)庫系統(tǒng)(如 DBTG)對數(shù)據(jù)操作都加了一些限制,提供了一定的完整性約束。DBTG 在模式 DDL 中提供了定義 DBTG 數(shù)據(jù)庫完整性的若干概念和語句,主要有:
-
支持記錄碼的概念,碼是唯一標(biāo)識記錄的數(shù)據(jù)項的集合。
-
保證一個聯(lián)系中雙親記錄和子記錄之間是一對多的聯(lián)系。
-
可以支持雙親記錄和子記錄之間某些約束條件。如有些子記錄要求雙親記錄存在才能插入,雙親記錄刪除時也連同刪除。
網(wǎng)狀模型優(yōu)缺點
-
優(yōu)點
-
網(wǎng)狀數(shù)據(jù)模型可以很方便的表示現(xiàn)實世界中的很多復(fù)雜的關(guān)系。
-
修改網(wǎng)狀數(shù)據(jù)模型時,沒有層次狀數(shù)據(jù)模型的那么多的嚴格限制,可以刪除一個節(jié)點的父節(jié)點而依舊保留該節(jié)點;也允許插入一個沒有任何父節(jié)點的節(jié)點,這樣的插入在層次狀數(shù)據(jù)模型中是不被允許的,除非是首先插入的是根節(jié)點。
-
實體之間的關(guān)系在底層中可以借由指針指針實現(xiàn),因此在這種數(shù)據(jù)庫中的執(zhí)行操作的效率較高。
-
缺點
-
網(wǎng)狀數(shù)據(jù)模型的結(jié)構(gòu)復(fù)雜,使用不易,隨著應(yīng)用環(huán)境的擴大,數(shù)據(jù)結(jié)構(gòu)越來越復(fù)雜,數(shù)據(jù)的插入、刪除牽動的相關(guān)數(shù)據(jù)太多,不利于數(shù)據(jù)庫的維護和重建。
-
網(wǎng)狀數(shù)據(jù)模型數(shù)據(jù)之間的彼此關(guān)聯(lián)比較大,該模型其實一種導(dǎo)航式的數(shù)據(jù)模型結(jié)構(gòu),不僅要說明要對數(shù)據(jù)做些什么,還說明操作的記錄的路徑。
-
DDL、DML語言復(fù)雜,用戶不容易使用。
-
記錄之間聯(lián)系是通過存取路徑實現(xiàn)的,用戶必須了解系統(tǒng)結(jié)構(gòu)的細節(jié)。
網(wǎng)狀模型與層次模型
網(wǎng)狀模型與層次模型之間的區(qū)別:
-
網(wǎng)狀模型允許多個結(jié)點沒有雙親結(jié)點
-
網(wǎng)狀模型允許結(jié)點有多個雙親結(jié)點
-
網(wǎng)狀模型允許兩個結(jié)點之間有多種聯(lián)系(復(fù)合聯(lián)系)
-
網(wǎng)狀模型可以更直接地描述現(xiàn)實世界
-
層次模型實際上是網(wǎng)狀模型的一個特例
網(wǎng)狀模型轉(zhuǎn)化為關(guān)系模型
網(wǎng)狀模型轉(zhuǎn)化成關(guān)系模型只需將其網(wǎng)狀模型節(jié)點之間指針描述的聯(lián)系在關(guān)系模型中使用外鍵描述即可。
仍使用上面示例中學(xué)生和課程間聯(lián)系的網(wǎng)狀模型,我們將它轉(zhuǎn)化為關(guān)系模型后如下圖:
編程要求
編寫 SQL 語句,將指定的網(wǎng)狀模型轉(zhuǎn)換為相應(yīng)的關(guān)系模型后創(chuàng)建表,并向表中插入數(shù)據(jù)。具體要求如下:
- 網(wǎng)狀模型圖
將學(xué)生表命名為 t_student,課程表命名為 t_course,關(guān)系表命名為 t_relation,表種各字段如下:
字段名稱 | 備注 | 類型 |
---|---|---|
s_id | 學(xué)號 | varchar(32) |
s_name | 學(xué)生姓名 | varchar(32) |
s_class | 年級 | varchar(32) |
c_id | 課程號 | varchar(32) |
c_name | 課程名 | varchar(32) |
c_creadit | 學(xué)分 | int(3) |
grade | 成績 | varchar(32) |
學(xué)生信息和課程信息如下:
s_id | s_name | s_class |
---|---|---|
S1 | 張樂 | 大一 |
S2 | 王沖 | 大二 |
S3 | 翠花 | 大一 |
c_id | c_name | c_creadit |
---|---|---|
C1 | 數(shù)據(jù)庫 | 45 |
C2 | python | 30 |
t_relation 表的插入數(shù)據(jù)如下圖:文章來源:http://www.zghlxwxcb.cn/news/detail-733225.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-733225.html
頭歌實驗代碼
#請在此添加實現(xiàn)代碼
########## Begin ##########
CREATE TABLE t_student (
s_id VARCHAR(32) NOT NULL,
s_name VARCHAR(32) NOT NULL,
s_class VARCHAR(32),
PRIMARY KEY (s_id)
);
CREATE TABLE t_course (
c_id VARCHAR(32) NOT NULL,
c_name VARCHAR(32) NOT NULL,
c_creadit INT(3),
PRIMARY KEY (c_id)
);
CREATE TABLE t_relation (
s_id VARCHAR(32) NOT NULL,
c_id VARCHAR(32) NOT NULL,
grade VARCHAR(32) NOT NULL,
CONSTRAINT fk_1 FOREIGN KEY t_relation(s_id) REFERENCES t_student(s_id),
CONSTRAINT fk_2 FOREIGN KEY t_relation(c_id) REFERENCES t_course(c_id)
);
INSERT INTO t_student VALUES("S1","張樂","大一"),("S2","王沖","大二"),("S3","翠花","大一");
INSERT INTO t_course VALUES("C1","數(shù)據(jù)庫",45),("C2","python",30);
INSERT INTO t_relation VALUES("S1","C1","A"),
("S1","C2","A"),
("S2","C1","B"),
("S2","C2","A-"),
("S3","C1","C");
########## End ##########
到了這里,關(guān)于實用數(shù)據(jù)庫開發(fā)實踐MySQL——數(shù)據(jù)模型的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!