日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库杂谈(二)——数据模型

發布時間:2023/12/9 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库杂谈(二)——数据模型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天的你也要快樂!

文章目錄

  • 2 數據模型
    • 2.1 層次數據模型
      • 2.1.1 基礎概念
      • 2.1.2 結構
      • 2.1.3 虛擬記錄
    • 2.2 網狀數據模型
      • 2.2.1 基本概念
      • 2.2.2 聯系記錄
      • 2.2.3 結構
      • 2.2.4 單值系和無首系
    • 2.3 關系數據模型
      • 2.3.1 基本概念
      • 2.3.2 鍵 (碼)
        • 2.3.2.1 候選鍵
        • 2.3.2.2 超鍵
        • 2.3.2.3 主鍵
        • 2.3.2.4 外鍵
    • 2.4 約束
      • 2.4.1 實體完整性約束
      • 2.4.2 域完整性約束
      • 2.4.3 參照完整性約束
      • 2.4.5 用戶定義的完整性約束

2 數據模型

2.1 層次數據模型

2.1.1 基礎概念

在現實世界中,有很多數據都是具有層次的特征的,由數據結構我們自然想到可以用樹來表達現實世界,層次數據模型就是基于這種想法提出來的。

層次數據模型的提出,首先是為了模擬這種按層次組織起來的事物。

在下面,我們會提到幾個概念:記錄型,字段,記錄。我們用一張圖來清楚地表示:

在這個表格中,黃色部分表示記錄的型;藍色部分表示記錄。而記錄的型里面某個屬性叫做字段。

2.1.2 結構

層次數據模型中有著PCR關系,這里的PCR并非高中生物課本的PCR,而是指雙親子女關系(Parent-Chlid-Relationship,PCR),他是層次模型中最基本的數據關系,他代表了兩個記錄型之間一對多的關系。例如學生和課程,一個學生可以選修多個課程。

也就是說,我們的層次數據模型就是基于PCR的一種模型,其應該為一顆倒立的樹,除了根,每個記錄型都應該有他自己對應且唯一的父母,但是每個父母可以有多個子女。

其實拋開這個問題不講,在現實世界中,不是說所有的關系都是一對多的,也有可能是多對一,或者多對多,這就是所謂的多元關系。假設我們有這么一個例子,一個學生可以選擇多門課,一門課可以被多個學生選擇。假設學生是父,那么課就是子,多門課只能對應一個父,也就是說想要一門課要想能被多個學生選擇,那么根據PCR關系,他必須復制多份一模一樣的課出來,如圖所示:

用PCR處理后:

這樣的話導致了數據冗余,原本一個人工智能的課在數據庫中拷貝了三份。

2.1.3 虛擬記錄

由上面簡單的例子可以知道PCR會導致數據冗余,不但浪費存儲空間,還導致數據不一致。由此我們引出了虛(擬)記錄的概念。

虛記錄(Virtual Record),其實就是如果遇見上述的關系,我們無須復制一份,只需要在引用的地方用其指針來代替即可,用指針替代的記錄叫做虛記錄,虛記錄通常用下標V表示,指針用虛線箭頭表示。

舉一個例子來說:

由圖可知,學生指向課程,但是指過去無法指回來;所以我們指向他的虛記錄,虛記錄指回本體;課程本體如果指向學生,那學生無法指回課程;所以課程本體指向學生的虛記錄,學生虛記錄指向學生本體。


2.2 網狀數據模型

2.2.1 基本概念

與層次數據模型類似,在網狀數據模型中,也是以記錄作為數據的存儲單位。但是不同的是,在網狀數據模型中,字段這個名詞變成了數據項,并且在層次數據模型中,字段是最小單位不可再分的,可是數據項是可以再分的,我們把可以再分的數據項叫做多值數據項,如例子所示:

學生名學號班級年齡生日地址
baka愛159年一班152000.1.25{(酒店),(飯店)}

在地址這個數據項中,其對應了一個多值集合。這也側面說明了多值數據項可以用有序的集合表示,簡單的多值數據項我們也叫做向量。

作為記錄,其在數據結構中還有對應的地址;如果想要查找某一條記錄,只需要查對應地址即可,每個記錄有一個唯一地標識他的數據庫碼(DataBase Key,DBK)。DBK可以看成記錄的邏輯地址,可做記錄的替身或用來尋找記錄。

那么如何表達兩團數據之間的聯系呢?比如兩團數據一個是班級的數據一個是學生的數據,那么兩團數據的聯系由什么表示呢?這就要提到系(set)的概念了。

假如在班和學生兩團數據中,一個班對應多個學生,那么我們叫把班級-學生的系叫做它們之間的聯系。在這里例子中,班為1而學生為n,則我們把1的一方叫做首記錄,把N的一方叫做屬記錄。

需要注意的是,在一個系的屬記錄中,有時會包含多種類型的屬記錄,例如班級-學生這個系中,學生可以再分,分為男學生和女學生,那么此時我們把擁有多種類型屬記錄的系,叫做多屬系。

或者再舉一個例子:一個銀行賬戶可以作為首記錄,而屬記錄是這個賬戶的一筆筆的賬,這些賬可以是存款的、提款的或轉賬的,他們分屬于不同的記錄型。

實際上,多屬性可以拆分為多個系,比如班級-學生這個系可以拆分為班級-男學生和班級-女學生,但是分開多個系你要來回在不同的系找人不方便,所以對于多屬系來說,其優點是查找方便。

2.2.2 聯系記錄

在層次數據模型中,我們有說到虛記錄,在網狀數據模型中,我們不需要考慮虛記錄,因為他并沒有PCR關系,就拿下面這個例子來說:

班和學生構成一個系,運動隊和學生構成一個系,學生既是“班-學生”的屬記錄,也是“運動隊-學生”的屬記錄,無須用PCR復制,無須用指針創建虛記錄。

結果上面的例子我們可以總結出以下的道理:

  • 一個記錄型可以作為幾個系的首記錄,也可以作為幾個系的屬記錄。
  • 一個記錄型可以作為一個系的首記錄,也可以作為另一個系的屬記錄。
  • 但是!一個記錄型不能做一個系的首記錄,又做這個系的屬記錄。

第一小點和第二小點可以用一個例子:“班級-學生”,“家庭-學生”和“學生-選課”這三個系中,學生作為中轉站,他可以做多個系的屬紀錄,也可以做另外多個系的主記錄。

第三小點也不難理解:在“班級-學生”這個系中,你不能說學生又是屬記錄又是主記錄。

上面的道理中,第三點顯然不符合現實。為什么這么說?舉個例子:

職員和領導,職員是領導的下屬,但是領導也是職員,也就是說在領導也在職員記錄型里面,這顯然是不符合要求的。但是現有的知識中沒能解決這個問題,所以網狀數據模型引入了聯系記錄(link 記錄)這個概念。

聯系記錄干了這么一件事情:拿職員和領導的關系來說,我們中間引入一個link變量,來接收職員的箭頭,再把箭頭指向領導。

上面這樣表示的意思是:一個領導下管理多個職員,但是職員中也有領導。這樣看可能看不出什么,但是這樣看呢?

在上面,我們談論的班級-學生,其對應的是一團班級(可以理解為班級表)和一團學生(可以理解為學生表),所以實際上我們說的系是系型,而具體的某個學生,某個班級,就是系值,也就是我們說的記錄,只是體現在系的層面上換了個名字。需要注意的是,一個記錄值不能出現在同一類型的多個系值當中,打個比方就是學生表里面不能有兩條一模一樣的記錄。

聯系記錄的另外一個用法是:由于一個記錄值不能出現同一系型的多個系值中,所以比如說學生-課程這個系,課程里面有一門數據結構,它同時被兩個人選,但是它的記錄不能出現在這個系型里面兩次,所以可以用聯系記錄做如下表示:

從看到上圖我們可以知道,為了避免課4被兩個學生用同一個記錄,所以我們將每個課和link掛鉤,用兩個link來當課4的中轉站。這樣相當于是層次數據模型中的多元關系。

2.2.3 結構

談完上面的知識,我們又要說說網狀數據模型的結構。在層次結構中我們用樹來表示其結構,但是在網狀數據模型中我們用的是鏈表來實現,如圖所示:

在這里要提到一個,鏈表用指針串聯也是有講究的,我們一般分為三類:前向指針,后向指針和首記錄指針,其中前向指針是必備的。

指針說明
前向指針就是依次從根開始,依次指向“下”一個記錄
后向指針和前向指針相反
首記錄指針屬記錄指向首記錄

2.2.4 單值系和無首系

實際上,兩個名詞指的是同一個東西,這種系通常沒有首記錄,所以叫無首系,或者具體點說,一個單位里面有很多部門,但是單位只有一個,我們可以直接省略,所以無首系又叫做單值系。

再比如“班級-學生”,班級有很多個,我們不能說“班級-學生”是單值系,但是“學校-班級”中的學校只有一個,總而言之,單值系和無首系都是相對的,要視具體問題來看。


2.3 關系數據模型

實際上,上面兩個數據模型我們在雜談(一)提到過都是舊時代的產物了,基本上沒什么人用了,目前主流的數據模型是這一小節要提到了關系數據模型。

關系數據模型是以集合論中的關系概念為基礎發展起來的數據模型,他的基本數據結構是表,我們一般叫做關系。我們把現實世界的實體和實體之間的聯系用表來表示。

在這里要先說明,實際上,關系并不能完全地等同于表,嚴格意義上來說要說等于一張加了特殊限制的二維表。因為在關系數據模型中,默認其遵循第一范式,即不允許表中套表。關于范式問題我們在后面的小節中會提到。當然,有特殊需要時,我們可以選用不遵守第一范式的擴充關系數據模型。

2.3.1 基本概念

在關系數據模型中,以往模型的術語在這里變得大為不同。下面用一張圖來說明:

黃色熒光筆部分叫做屬性,具體的某個屬性叫做屬性名,在不混淆的情況下我們可以簡稱屬性。藍色熒光筆部分叫做元組,元組可以看做是網狀數據模型中我們說的記錄。屬性名對應的取值范圍叫做屬性域,屬性中有n個屬性名我們就叫n目,上面的圖表中,這是一個五目的關系。整個表我們叫做關系,用R或r(R)表示,從這些概念來看,關系是n目元組的集合。一般來說我們描述關系是用R(屬性1,屬性2,...,屬性n)來描述的,具體到這里的例子:學生表(Sno,Sname,Ssex,Dno,Dname)。

既然說到關系是集合,就勢必要要說到高中數學中集合的概念,集合具有無序性,確定性,互異性三大特性,這也說明了01元組放在第一行和放在第二行是一樣的(無序性),互異性說明元組是不能重復的,確定性說明元組一定要是確定的,不能模棱兩可。

還有,從上表我們可以看到,表中存在NULL值(空值),雖然名字這么念,可實際上并不是一個值,它表示該地方未知或不存在,具體到這里的例子來看,該學生很可能已經入學但是還沒分配屬于哪個系,所以該學生不知道哪個系的。

空值會給數據庫訪問和更新帶來很多困難,所以應該盡量避免使用空值。

不同屬性是可以有相同的域的,比如出生年份和生日,他們的域都是有限集合的時間,但是雖然域相同,但是他們所指的意思不一樣。

2.3.2 鍵 (碼)

造成這一小節的標題原因來源于英文,因為英文是key,翻譯過來就是鍵或碼。在這一小節中,很多名詞在不同的書上叫法都不同。

2.3.2.1 候選鍵

候選鍵(候選碼)也叫鍵,通俗來講他是某個屬性或屬性組(多個屬性),通過這個屬性我們可以唯一地確定某一個元組。候選鍵實際上是狹義的鍵,廣義的鍵應該指所有鍵種類的集合。

拿上面這張表來說,候選鍵應該是Sno。有人說Sname呢?抱歉,名字可能重名,但是學號不可能重復。

需要注意的是,候選鍵在關系中至少有一個,這對應到集合概念中的確定性,如果你連候選鍵都沒有,說明你連某個元組都確定不了,那這不就是模棱兩可嗎。

還有,候選鍵里不可以包含候選鍵,比如說(Sno,Sname)是候選鍵嗎?不是,因為這個屬性集里面包含了候選鍵。

其中候選鍵所包含的屬性叫做主屬性,不包含的叫做非主屬性。對應到上表,Sno是主屬性,其余屬性皆為非主屬性。

2.3.2.2 超鍵

在上面的例子中,我們曾經提到過(Sno,Sname),當時我們說到它不是候選鍵,但是能唯一確定一條元組,我們把這種屬性集叫做超鍵。

2.3.2.3 主鍵

擁有一個或多個候選鍵的時候,在里面挑一個作為主鍵,其他作為候補鍵(這里不是候選哦,是候補哦,看好字),主鍵有些書叫做主碼,關鍵值,關鍵碼。

2.3.2.4 外鍵

用這個r1里的某個鍵,可以引用(尋找)其他關系中的某條元組,也就是可以引用其他表的主鍵,那我們叫這個r1上的某個鍵為外鍵。有些書叫做外碼或外值,而關系r1也叫做外碼依賴的參照關系,另外的那張表被叫做被參照關系。

在下一小節中,我們會提到參照完整性約束,參照完整性約束要求參照關系中的任意元組在特定屬性上的取值必然等于被參照關系中某個元組在特定屬性上的取值。

需要注意的是,外鍵實際上是一個邏輯指針,也就是r1的某個鍵通過其他關系的指針去尋找對應的元組。所以指針必須非空。


2.4 約束

在數據庫系統中,為了維持數據庫中數據的一致性,使其能夠準確地描述顯示世界,所以要采用一定的約束,這里我們講的約束是針對關系數據模型的,在后面我們會講到更多的約束。

2.4.1 實體完整性約束

前面我們說過,允許關系里面出現空值,但是主鍵一定不能為空,每個關系都應該有一個主鍵,每個元組的主鍵的值都是唯一地,主鍵的值不能為NULL,否則無從區別和識別元組。

2.4.2 域完整性約束

簡而言之,你的屬性值必須得是域中的值。比如說,學號是int類型的,你把它的值填了個char的,一定會報錯。

2.4.3 參照完整性約束

參照完整性約束要求參照關系中的任意元組在特定屬性上的取值必然等于被參照關系中某個元組在特定屬性上的取值。參照的完整性要求關系中不允許引用不存在的實體。與實體完整性是關系模型必須滿足的完整性約束條件,目的是保證數據的一致性。參照完整性又稱引用完整性。舉個簡單的例子,你說學生表中的宿舍區對應宿舍表中的宿舍區,那么你學生表中的宿舍區有個C棟,宿舍表中的宿舍區一定要有C棟,不能說沒有。

2.4.5 用戶定義的完整性約束

這是針對某一具體數據的約束條件,應該由應用環境決定。比如年齡不可能是負的,性別不可能不男不女不人妖。一般來說常見的用戶定義的完整性約束如下。

NULL

代表空值,但是他不是一個值,不等于0,而是代表這里沒有值。在以前我們是二值邏輯,即要么true要么false,引入NULL后,我們由二值邏輯變為三值邏輯。

NOT NULL

不允許對應的屬性值為空。

Unique

不允許屬性值重復,即列值不能重復。

DEFAULT

如果屬性值為空,則填個默認值上去。

一般默認值有三種情況:

第一種是事先定義好的字符,比如如果為空就補個0上去。

第二種是置為空格字符串,把NULL變成長度為0的字符串或者變成某一個不可能出現的值。

第三種就是變成NULL,如果你要這么做,那你 前面不能再加一個NOT NULL不然語義矛盾。

CHECK

利用他,可以說明屬性值的范圍,也就是加限制條件,比如人的年齡不可能為負數,你可以加age>0。

總結

以上是生活随笔為你收集整理的数据库杂谈(二)——数据模型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。