数据库笔记——数据模型
1 概念數據模型與基本數據模型
1.1?概念數據模型
獨立于計算機系統的數據模型,它完全不涉及信息在計算機系統中的表示,只是用來描述某個特定組織所關心的信息結構,這類模型稱為 “概念數據模型”。
概念數據模型用于建立信息世界的數據模型,強調其語義表達能力,概念應該簡單,清晰,易于用戶理解,它是現實世界的第一層抽象,是用戶和數據庫人員之間進行交流的工具。最著名的是“實體聯系模型”。(ER模型)
1.2?基本數據模型
直接面向數據庫的邏輯結構的數據模型,它是現實世界的第二層抽象。這類模型涉及到計算機系統和數據庫管理系統,又稱為“基本數據模型”或“結構數據模型”。
?? 例如, 層次、網狀、關系、面向對象數據模型”。這類模型有嚴格的形式化定義,以便在計算機系統中實現。
2?Hierarchical Data Model層次模型
2.1 兩個概念
record (記錄): 現實世界的實體,表達成“記錄”的形式
field (字段): 每一個記錄有若干個域,用來表示實體的不同特征
2.2?Parent-Child relationship (PCR)
層次結構最基本的數據關系,兩個數據類型之間的1對多的關系.
| RCR的定義 | PCR的實例 |
2.3 Hierarchical Data Schema 層次數據模式
每一個PCR都是1對多,N個PCR組成起來.
每個記錄類型只能有一個parent.
| 定義 | 實例 |
2.4?Virtual Record虛記錄
在真實世界中,很多數據并不是層次化結構的,很難用PCR來直接表達這種結構.
?
舉幾個例子:
| 多對多關系 | |
| ? | ? ? |
| 多對一關系 | |
| ? | ? |
| 多元關系 | |
| ? |
為了避免冗余,同時又要保證PCR的樹形結構,我們就引入了虛記錄的概念.
只存一份記錄,其他引用該記錄的地方用指針代替(用指針代替的記錄——虛擬記錄)[下圖中下標v表示的記錄就是虛記錄]
?
| 多對多關系 | ||
| 多對一關系 | ? | |
| 多元關系 |
以多對多關系為例,我們定義了兩個虛記錄類型,一個代表學生一個代表課程。
那么我們就分別定義了課程-學生,學生-課程的一對多關系
但是此時的子女節點都是虛記錄,這個虛記錄記錄類型并不是真正地存儲數據,只是存儲了一個指向真正數據的指針。
2.5 層次數據的線性表示
由于存儲器是線性的,層次數據必須變換成線性形式才能存儲,層次數據模式的實例對應一棵層次樹(或森林),對層次樹(或森林)按先序遍歷生成的序列稱為層次序列(hierarchical sequence),規定以此作為存儲次序。
2.6?層次數據模型的特點
2.6.1 約束
(1)除了根記錄外,任何其它記錄不能離開其雙親記錄而孤立存在;
(2)任何記錄,不管虛實,只允許有一個雙親記錄(保證層次數據模式及其實例是樹形);
(3)虛擬記錄的指針必須指向一個實際存在的記錄,有虛擬記錄指向的記錄不得刪除;
(4)虛擬記錄不得為根記錄。
2.6.2 優點
記錄之間的聯系通過指針來實現,查詢效率較高(針對層次結構)。
2.6.3 缺點
1、只能表示1:N聯系,雖然可以采用虛擬記錄描述非層次數據關系,但較復雜,用戶不易掌握,并且非層次結構的查詢效率比較低;
2、由于層次順序的嚴格和復雜,引起數據的查詢和更新很復雜,因此應用程序的編寫也比較復雜;
3、模式描述語言較復雜,數據獨立性差。
3 Network Data Model 網狀數據模型
網狀數據模型的基本數據結構是set(系),代表了兩個記錄型之間的一個一對多的關系。?一這邊是主記錄;多這邊是屬記錄。
一個記錄類型可以是多個系的主記錄,也可以是多個系的屬記錄。
具有多種類型屬記錄的系——“多屬系”。
一個記錄型不能同時是一個系的首記錄,又是這個系的屬記錄。
data item:網狀數據結構中對于記錄的描述,有點類似于層次數據結構中的field,但是這里的‘field’可以是向量(復合類型)。
在網狀數據結構中,系值不再是樹了,而是鏈表
| ? |
|
?
3.1 Link記錄類型
在網狀數據結構中,如何表達自聯結呢?(因為一個記錄類型不能同時是主記錄和屬記錄)
比如我們要表示公式上下級關系的數據模式,我們引入一個LINK記錄類型:
| 類型 | 實例 |
| 1:1表示一人擔任一個領導崗位 1:N表示一個人可以領導N個人 |
因為自己和自己也是領導與被領導的關系,所以我們引入LINK類型進行輔助。
員工->相應LINK是一個一對一的關系,換句話說,每一個LINK就相當于員工的一個“替身”,用它和其他的員工產生聯系。
s2表達的就是領導與被領導的關系。
如果想要找某一個員工的下屬,先用S1鏈表找到他對應的S,然后用S2鏈表找到除了自己之外的元素,遍歷這個鏈表。遍歷到的人就是這個員工的直接下屬
3.2 網狀數據結構表達多對多關系
| 也是引用了Link記錄,link記錄有SL鏈表,是和student之間的關系;CL鏈表,和course之間的關系 ? ? 當我們要看一個學生選了幾門課的時候,我們從這個指定的學生出發,先沿著SL到Link去,然后 再從Link出發,沿著相應的CL到course ? 如果要看一門課那幾個學生選呢?那么就反過來,從課程出發,先沿著相應的CL到link,然后從link出發,沿著SL找到所有的學生 | 本表格中靠上的圖這樣的表示方式是不行的(一個記錄不能出現在同一系型的多個系值中,如果需要,那么必須使用Link記錄) 需要這樣,L5之后,沿著CL可以到DB,也可以到L6(C) ? |
4 Relational Data Model 關系數據網絡
關系模型(relaction data model)的主要特征是用表格結構表達實體集,用外鍵表示實體間聯系。與層次模型和網狀模型相比,關系模型比較簡單.
?關系模型是由若干個關系模式組成的集合。每個關系實際上是一張表格,記錄之間聯系是通過各個關系模式的鍵體現的。
關系模型最基本的數據結構是“表”。現實世界中的實體、實體和實體之間的關系都是用“表”來表示(以示區別,之前的層次和網狀,實體和實體之間的關系是用層次和網絡來表示的)
4.1 和層次結構、網狀結構的區別
關系模型和層次、網狀模型的最大差別是用鍵而不是用指針導航數據,其表格簡單,用戶易懂,用戶只需用簡單的查詢語句就可以對數據庫進行操作,并不涉及存儲結構、訪問技術等細節。
4.2 特點
這時候存儲的東西,查詢的東西,所有的東西都是表格,她們形成了一個封閉的空間,我們可以借此定義一個代數系統(關系代數)。
基于集合論,擁有更高的抽象級別。
計算機底層實現的一些細節將被屏蔽。
非過程化的查詢語言(SQL)(用戶只需要提供他要什么;而不用像之前的層次數據模型和網狀數據模型一樣,需要詳細說明他需要怎么查詢【遍歷鏈表or遍歷樹等到】)
4.2.1 軟連接
之前的兩種數據模型中,多對多是復雜的(要么需要虛記錄、要么需要LINK記錄).
在關系數據模型中,我們只需要再做一張表(如下圖的elective),里面的s#和C#就是student和course的id,可以看成這兩個的邏輯指針(即軟連接)。
4.3?關系數據模型的一些概念
屬性(attribute):實體的性質用屬性描述(eg,學生的姓名、學號。。。)
域(domain):每一個屬性都有一個取值范圍,這個范圍就是域。
4.3.1 域的性質
1范式限制(1NF):每一個屬性都是原子的,不能再分;即每一個屬性不能是結構啊數組啊什么的;換句話說,不允許出現表中套表。
允許某一個記錄里面的值是空值(NULL,不知道,表示該屬性值空缺)
同一關系中,不允許有同名屬性,但不同屬性可有相同的域。
4.3.2?關系
任何一個實體都是一個或者多個關系
如果一個關系R,有n個屬性A1,A2,…..An,相對應的域是D1,D2,……Dn,那么關系R可以表示為R = (A1/D1, A2/D2, … An/Dn),簡化為R = (A1, A2, … An) ——>這個就是關系的模式(schema)
n是關系的度/目(degree)
在關系R中,元組的次序無關,但不能允許有相同的二個元組
在關系R中,屬性的次序無關。
4.3.3?元組
元組是關系R的一個實例
一個關系R可以被表示成 r 或 r(R),r = {t1, t2, …, tm}
每一個元組可以表示為t = <v1, v2, …, vn>, vi∈Di, 1≤i ≤n ( t ∈ D1×D2×, …, ×Dn, 1≤i ≤n)
relation也被叫做表格,attribute被叫做列,tuple被叫做行。
4.4 鍵
4.4.1?候選鍵(candidate key)
對一個關系而言,一組屬性被稱之為候選鍵,當他滿足以下條件:
1,任意兩個元組,這組屬性里面的值都不一樣
2,這組屬性里面的任何一個子集都不具備上一條特點
那么這一組屬性就被稱之為候選鍵 candidate key(eg,身份證號碼)
(說白了就類似于極大無關組)
4.4.2 超鍵(super key)
如果不滿足候選鍵的條件2,也就是說有冗余的屬性,那么這樣的一組屬性被稱之為超鍵 super key。
4.4.3 主鍵(primary key)與全鍵(all key)
極大無關組不唯一,所以候選鍵也不唯一,那么我們可以選定其中一組為主鍵 primary key,其他的是候選鍵alternate key。
如果主鍵包括了關系中所有的屬性,那么我們稱之為全鍵all key。
4.4.4?外鍵(foreign key)
如果這一張表里面的屬性是用來引用另一張表的元組(即另一張表的主鍵),那么這一張表里面的這個屬性被稱為外鍵
在students里面sid是主鍵,在enrolled里面,sid是外鍵
4.5?約束
4.5.1 域完整性約束(Domain integrity constraint)
每條元組的每個屬性的值均符合值域的要求.
4.5.2 實體完整性約束(Entity integrity constraint )
主鍵的屬性不允許為空
如果這個值一定要為NULL,那么就不把它設置為主鍵.
4.5.3 引用完整性約束
外鍵要么空缺,要么引用實際存在的主鍵值
5 關系代數
5.1?這一小節會使用到的表格
水手信息的表格(rating是水手的級別)
?
船信息的表格
預定關系(這時候水手的id和船的id加起來的這個屬性組并不是主鍵,因為同一個水手可以在不同時間預定船,所以此時的主鍵是全鍵)。
5.2 基本運算符
如果一個系統支持以下五個基本操作,那么這個系統是關系完備的(關系模型上的所有操作都可以通過這五個操作導出)。
因為這些操作的結果也都是關系,所以這些運算符是可以相互組合的。
一元操作(單目)優先級高于二元操作。
5.2.1 選擇
1-Selection? (σ):選擇是一種單目運算,即對一個關系施加的運算,按給定條件從關系中挑選滿足條件的元組組成的集合 。
5.2.2 投影
Projection? (Π) :投影操作是單目運算,從關系中挑選指定的屬性組成的新關系。即把不需要的域(列)去掉
理論上投影操作需要去除重復元素(面向對象的模型里面,哪怕所有屬性都一樣,只要兩個元素id不同,就不是一個元素;但是在關系模型里面,如果所有的屬性都相等,那么我們認為它們表達的是同一個元素)。
但在實際的數據庫操作里面,是不主動去除同樣的元素的,除非用戶顯示地要求刪去(因為數據庫并不知道用戶的應用開發需要什么樣的數據,刪除了可能反而無法滿足用戶的需求)。
5.2.3 笛卡爾積
Cross-product? (笛卡爾乘積):把兩個關系拼接在一起,兩張表拼成一張大表
笛卡爾乘積的結果包含原來兩張表的所有屬性。
結果由參加運算的兩個表格的每一條元組兩兩拼接而成。
? <t,g>為t和g的拼接,即R × S仍為一個關系,它的目為nr+ns、元組數為|R|×|S|。
以S1×R1為例:
但因為S1和R1都有sid這個屬性,而同一張表里面不允許有兩個相同的屬性;于是我們要對屬性進行重命名:
結果為
5.2.4 集合差
et-difference? (-):集合差,A-B:屬于關系A,但是不屬于關系B的記錄
交運算可以用差運算表示。設A、B為兩個集合,則A和B的交可表示為:A∩B≡A-(A-B)
5.2.5 集合并
Union(∪) 集合并 由屬于A或屬于B的所有元組組成的集合。即兩個表合并成一個
參與并、差操作的兩個關系的元組必須限制為同類型的,即具有相同的目(屬性數),且對應的屬性的域相同——并兼容(union compatibility);
5.3 連接
5.3.1 條件連接 condition join
笛卡爾乘積是兩兩拼接,這就可能會出來很多沒有意義的元組,導致數據冗余。
條件鏈接就是在笛卡爾乘積的基礎上,對結果按照條件C進行選擇操作。
有的時候,條件連接也叫做θ連接。
連接條件為兩關系中對應屬性的比較,對應屬性不一定同名,但要有相同的域。其普遍表示形式為:<條件1>and<條件2>and…and<條件k>。
5.3.2 等值連接 equi-join
特殊的條件鏈接,只有做笛卡爾乘積的兩個表格,某一個/幾個屬性相同的才會被選擇
等值連接的結果相比于條件鏈接和笛卡爾乘積的結果,把等值的屬性去掉一個。
5.3.3 自然連接 natural join
做笛卡爾乘積的兩個表格,所有公共屬性相同的才會被選擇.
5.4 完備性
5.5 除法
結果的x集合滿足什么條件呢?對于B中的每一個y,都可以在A中找到一條記錄,使得<x,y>在A中
舉一個例子,A是由sno和pno兩個屬性組成,A/B的結果只有sno屬性,因為pno屬性被除掉了。
我們要找 原來關系A中,和B中的每一條元素都有聯系的xno。
我們舉A/B2為例,為什么不選s2呢?因為在A中有<s2,p2>,但沒有<s2,p4>,所以不滿足除法條件(對于B中的每一個y,都可以在A中找到一條記錄)
5.5.1 除法的表示
因為除法不是基本運算符,所以我們要看一下怎么把除法用五個基本運算符表示。
直接看“滿足和所有B中元素都有聯系”這個約束條件比較繁瑣,所以我們可以從”否定之否定“的角度來看這個問題。即先看不滿足除法條件的點,然后把這些點剔除就可以了。
我們先看
A中所有的x和B兩兩拼接,進行笛卡爾乘積,那么所有可能的A_x與B 的組合都有了。
接著是
把所有A中有的<x,y>對去掉,那么剩下的就是不滿足除法條件的所有<x,y>對了(不在原來A中的<x,y>對)
把所有不滿足除法條件的<x,y>對中的x提出來,這些x就是不滿足除法條件的點(因為如果某一個x滿足除法條件的話,那么所有這個x的<x,y>對在前面-A的時候應該都消掉了,留下來的都是至少有一個<x,y>對不在A中的)
于是我們得到了A/B(剔除上一步的x即可)
5.6 外連接
一般的連接是自然連接,那么不滿足連接操作的元組都會被丟棄。
如果我們一定要這些元素呢?那我們就要用外連接了。
外連接一共分成左外連接、右外連接和全外連接,分別是把左操作數、右操作數、兩個操作數的所有元組保留。能匹配的匹配,匹配不到的屬性對應的值為空值NULL
5.7 外并
執行基本操作并,需要滿足的條件是屬性模式需要相同。但實際應用中,不滿足并兼容關系的也要合并在一起的話,那就需要使用外并了。結果的屬性集是參與運算的屬性集的并。沒有值的元素填NULL。
6?關系演算Relational Calculus
用關系代數表示的操作,需要我們指定運算的順序【因而以關系代數為基礎的DB語言是過程性語言(procedural language)】,而關系演算只需要指明需要滿足的邏輯條件(基于謂詞演算的邏輯表達式)【只要說明所要得到的結果,而不必標明操作的過程,因而以關系演算為基礎的數據庫語言是說明性語言(declarative language)】。
換言之,關系演算只用謂詞公式告知“做什么”,而不告訴“怎么做”。
目前,面向用戶的關系數據庫語言基本上都以關系演算為基礎。
關系演算分為元組關系演算(以元組為單位定義變量)和域關系演算 (以屬性為單位定義變量),他們唯一的區別是變量的定義。
關系演算中的布爾表達式稱為公式,所有讓布爾表達式為真的結果就是我們要的答案。
6.1?安全查詢
我們可以寫出一個句法上是正確的,但是滿足結果的條件是無限多的關系演算。這樣的查詢是不安全的。
還是以水手為例,比如這樣的一個關系演算
意思為找出所有不在sailer表里面的水手,這個關系演算句法上是對的,但是是不安全的,因為我們可以找到無限個這樣的滿足條件的水手。
6.2 表達能力完備性
關系代數可以表達的,我們也可以用一個安全的域關系演算或者元組關系演算表達(兩者表達能力等價)。
6.3 域關系演算 Domain Relational Calculus
變量定義在域,也就是屬性上面。形式如下:
‘|’號右邊的公式可以有更多的域變量,但對于結果我只需要n個就夠了。
6.3.1 DRC中的原子公式
其中X,Y都是域變量,op是比較運算符。
6.3.2 DRC中的公式
后兩行“free”的意思是,在p(X)里面,X沒有被任取和存在限制。
還是以之前的水手為例,那么如果我們要找到等級在7以上的水手的id,名字等級和年齡,我們用關系演算可以這么寫:
6.4 元組關系演算Tuple Relational Calculus
有如下的格式:
t是元組變量,既可以用整個t作為查詢對象,也可查詢t中的某些屬性。
如果查詢整個t,則可省去<屬性表>。
還是以水手為例,我們要找到所有等級在7以上,年齡在50以下的水手的名字,我們可以這么寫
6.5 關系操作用關系演算表達
6.5.1?投影
6.5.2?選擇
6.5.3?減法
6.5.4 (自然)連接
7?傳統數據結構的評價
傳統數據結構是我們之前討論過的層次、網狀、關系數據結構的統稱。
7.1 特點
●都繼承了文件中的記錄、字段等概念。
●物理級也借鑒了文件的索引、散列等存取方法。
●向用戶提供了統一的數據模型和相應的數據庫語言。
●都在記錄的基礎上定義了數據的基本結構、約束和操作
7.2 不足
以記錄為基礎,基于結構化數據實現,把現實數據表示成規范化的內容,但這樣就不能很好地面向用戶和應用。
不能很自然地表達實體和實體之間的聯系。
缺乏語義信息(以關系為例,把實體表達成一張一張的表,從邏輯上講,表之間的地位是平等的。表之間的相互引用、繼承關系等內在聯系,則需要約束、應用程序、數據庫的文檔等才能看出來。單獨從模型的角度,是看不出來的)。
支持的數據類型太少(結構、字典、列表這種都不行)。
8 ER模型
E-R數據模型不是面向實現,而是面向現實世界。其設計的出發點是有效自然的模擬現實世界,而不是首先考慮它在機器中的實現問題。
?E-R模型提供了實體、屬性和聯系三個抽象概念。這三個概念簡單、明了、直觀易懂,用以模擬現實世界比較自然,且可方便地轉換關系、層次、網狀數據模式。
用E-R表示數據模式時,我們只關心有哪些數據(即有哪些實體以及屬性)以及數據間的關系(實體關系),而不必關心這些數據在計算機內如何表示和用什么DBMS。
在E-R模型中,實體和聯系均可有屬性,如選課聯系的屬性可有成績、選課時間等。
ER模型的實體大部分特點和關系模型是一樣的,不過實體的屬性允許復合類型,允許多值屬性。(比如一個人有多個電話,那么電話這個屬性就可以是多值屬性)
8.1 ER圖
雖然ER模型最終沒有成功,但是它的衍生物,ER圖在數據庫的設計中起到的重要的作用(我們直接看圖就能知道他的語義信息)
8.2 ER圖的擴展(EER extended ER)
8.2.1 弱實體Weak entity
不能單獨存在,必須依賴于其他的實體。
eg,學校職工-職工家屬,每個職工家屬實體都是弱實體,必須依賴于職工存在。
8.2.2 普遍化與特殊化 Specialization and Generalization
類似于面向對象里面的子類和父類。
8.2.3 聚集
允許將兩個實體間的關系也看成一個實體。
8.2.4 范疇 Category
可以用不同類型的實體組成的集合表達一個實體。
?
?
?
?
總結
以上是生活随笔為你收集整理的数据库笔记——数据模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文巾解题 1310. 子数组异或查询
- 下一篇: 用pytorch实现简易RNN