1. 程式人生 > >2、【資料庫技術】關係資料庫

2、【資料庫技術】關係資料庫

二、關係資料庫

1、相關名詞

    關係資料庫系統是支援關係模型的資料庫系統,關係模型由三部分組成:資料結構、關係操作集合、關係的完整性。

    在關係模型中最重要的資料結構就是關係,關係就是一張表,設計關係就是設計一張表,元組就是表中的一行,屬性是表中的一列,屬性名是給屬性起的名字。

    (1)屬性:即實體的特徵

    (2)域:每個屬性的取值範圍構成的集合。

    (3)候選鍵:關係中能唯一標識一個元組的某一屬性或屬性組的的最小組合(即不含多餘屬性)。

    (4)主碼:即主鍵,在一個關係的若干候選鍵中隨意指定一個作為主鍵,不能夠重複,不能為空,如果為空,則稱失去了實體完整性。

    (6)外碼:外來鍵,如果一個表格中的資料來源於另一個表,那麼稱這個列為外來鍵。外來鍵錯誤稱為失去了引用完整性。

    資料庫的完整性:實體完整性、參照完整性、使用者自定義完整性。

    實體完整性:要求每個關係(表)有且僅有一個主鍵。每一個主鍵值必須是唯一,而且不允許為“空”(NULL)或重複。

    參照完整性:對於永久關係的表,在更新、插入或刪除記錄時,如果只修改其一,就會影響資料的完整性。

    使用者自定義完整性:就是針對某一具體應用的資料必須滿足的語義約束。包括非空、 唯一和布林條件約束三種情況。

    關係模式是對關係的描述,五元組形式化表示為:R(U, D, DOM, F)其中:
    R — 關係名
    U — 組成該關係的屬性名
    D — 屬性組U中屬性所來自的域
    DOM — 屬性向域的對映關係
    F — 屬性間的資料依賴關係集合

    關係資料庫語言分為**關係代數、關係演算和結構化查詢語言(SQL)**三大類。

    五種基本的關係代數運算:選擇、投影、並、差、笛卡爾積。笛卡爾成績、選擇和投影運算如下:

    關係演算包括元組關係演算和域關係演算。

    關係資料庫中的函式依賴關係:設R(U)是屬性集U上的關係模式,X、Y是U的子集,對於R(U)的任意一個關係r,r中不能存在兩個元組在X上的屬性值相等,而在Y上的屬性值不等,則稱X函式確定Y或者Y函式依賴X,記做:X -> Y。

    三個基本定義

    (1)完全函式依賴:在R(U)中,如果X -> Y,並且對於X的任何真子集X`,都有X` not->Y,則稱為Y對X完全依賴,記做:X->(F)Y。

    (2)部分函式依賴:如果X->Y,當Y不完全依賴於X,則稱Y對X部分函式依賴,記做:X ->§Y。

    (3)傳遞函式依賴:在R(U)中,如果X->Y,(Y不是X的子集),Y not->X,Y->Z,則稱Z對X傳遞函式依賴,記做:X->Z。

    第一正規化(1NF):在關係模型中,當且僅當所有域只包含原子值,即每個分量都是不可再分的資料項,則稱實體E是第一正規化。

    第二正規化(2NF):當且僅當實體E是第一正規化,且每一個非主鍵屬性完全依賴主鍵(沒有不完全依賴),則稱實體E為第二正規化。

    第三正規化:當且僅當實體E是第二正規化,且E中沒有非主鍵屬性傳遞依賴於碼時,則稱實體E為第三正規化。

    如果一個關係模式是單關鍵字,則沒有部分函式依賴問題,肯定是2NF。

    映象技術:是指將資料庫或關鍵資料複製到另一磁碟上,並在資料庫更新時保持映象資料與主資料庫同步。

2、索引

    在說資料庫索引之前,我們先介紹幾個其他的知識點:

(1)資料庫結構

    資料庫結構是指在計算機的儲存裝置上合理存放的相關聯的有結構的資料集合的結構。一個數據庫結構含有各種成分,包括資料庫、資料表、欄位、過濾器等。

資料庫(Database)

    一個數據庫由一個或一組資料表組成。每個資料庫都以檔案的形式存放在磁碟上,即對應於一個物理檔案。不同的資料庫,與物理檔案對應的方式也不一樣。

資料表(Table)

    簡稱表,由一組資料記錄組成,資料庫中的資料是以表為單位進行組織的。一個表是一組相關的按行排列的資料;每個表中都含有相同型別的資訊。表實際上是一個二維表格,例如,一個班所有學生的考試成績,可以存放在一個表中,表中的每一行對應一個學生,這一行包括學生的學號,姓名及各門課程成績。

記錄(Record)

    表中的每一行稱為一個記錄,它由若干個欄位組成。

欄位(Field)

    也稱域。表中的每一列稱為一個欄位。每個欄位都有相應的描述資訊,如資料型別、資料寬度等。

(2)資料庫索引

    索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定資訊。例如這樣一個查詢:select * from table1 where id=10000。如果沒有索引,必須遍歷整個表,直到ID等於10000的這一行被找到為止;有了索引之後(必須是在ID這一列上建立的索引),即可在索引中查詢。

(1)概念
    為了提高訪問資料庫的效率,可以對資料庫使用索引。當資料庫較大時,為了查詢指定的記錄,則使用索引和不使用索引的效率有很大差別。索引實際上是一種特殊型別的表,其中含有關鍵欄位的值(由使用者定義)和指向實際記錄位置的指標,這些值和指標按照特定的順序(也由使用者定義)儲存,從而可以以較快的速度查詢到所需要的資料記錄。

    資料庫索引的內部實現是採用B+樹來實現的,B+樹是一種【平衡樹】,相關的內容可以參見我的另一篇部落格:https://www.cnblogs.com/Long-w/p/9778102.html。

(2)索引的分類
    索引分為聚簇索引和非聚簇索引兩種,聚簇索引 是按照資料存放的物理位置為順序的,而非聚簇索引就不一樣了;聚簇索引能提高多行檢索的速度,而非聚簇索引對於單行的檢索很快。

    根據資料庫的功能,可以在資料庫設計器中建立三種索引:唯一索引、主鍵索引和聚集索引。

唯一索引

    唯一索引是不允許其中任何兩行具有相同索引值的索引。當現有資料中存在重複的鍵值時,大多數資料庫不允許將新建立的唯一索引與表一起儲存。資料庫還可能防止新增將在表中建立重複鍵值的新資料。例如,如果在employee表中職員的姓(lname)上建立了唯一索引,則任何兩個員工都不能同姓。

主鍵索引

    資料庫表經常有一列或多列組合,其值唯一標識表中的每一行。該列稱為表的主鍵。在資料庫關係圖中為表定義主鍵將自動建立主鍵索引,主鍵索引是唯一索引的特定型別。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對資料的快速訪問。

聚集索引

    在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個聚集索引。如果某索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的資料訪問速度。聚集索引和非聚集索引的區別,如字典預設按字母順序排序,讀者如知道某個字的讀音可根據字母順序快速定位。因此聚集索引和表的內容是在一起的。如讀者需查詢某個生僻字,則需按字典前面的索引,舉例按偏旁進行定位,找到該字對應的頁數,再開啟對應頁數找到該字。這種通過兩個地方而查詢到某個字的方式就如非聚集索引。

優點

    在設計資料庫時,通過建立一個惟一的索引,能夠在索引和資訊之間形成一對一的對映式的對應關係,增加資料的惟一性特點。

    能提高資料的搜尋及檢索速度,符合資料庫建立的初衷。

    能夠加快表與表之間的連線速度,這對於提高資料的參考完整性方面具有重要作用。

    在資訊檢索過程中,若使用分組及排序子句進行時,通過建立索引能有效的減少檢索過程中所需的分組及排序時間,提高檢索效率。

    建立索引之後,在資訊查詢過程中可以使用優化隱藏器,這對於提高整個資訊檢索系統的效能具有重要意義。

缺點

    在資料庫建立過程中,需花費較多的時間去建立並維護索引,特別是隨著資料總量的增加,所花費的時間將不斷遞增。

    在資料庫中建立的索引需要佔用一定的物理儲存空間,這其中就包括資料表所佔的資料空間以及所建立的每一個索引所佔用的物理空間,如果有必要建立起聚簇索引,所佔用的空間還將進一步的增加

    在對錶中的資料進行修改時,例如對其進行增加、刪除或者是修改操作時,索引還需要進行動態的維護,這給資料庫的維護速度帶來了一定的麻煩。

(3)索引的建立

    在SQL語言中,建立索引使用CREATE INDEX語句,其一般格式如下:

    create [unique][cluster] index <索引名>
    on <表名><列名>[<次序>][,<列名>[<次序>]] ...;

    其中,<表名>是要建立索引的基本表的名字。索引可以建立在該表的一列或多列上,各列名之間用逗號分隔。每個<列名>後面,還可以用<次序>指定索引值的排列次序,可選ASC(升序)或DESC(降序),預設值為ASC。
    unique表明此索引的每一個索引值只對應唯一的資料記錄。
    cluster表示要建立的索引是聚簇索引。所謂聚簇索引是指索引項的順序與表中記錄的物理順序一致的索引組織。
【示例1】

    create cluster index studentsname on student(sname);

    將會在student表的sname(姓名)列上建立一個聚簇索引,而且student表中的記錄將按照sname值的升序存放。

【示例2】

    create unique index stusno on student(sno);
    create unique index coucno on course(cno);
    create unique index scno on sc(sno ASC, cno DESC);

(4)索引的刪除
    索引一旦建立,就由系統使用和維護它,不需要使用者干預。建立索引是為了減少查詢操作的時間,當如果資料增刪改頻繁,系統會花費許多事件來維護索引,從而降低了查詢的效率,這時,可以刪除一些不必要的索引。
    在SQL中,刪除索引使用DROP INDEX語句,其一般格式如下:

    drop index <索引名>;

【示例】

    drop index studentname;

    刪除索引時,系統會同時從資料字典中刪去有關該索引的描述。

3、檢視

    檢視(子查詢):是從一個或多個表匯出的虛擬的表,其內容由查詢定義具有普通表的結構,但是不實現資料儲存。

    對檢視的修改:單表檢視一般用於查詢和修改,會改變基本表的資料,多表檢視一般用於查詢,不會改變基本表的資料。

檢視的建立及使用:

    //建立檢視
    create or replace view v_student as select * from student;
    //從檢視中檢索資料
    select * from v_student;
    //刪除檢視
    drop view v_student;

作用

①簡化了操作,把經常使用的資料定義為檢視

    我們在使用查詢時,在很多時候我們要使用聚合函式,同時還要 顯示其它欄位的資訊,可能還會需要關聯到其它表,這時寫的語句可能會很長,如果這個動作頻繁發生的話,我們可以建立檢視,這以後,我們只需要select * from view就可以啦,這樣很方便。

②安全性,使用者只能查詢和修改能看到的資料

    因為檢視是虛擬的,物理上是不存在的,只是儲存了資料的集合,我們可以將基表中重要的欄位資訊,可以不通過檢視給使用者,檢視是動態的資料的集合,資料是隨著基表的更新而更新。同時,使用者對檢視不可以隨意的更改和刪除,可以保證資料的安全性。

③邏輯上的獨立性,遮蔽了真實表的結構帶來的影響

    檢視可以使應用程式和資料庫表在一定程度上獨立。如果沒有檢視,應用一定是建立在表上的。有了檢視之後,程式可以建立在檢視之上,從而程式與資料庫表被檢視分割開來。

缺點:

①效能差

    資料庫必須把檢視查詢轉化成對基本表的查詢,如果這個檢視是由一個複雜的多表查詢所定義,那麼,即使是檢視的一個簡單查詢,資料庫也要把它變成一個複雜的結合體,需要花費一定的時間。

②修改限制

    當用戶試圖修改檢視的某些資訊時,資料庫必須把它轉化為對基本表的某些資訊的修改,對於簡單的檢視來說,這是很方便的,但是,對於比較複雜的試圖,可能是不可修改的。

    在定義資料庫物件時,不能不加選擇地來定義檢視,應該權衡檢視的優點和缺點,合理地定義檢視。