1. 程式人生 > >[轉]資料庫原理筆記 資料庫原理筆記

[轉]資料庫原理筆記 資料庫原理筆記

此為轉載文章,僅做記錄使用,方便日後檢視,原文連結:http://www.cnblogs.com/defias/p/3331740.html

 

資料庫原理筆記

 

資料庫概念

資料庫(Database,簡稱DB)是長期儲存在計算機內、有組織的、可共享的大量資料的集合。

  1. 資料庫系統的特點
  • 資料結構化
  • 資料的共享性高,冗餘度低,易擴充
  • 資料獨立性高
  • 資料由DBMS統一管理和控制
  1. 兩大類資料模型
  • 概念模型也稱資訊模型,它是按使用者的觀點來對資料和資訊建模,用於資料庫設計。
  • 邏輯模型和物理模型,邏輯模型主要包括網狀模型、層次模型、關係模型、面向物件模型等,按計算機系統的觀點對資料建模,用於DBMS實現。物理模型是對資料最底層的抽象,描述資料在系統內部的表示方式和存取方法,在磁碟或磁帶上的儲存方式和存取方法。
  1. 關係資料庫
  • 關係資料庫系統採用關係模型作為資料的組織方式,在使用者觀點下,關係模型中資料的邏輯結構是一張二維表,它由行和列組成。關係的每一個分量必須是一個不可分的資料項, 不允許表中還有表。
  1. 資料庫系統的三級模式結構
  • 模式(Schema)
  • 外模式(External Schema)
  • 內模式(Internal Schema)
  1. 關係模式
  • 關係模式可以形式化地表示為:

    R(U,D,DOM,F)

    R 關係名

    U 組成該關係的屬性名集合

    D 屬性組U中屬性所來自的域

    DOM 屬性向域的映象集合

    F 屬性間的資料依賴關係集合

  1. 實體完整性規則(Entity Integrity)
  • 若屬性A是基本關係R的主屬性,則屬性A不能取空值;關係模型中以主碼作為唯一性標識。
  1. 參照完整性規則
  • 若屬性(或屬性組)F是基本關係R的外碼它與基本關係S的主碼Ks相對應(基本關係R和S不一定是不同的關係),則對於R中每個元組在F上的值必須為:

    • 或者取空值(F的每個屬性值均為空值)
    • 或者等於S中某個元組的主碼值
  1. 關係代數運算子

關係資料庫標準語言SQL

SQL(Structured Query Language)結構化查詢語言,是關係資料庫的標準語言。集資料定義語言(DDL),資料操縱語言(DML),資料控制語言(DCL)功能於一體。可以獨立完成資料庫生命週期中的全部活動:

  • 定義關係模式,插入資料,建立資料庫;
  • 對資料庫中的資料進行查詢和更新;
  • 資料庫重構和維護
  • 資料庫安全性、完整性控制等
  1. 能完成核心功能9個動詞

  1. SQL的基本概念

  1. 資料定義

  • 定義模式

    • 定義模式實際上定義了一個名稱空間
    • 在這個空間中可以定義該模式包含的資料庫物件,例如基本表、檢視、索引等。
    • 在CREATE SCHEMA中可以接受CREATE TABLE,CREATE VIEW和GRANT子句。

      CREATE SCHEMA <模式名> AUTHORIZATION <使用者名稱>[<表定義子句>|<檢視定義子句>|<授權定義子句>]

  • 刪除模式

    DROP SCHEMA <模式名> <CASCADE|RESTRICT>

    • CASCADE(級聯)

    刪除模式的同時把該模式中所有的資料庫物件全部刪除

    • RESTRICT(限制)

    如果該模式中定義了下屬的資料庫物件(如表、檢視等),則拒絕該刪除語句的執行。當該模式中沒有任何下屬的物件時 才能執行。

  • 定義基本表

    CREATE TABLE <表名>

    (<列名> <資料型別>[ <列級完整性約束條件> ]

    [,<列名> <資料型別>[ <列級完整性約束條件>] ] …

    [,<表級完整性約束條件> ] );

    如果完整性約束條件涉及到該表的多個屬性列,則必須定義在表級上,否則既可以定義在列級也可以定義在表級。

  • 資料型別

  • 模式與表

    • 每一個基本表都屬於某一個模式
    • 一個模式包含多個基本表
    • 定義基本表所屬模式
    • 方法一:在表名中明顯地給出模式名

      Create table "S-T".Student(......); /*模式名為 S-T*/

      Create table "S-T".Cource(......);

      Create table "S-T".SC(......);

    • 方法二:在建立模式語句中同時建立表
    • 方法三:設定所屬的模式
  • 修改基本表

    ALTER TABLE <表名>

    [ ADD <新列名> <資料型別> [ 完整性約束 ] ]

    [ DROP <完整性約束名> ]

    [ ALTER COLUMN<列名> <資料型別> ];

  • 刪除基本表

    DROP TABLE <表名>[RESTRICT| CASCADE];

    • RESTRICT:刪除表是有限制的。

      • 欲刪除的基本表不能被其他表的約束所引用
      • 如果存在依賴該表的物件,則此表不能被刪除
    • CASCADE:刪除該表沒有限制。

      • 在刪除基本表的同時,相關的依賴物件一起刪除
  • 索 引

    • RDBMS中索引一般採用B+樹、HASH索引來實現

      • B+樹索引具有動態平衡的優點
      • HASH索引具有查詢速度快的特點
    • 採用B+樹,還是HASH索引 則由具體的RDBMS來決定
    • 索引是關係資料庫的內部實現技術,屬於內模式的範疇
    • CREATE INDEX語句定義索引時,可以定義索引是唯一索引、非唯一索引或聚簇索引
  • 建立索引

    • 語句格式

      CREATE [UNIQUE] [CLUSTER] INDEX <索引名>

      ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);

      • 在最經常查詢的列上建立聚簇索引以提高查詢效率
      • 一個基本表上最多隻能建立一個聚簇索引
      • 經常更新的列不宜建立聚簇索引
  • 刪除索引

    DROP INDEX <索引名>;

  1. 資料查詢
  • 語句格式

    SELECT [ALL|DISTINCT] <目標列表達式>[,<目標列表達式>] …

    FROM <表名或檢視名>[, <表名或檢視名> ] …

    [ WHERE <條件表示式> ]

    [ GROUP BY <列名1> [ HAVING <條件表示式> ] ]

    [ ORDER BY <列名2> [ ASC|DESC ] ];

  • 單表查詢

    • 選擇表中的若干列
    • 選擇表中的若干元組
    • ORDER BY子句

      • 可以按一個或多個屬性列排序
      • 升序:ASC;降序:DESC;預設值為升序
      • 當排序列含空值時
      • ASC:排序列為空值的元組最後顯示
      • DESC:排序列為空值的元組最先顯示
    • 聚集函式

      • 計數
      • COUNT([DISTINCT|ALL] *)
      • COUNT([DISTINCT|ALL] <列名>)
      • 計算總和
      • SUM([DISTINCT|ALL] <列名>)   
      • 計算平均值
      • AVG([DISTINCT|ALL] <列名>)
      • 最大最小值
      • MAX([DISTINCT|ALL] <列名>)
      • MIN([DISTINCT|ALL] <列名>)
    • GROUP BY子句
  • 查詢的一般規律:先依據條件查詢得到結果集,再將分組後的結果集篩選並排序。
  • HAVING短語與WHERE子句的區別:

    • 作用物件不同
    • WHERE子句作用於基表或檢視,從中選擇滿足條件的元組
    • HAVING短語作用於組,從中選擇滿足條件的組。
  • 常用的查詢條件

查 詢 條 件

謂 詞

比 較

=,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比較運算子

確定範圍

BETWEEN AND,NOT BETWEEN AND

確定集合

IN,NOT IN

字元匹配

LIKE,NOT LIKE

空 值

IS NULL,IS NOT NULL

多重條件(邏輯運算)

AND,OR,NOT

  • ESCAPE '\' 表示" \" 為換碼字元
  • 連線查詢

    • 等值與非等值連線查詢
    • 自身連線

      • 一個表與其自己進行連線

        • 需要給表起別名以示區別
        • 由於所有屬性名都是同名屬性,因此必須使用別名字首
    • 外連線

      • 外連線與普通連線的區別

        • 普通連線操作只輸出滿足連線條件的元組
        • 外連線操作以指定表為連線主體,將主體表中不滿足連線條件的元組一併輸出
      • 左外連線

        • 列出左邊關係(如本例Student)中所有的元組
      • 右外連線

        • 列出右邊關係中所有的元組
    • 複合條件連線
  • 巢狀查詢

    一個SELECT-FROM-WHERE語句稱為一個查詢塊

    將一個查詢塊巢狀在另一個查詢塊的WHERE子句或HAVING短語的條件中的查詢稱為巢狀查詢

    • 子查詢的限制

      • 不能使用ORDER BY子句

        • 層層巢狀方式反映了 SQL語言的結構化
        • 有些巢狀查詢可以用連線運算替代
    • 巢狀查詢求解方法

      • 子查詢的查詢條件不依賴於父查詢

        • 由裡向外 逐層處理。即每個子查詢在上一級查詢處理之前求解,子查詢的結果用於建立其父查詢的查詢條件。
        • 首先取外層查詢中表的第一個元組,根據它與內層查詢相關的屬性值處理內層查詢,若WHERE子句返回值為真,則取此元組放入結果表
        • 然後再取外層表的下一個元組
        • 重複這一過程,直至外層表全部檢查完為止
    • 帶有比較運算子的子查詢

      • 當能確切知道內層查詢返回單值時,可用比較運算子(>,<,=,>=,<=,!=或< >)。
      • 與ANY或ALL謂詞配合使用
    • 帶有ANY(SOME)或ALL謂詞的子查詢

      • 需要配合使用比較運算子

        • > ANY    大於子查詢結果中的某個值
        • > ALL    大於子查詢結果中的所有值
        • < ANY    小於子查詢結果中的某個值
        • < ALL    小於子查詢結果中的所有值
        • >= ANY    大於等於子查詢結果中的某個值
        • >= ALL    大於等於子查詢結果中的所有值
        • <= ANY    小於等於子查詢結果中的某個值
        • <= ALL    小於等於子查詢結果中的所有值
        • = ANY    等於子查詢結果中的某個值
        • =ALL    等於子查詢結果中的所有值(通常沒有實際意義)
        • !=(或<>)ANY    不等於子查詢結果中的某個值
        • !=(或<>)ALL    不等於子查詢結果中的任何一個值
    • 帶有EXISTS謂詞的子查詢

      • 1. EXISTS謂詞,存在量詞$
      • 帶有EXISTS謂詞的子查詢不返回任何資料,只產生邏輯真值"true"或邏輯假值"false"。

        • 若內層查詢結果非空,則外層的WHERE子句返回真值
        • 若內層查詢結果為空,則外層的WHERE子句返回假值
      • 由EXISTS引出的子查詢,其目標列表達式通常都用* ,因為帶EXISTS的子查詢只返回真值或假值,給出列名無實際意義
      • 2. NOT EXISTS謂詞

        • 若內層查詢結果非空,則外層的WHERE子句返回假值
        • 若內層查詢結果為空,則外層的WHERE子句返回真值
  • 集合查詢

    • 集合操作的種類

      • 並操作UNION
      • 交操作INTERSECT
      • 差操作EXCEPT
    • 參加集合操作的各查詢結果的列數必須相同;對應項的資料型別也必須相同
  • SELECT語句的一般格式

    SELECT [ALL|DISTINCT]

    <目標列表達式> [別名] [ ,<目標列表達式> [別名]] …

    FROM <表名或檢視名> [別名]

    [ ,<表名或檢視名> [別名]] …

    [WHERE <條件表示式>]

    [GROUP BY <列名1>

    [HAVING <條件表示式>]]

    [ORDER BY <列名2> [ASC|DESC]

  1. 資料更新
  • 插入資料

    • 插入元組

      • 語句格式

          INSERT

          INTO <表名> [(<屬性列1>[,<屬性列2 >…)]

          VALUES (<常量1> [,<常量2>] … )

    • 插入子查詢結果

      • 語句格式

      INSERT

      INTO <表名> [(<屬性列1> [,<屬性列2>… )]

      子查詢;

      • 子查詢

      SELECT子句目標列必須與INTO子句匹配

      • 值的個數
      • 值的型別
  1. 修改資料
  • 語句格式

    UPDATE <表名>

    SET <列名>=<表示式>[,<列名>=<表示式>]…

    [WHERE <條件>];

  1. 刪除資料
  • 語句格式

    DELETE

    FROM <表名>

    [WHERE <條件>];

  1. 視 圖
  • 虛表,是從一個或幾個基本表(或檢視)匯出的表
  • 只存放檢視的定義,不存放檢視對應的資料
  • 基表中的資料發生變化,從檢視中查詢出的資料也隨之改變
  • 建立檢視

    • 語句格式

    CREATE VIEW

    <檢視名> [(<列名> [,<列名>]…)]

    AS <子查詢>

    [WITH CHECK OPTION];

  • 刪除檢視

    DROP VIEW <檢視名>;

  • 查詢檢視

    • 使用者角度:查詢檢視與查詢基本表相同
  • 檢視的作用
  1. 檢視能夠簡化使用者的操作
  2. 檢視使使用者能以多種角度看待同一資料
  3. 檢視對重構資料庫提供了一定程度的邏輯獨立性
  4. 檢視能夠對機密資料提供安全保護
  5. 適當的利用檢視可以更清晰的表達查詢

資料庫安全性

  1. 資料庫安全性控制的常用方法
  • 使用者標識和鑑定
  • 存取控制
  • 檢視
  • 審計
  • 密碼儲存
  1. 關係資料庫系統中存取控制物件

  2. 授權與回收
  • GRANT

    • GRANT語句的一般格式:

    GRANT <許可權>[,<許可權>]...

    [ON <物件型別> <物件名>]

    TO <使用者>[,<使用者>]...

    [WITH GRANT OPTION];

  • 語義:將對指定操作物件的指定操作許可權授予指定的使用者
  • WITH GRANT OPTION子句

    • WITH GRANT OPTION子句:

      • 指定:可以再授予
      • 沒有指定:不能傳播
    • 不允許迴圈授權
  • REVOKE

    • 授予的許可權可以由DBA或其他授權者用REVOKE語句收回
    • REVOKE語句的一般格式為:

    REVOKE <許可權>[,<許可權>]...

    [ON <物件型別> <物件名>]

    FROM <使用者>[,<使用者>]...;

  • 建立資料庫模式的許可權

    • DBA在建立使用者時實現
    • CREATE USER語句格式

    CREATE USER <username>

    [WITH][DBA | RESOURCE | CONNECT]

  1. 資料庫角色
  • 資料庫角色:被命名的一組與資料庫操作相關的許可權

    • 角色是許可權的集合
    • 可以為一組具有相同許可權的使用者建立一個角色
    • 簡化授權的過程
  • 角色的建立

    CREATE ROLE <角色名>

  • 給角色授權

    GRANT <許可權>[,<許可權>]…

    ON <物件型別>物件名

    TO <角色>[,<角色>]…

  • 將一個角色授予其他的角色或使用者

    GRANT <角色1>[,<角色2>]…

    TO <角色3>[,<使用者1>]…

    [WITH ADMIN OPTION]

  • 角色許可權的收回

    REVOKE <許可權>[,<許可權>]…

    ON <物件型別> <物件名>

    FROM <角色>[,<角色>]…

資料庫完整性

  • 資料庫的完整性

    • 資料的正確性和相容性
  • 資料的完整性和安全性是兩個不同概念

    • 資料的完整性

      • 防止資料庫中存在不符合語義的資料,也就是防止資料庫中存在不正確的資料
      • 防範物件:不合語義的、不正確的資料
    • 資料的安全性

      • 保護資料庫防止惡意的破壞和非法的存取
      • 防範物件:非法使用者和非法操作
  • 實體完整性

    • 關係模型的實體完整性

      • CREATE TABLE中用PRIMARY KEY定義
    • 單屬性構成的碼有兩種說明方法

      • 定義為列級約束條件
      • 定義為表級約束條件
    • 對多個屬性構成的碼只有一種說明方法

      • 定義為表級約束條件
    • 插入或對主碼列進行更新操作時,RDBMS按照實體完整性規則自動進行檢查。包括:
  1. 檢查主碼值是否唯一,如果不唯一則拒絕插入或修改
  2. 檢查主碼的各個屬性是否為空,只要有一個為空就拒絕插入或修改
  • 檢查記錄中主碼值是否唯一的一種方法是進行全表掃描
  • 參照完整性

    • 關係模型的參照完整性定義

      • 在CREATE TABLE中用FOREIGN KEY短語定義哪些列為外碼
      • 用REFERENCES短語指明這些外碼參照哪些表的主碼

        例如,關係SC中一個元組表示一個學生選修的某門課程的成績,(Sno,Cno)是主碼。Sno,Cno分別參照引用Student表的主碼和Course表的主碼

        [例3] 定義SC中的參照完整性

        CREATE TABLE SC

        (Sno CHAR(9) NOT NULL,

        Cno CHAR(4) NOT NULL,

        Grade SMALLINT,

        PRIMARY KEY (Sno, Cno), /*在表級定義實體完整性*/

        FOREIGN KEY (Sno) REFERENCES Student(Sno),

        /*在表級定義參照完整性*/

        FOREIGN KEY (Cno) REFERENCES Course(Cno)

        /*在表級定義參照完整性*/

        );

  • 使用者定義的完整性

    • 屬性上的約束條件的定義

      • CREATE TABLE時定義
      • 列值非空(NOT NULL)
      • 列值唯一(UNIQUE)
      • 檢查列值是否滿足一個布林表示式(CHECK)
    • 屬性上的約束條件檢查和違約處理

      • 插入元組或修改屬性的值時,RDBMS檢查屬性上的約束條件是否被滿足
      • 如果不滿足則操作被拒絕執行
    • 元組上的約束條件的定義

      • 在CREATE TABLE時可以用CHECK短語定義元組上的約束條件,即元組級的限制
      • 同屬性值限制相比,元組級的限制可以設定不同屬性之間的取值的相互約束條件
    • 元組上的約束條件檢查和違約處理

      • 插入元組或修改屬性的值時,RDBMS檢查元組上的約束條件是否被滿足
      • 如果不滿足則操作被拒絕執行
  • 完整性約束命名子句

    • CONSTRAINT 約束

      CONSTRAINT <完整性約束條件名>

      [PRIMARY KEY短語

      |FOREIGN KEY短語

      |CHECK短語]

    • 使用ALTER TABLE語句修改表中的完整性限制
    • SQL支援域的概念,並可以用CREATE DOMAIN語句建立一個域以及該域應該滿足的完整性約束條件。
  • 觸發器

    • 定義觸發器

      • CREATE TRIGGER語法格式

        CREATE TRIGGER <觸發器名>

        {BEFORE | AFTER} <觸發事件> ON <表名>

        FOR EACH {ROW | STATEMENT}

        [WHEN <觸發條件>]

        <觸發動作體>

    • 定義觸發器的語法說明:

      • 1. 建立者:表的擁有者
      • 2. 觸發器名
      • 3. 表名:觸發器的目標表
      • 4. 觸發事件:INSERT、DELETE、UPDATE
      • 5. 觸發器型別

        • 行級觸發器(FOR EACH ROW)
        • 語句級觸發器(FOR EACH STATEMENT)
      • 6. 觸發條件

        • 觸發條件為真
        • 省略WHEN觸發條件
      • 7. 觸發動作體

        • 觸發動作體可以是一個匿名PL/SQL過程塊
        • 也可以是對已建立儲存過程的呼叫
    • 啟用觸發器

      • 觸發器的執行,是由觸發事件啟用的,並由資料庫伺服器自動執行
      • 一個數據表上可能定義了多個觸發器

        • 同一個表上的多個觸發器啟用時遵循如下的執行順序:
        • (1) 執行該表上的BEFORE觸發器;
        • (2) 啟用觸發器的SQL語句;
        • (3) 執行該表上的AFTER觸發器。
    • 刪除觸發器

      • 刪除觸發器的SQL語法:

        DROP TRIGGER <觸發器名> ON <表名>;

      • 觸發器必須是一個已經建立的觸發器,並且只能由具有相應許可權的使用者刪除。

關係資料理論

  • 資料依賴

    • 資料依賴的型別

      • 函式依賴(Functional Dependency,簡記為FD)
      • 多值依賴(Multivalued Dependency,簡記為MVD)
      • 其他
    • 資料依賴對關係模式的影響

      • "好"的模式:

        • 不會發生插入異常、刪除異常、更新異常,
        • 資料冗餘應儘可能少
        • 原因:由存在於模式中的某些資料依賴引起的
        • 解決方法:通過分解關係模式來消除其中不合適的資料依賴
    • 函式依賴

      • 定義6.1 設R(U)是一個屬性集U上的關係模式,X和Y是U的子集。若對於R(U)的任意一個可能的關係r,r中不可能存在兩個元組在X上的屬性值相等, 而在Y上的屬性值不等, 則稱 "X函式確定Y" 或 "Y函式依賴於X",記作X→Y。
      • 在關係模式R(U)中,對於U的子集X和Y,

        • 如果X→Y,但Y Í X,則稱X→Y是非平凡的函式依賴
        • 若X→Y,但Y Í X, 則稱X→Y是平凡的函式依賴
        • 若X→Y,則X稱為這個函式依賴的決定屬性組,也稱為決定因素(Determinant)。
        • 若X→Y,Y→X,則記作X←→Y。
        • 若Y不函式依賴於X,則記作X→Y。
    • 完全函式依賴與部分函式依賴

      • 定義6.2 在R(U)中,如果X→Y,並且對於X的任何一個真子集X',都有X' Y, 則稱Y對X完全函式依賴,記作X→F Y 。 若X→Y,但Y不完全函式依賴於X,則稱Y對X部分函式依賴,記作X→P Y。
    • 傳遞函式依賴

      • 定義6.3 在R(U)中,如果X→Y,(Y ÍX) ,Y→X Y→Z, 則稱Z對X傳遞函式依賴。記為:X →傳遞 Z
      • 注: 如果Y→X, 即X←→Y,則Z直接依賴於X。
      • 定義6.4 設K為R<U,F>中的屬性或屬性組合。若K U, 則K稱為R的侯選碼(Candidate Key)。若候選碼多於一個,則選定其中的一個做為主碼(Primary Key)。
      • 主屬性與非主屬性

        • 包含在任何一個候選碼中的屬性 ,稱為主屬性(Prime attribute)
        • 不包含在任何碼中的屬性稱為非主屬性(Nonprime attribute)或非碼屬性(Non-key attribute)
      • 全碼

        • 整個屬性組是碼,稱為全碼(All-key)
    • 外部碼

      • 定義6.5 關係模式 R 中屬性或屬性組X 並非 R的碼,但 X 是另一個關係模式的碼,則稱 X 是R 的外部碼(Foreign key)也稱外碼
  • 正規化

    • 正規化是符合某一種級別的關係模式的集合
    • 關係資料庫中的關係必須滿足一定的要求。滿足不同程度要求的為不同正規化
    • 正規化的種類:   

      • 第一正規化(1NF)
      • 第二正規化(2NF)
      • 第三正規化(3NF)
      • BC正規化(BCNF)
      • 第四正規化(4NF)
      • 第五正規化(5NF)
    • 各種正規化之間存在聯絡:
    • 某一關係模式R為第n正規化,可簡記為R∈nNF。
    • 一個低一級正規化的關係模式,通過模式分解可以轉換為若干個高一級正規化的關係模式的集合,這種過程就叫規範化
    • 1NF

      • 1NF的定義

        • 如果一個關係模式R的所有屬性都是不可分的基本資料項,則R∈1NF
      • 第一正規化是對關係模式的最起碼的要求。不滿足第一正規化的資料庫模式不能稱為關係資料庫
      • 但是滿足第一正規化的關係模式並不一定是一個好的關係模式
    • 2NF

      • 2NF的定義

        •     定義6.6 若R∈1NF,且每一個非主屬性完全函式依賴於碼,則R∈2NF。
    • 3NF

      • 3NF的定義

        • 定義6.7 關係模式R<U,F> 中若不存在這樣的碼X、屬性組Y及非主屬性Z(Z Í Y), 使得X→Y,Y→Z成立, Y → X,則稱R<U,F> ∈ 3NF。
        • 若R∈3NF,則每一個非主屬性既不部分依賴於碼也不傳遞依賴於碼
    • BC正規化(BCNF)

      • 定義6.8 關係模式R<U,F>∈1NF,若X→Y且Y Í X時,X必含有碼,則R<U,F> ∈BCNF。
      • 等價於:每一個決定屬性因素都包含碼
      • 若R∈BCNF

        • 所有非主屬性對每一個碼都是完全函式依賴
        • 所有的主屬性對每一個不包含它的碼,也是完全函式依賴
        • 沒有任何屬性完全函式依賴於非碼的任何一組屬性
      • R ∈BCNF  R ∈3NF
  • 多值依賴

    • 定義6.9

      • 設R(U)是一個屬性集U上的一個關係模式, X、 Y和Z是U的子集,並且Z=U-X-Y。關係模式R(U)中多值依賴 X→→Y成立,當且僅當對R(U)的任一關係r,給定的一對(x,z)值,有一組Y的值,這組值僅僅決定於x值而與z值無關
    • 多值依賴的另一個等價的形式化的定義:

      • 在R(U)的任一關係r中,如果存在元組t,s 使得t[X]=s[X],那麼就必然存在元組 w,vÎ r,(w,v可以與s,t相同),使得w[X]=v[X]=t[X],而w[Y]=t[Y],w[Z]=s[Z],v[Y]=s[Y],v[Z]=t[Z](即交換s,t元組的Y值所得的兩個新元組必在r中),則Y多值依賴於X,記為X→→Y。 這裡,X,Y是U的子集,Z=U-X-Y。
    • 平凡多值依賴和非平凡的多值依賴

      • 若X→→Y,而Z=φ,則稱X→→Y為平凡的多值依賴
      • 否則稱X→→Y為非平凡的多值依賴
    • 多值依賴的性質

      • (1)多值依賴具有對稱性。若X→→Y,則X→→Z,其中Z=U-X-Y
      • (2)多值依賴具有傳遞性。若X→→Y,Y→→Z, 則X→→Z –Y
      • (3)函式依賴是多值依賴的特殊情況。若X→Y,則X→→Y。
      • (4)若X→→Y,X→→Z,則X→→YÈ Z。
      • (5)若X→→Y,X→→Z,則X→→Y∩Z。
      • (6)若X→→Y,X→→Z,則X→→Y-Z,X→→Z -Y。
    • 多值依賴與函式依賴的區別

      • (1) 多值依賴的有效性與屬性集的範圍有關
      • (2)

        • 若函式依賴X→Y在R(U)上成立,則對於任何Y' Ì Y均有X→Y' 成立
        • 多值依賴X→→Y若在R(U)上成立,不能斷言對於任何Y' Ì Y有X→→Y' 成立
    • 4NF

      • 定義6.10 關係模式R<U,F>∈1NF,如果對於R的每個非平凡多值依賴X→→Y(Y Í X),X都含有碼,則R∈4NF。
      • 如果R ∈ 4NF, 則R ∈ BCNF

        • 不允許有非平凡且非函式依賴的多值依賴
        • 允許的非平凡多值依賴是函式依賴
  • 資料依賴的公理系統

    • 邏輯蘊含

      • 定義6.11 對於滿足一組函式依賴 F 的關係模式R <U,F>,其任何一個關係r,若函式依賴X→Y都成立, (即r中任意兩元組t,s,若tX]=sX],則tY]=sY]),則稱F邏輯蘊含X →Y
    • 關係模式R <U,F >來說有以下的推理規則:

      • A1.自反律(Reflexivity):若Y Í X Í U,則X →Y為F所蘊含。
      • A2.增廣律(Augmentation):若X→Y為F所蘊含,且Z Í U,則XZ→YZ為F所蘊含。
      • A3.傳遞律(Transitivity):若X→Y及Y→Z為F所蘊含,則X→Z為F所蘊含。

        • 自反律: 若Y Í X Í U,則X →Y為F所蘊含

          證: 設Y Í X Í U

          對R <U,F> 的任一關係r中的任意兩個元組t,s:

          若t[X]=s[X],由於Y Í X,有t[y]=s[y],

          所以X→Y成立,自反律得證

        • 增廣律: 若X→Y為F所蘊含,且Z Í U,則XZ→YZ 為F所蘊含。

          證:設X→Y為F所蘊含,且Z Í U。

          設R<U,F> 的任一關係r中任意的兩個元組t,s:

          若t[XZ]=s[XZ],則有t[X]=s[X]和t[Z]=s[Z];

          由X→Y,於是有t[Y]=s[Y],所以t[YZ]=s[YZ],所以

          XZ→YZ為F所蘊含,增廣律得證。

        • 傳遞律:若X→Y及Y→Z為F所蘊含,則X→Z為 F所蘊含。

          證:設X→Y及Y→Z為F所蘊含。

          對R<U,F> 的任一關係 r中的任意兩個元組 t,s:

          若t[X]=s[X],由於X→Y,有 t[Y]=s[Y];

          再由Y→Z,有t[Z]=s[Z],所以X→Z為F所蘊含,傳遞律得證。

    • 匯出規則

      • 1.根據A1,A2,A3這三條推理規則可以得到下面三條推理規則:

        • 合併規則:由X→Y,X→Z,有X→YZ。

          (A2, A3)

        • 偽傳遞規則:由X→Y,WY→Z,有XW→Z。

          (A2, A3)

        • 分解規則:由X→Y及 ZÍY,有X→Z。

          (A1, A3)

      • 2.根據合併規則和分解規則,可得引理6.1

        • 引理6.l X→A1 A2…Ak成立的充分必要條件是X→Ai成立(i=l,2,…,k)
    • 函式依賴閉包

      • 定義6.l2 在關係模式R<U,F>中為F所邏輯蘊含的函式依賴的全體叫作 F的閉包,記為F+。
      • 定義6.13 設F為屬性集U上的一組函式依賴,X ÍU, XF+ ={ A|X→A能由F 根據Armstrong公理匯出},XF+稱為屬性集X關於函式依賴集F 的閉包
    • 函式依賴集等價

      • 定義6.14 如果G+=F+,就說函式依賴集F覆蓋G(F是G的覆蓋,或G是F的覆蓋),或F與G等價。
      • 引理6.3 F+ = G+ 的充分必要條件是F Í G+ ,和G Í F+

        證: 必要性顯然,只證充分性。

        (1)若FÍG+ ,則XF+ Í XG++ 。

        (2)任取X→YÎF+ 則有 Y Í XF+ Í XG++ 。

                 所以X→Y Î (G+)+= G+。即F+ Í G+。

        (3)同理可證G+ Í F+ ,所以F+ = G+。

    • 最小依賴集

      • 定義6.15 如果函式依賴集F滿足下列條件,則稱F為一個極小函式依賴集。亦稱為最小依賴集或最小覆蓋。

        • (1) F中任一函式依賴的右部僅含有一個屬性。
        • (2) F中不存在這樣的函式依賴X→A,使得F與F-{X→A}等價。
        • (3) F中不存在這樣的函式依賴X→A, X有真子集Z使得F-{X→A}∪{Z→A}與F等價。
    • 極小化過程

      • 定理6.3 每一個函式依賴集F均等價於一個極小函式依賴集Fm。此Fm稱為F的最小依賴集。

        證明: 構造性證明,找出F的一個最小依賴集。

        (1)逐一檢查F中各函式依賴FDi:X→Y,若Y=A1A2 …Ak,k > 2,

        則用 { X→Aj |j=1,2,…, k} 來取代X→Y。

        (2)逐一檢查F中各函式依賴FDi:X→A,令G=F-{X→A},

        若AÎXG+, 則從F中去掉此函式依賴。

        (3)逐一取出F中各函式依賴FDi:X→A,設X=B1B2…Bm,

        逐一考查Bi (i=l,2,…,m),若A Î(X-Bi )F+ ,

        則以X-Bi 取代X。

    • 模式的分解

      • 三種模式分解等價的定義:

        • ⒈ 分解具有無損連線性
        • ⒉ 分解要保持函式依賴
        • ⒊ 分解既要保持函式依賴,又要具有無損連線性
      • 定義6.16 關係模式R<U,F>的一個分解:ρ={ R1<U1,F1>,R2<U2,F2>,…,Rn<Un,Fn>},U= ∪Ui,且不存在 Ui Í Uj,Fi 為 F在 Ui 上的投影
      • 定義6.17 函式依賴集合{X→Y | X→Y Î F+∧XY ÍUi} 的一個覆蓋 Fi 叫作 F 在屬性 Ui 上的投影
    • 具有無損連線性的模式分解

      • 關係模式R<U,F>的一個分解 ρ={ R1<U1,F1>,R2<U2,F2>, …,Rn<Un,Fn>},若R與R1、R2、…、Rn自然連線的結果相等,則稱關係模式R的這個分解ρ具有無損連線性(Lossless join)
      • 具有無損連線性的分解保證不丟失資訊
      • 無損連線性不一定能解決插入異常、刪除異常、修改複雜、資料冗餘等問題
    • 保持函式依賴的模式分解

      • 設關係模式R<U,F>被分解為若干個關係模式,R1<U1,F1>,R2<U2,F2>,…,Rn<Un,Fn> ,(其中U=U1∪U2∪…∪Un,且不存在Ui Í Uj,Fi為F在Ui上的投影),若F所邏輯蘊含的函式依賴一定也由分解得到的某個關係模式中的函式依賴Fi所邏輯蘊含,則稱關係模式R的這個分解是保持函式依賴的(Preserve dependency)
    • 關係模式的規範化,其基本思想:

    • 小結

      • 若要求分解具有無損連線性,那麼模式分解一定能夠達到4NF
      • 若要求分解保持函式依賴,那麼模式分解一定能夠達到3NF,但不一定能夠達到BCNF
      • 若要求分解既具有無損連線性,又保持函式依賴,則模式分解一定能夠達到3NF,但不一定能夠達到BCNF

資料庫設計

  1. 資料庫設計的特點

  2. 資料庫設計方法
  • 基本思想:過程迭代和逐步求精

    • 新奧爾良(New Orleans)方法

      • 將資料庫設計分為若干階段和步驟
    • 基於E-R模型的資料庫設計方法

      • 概念設計階段廣泛採用
    • 3NF(第三正規化)的設計方法

      • 邏輯階段可採用的有效方法
    • ODL(Object Definition Language)方法

      • 面向物件的資料庫設計方法
    • 計算機輔助設計

      • ORACLE Designer 2000
      • SYBASE PowerDesigner
  • 資料庫設計的基本步驟

    • 資料庫設計分6個階段

      • 需求分析
      • 概念結構設計
      • 邏輯結構設計
      • 物理結構設計
      • 資料庫實施
      • 資料庫執行和維護
    • 需求分析和概念設計獨立於任何資料庫管理系統
    • 邏輯設計和物理設計與選用的DBMS密切相關

  1. 資料庫設計過程中的各級模式
  • 資料庫設計不同階段形成的資料庫各級模式

  1. 結構化分析方法(Structured Analysis,簡稱SA方法)
  • 從最上層的系統組織機構入手
  • 自頂向下、逐層分解分析系統

    • 1.首先把任何一個系統都抽象為:

    • 2.分解處理功能和資料

      • (1)分解處理功能

        • 將處理功能的具體內容分解為若干子功能
      • (2)分解資料

        • 處理功能逐步分解同時,逐級分解所用資料,形成若干層次的資料流圖
      • (3)表達方法

        • 處理邏輯:用判定表或判定樹來描述
        • 資料:用資料字典來描述
    • 3.將分析結果再次提交給使用者,徵得使用者的認可

  1. 資料字典
  • 資料字典的用途

    • 進行詳細的資料收集和資料分析所獲得的主要結果
  • 資料字典的內容

    • 資料項
    • 資料結構
    • 資料流
    • 資料儲存
    • 處理過程
  • ⒈ 資料項

    • 資料項是不可再分的資料單位
    • 對資料項的描述

      資料項描述={資料項名,資料項含義說明,別名,

      資料型別,長度,取值範圍,取值含義,

                  與其他資料項的邏輯關係,資料項之間的聯絡 }

  • ⒉ 資料結構

    • 資料結構反映了資料之間的組合關係。
    • 一個數據結構可以由若干個資料項組成,也可以由若干個資料結構組成,或由若干個資料項和資料結構混合組成。
    • 對資料結構的描述

      資料結構描述={資料結構名,含義說明,

      組成:{資料項或資料結構}}

  • ⒊ 資料流

    • 資料流是資料結構在系統內傳輸的路徑。
    • 對資料流的描述

      資料流描述={ 資料流名,說明,資料流來源,

      資料流去向,組成:{資料結構},

      平均流量,高峰期流量}

  • ⒋ 資料儲存

    • 資料儲存是資料結構停留或儲存的地方,也是資料流的來源和去向之一。
    • 對資料儲存的描述

      資料儲存描述={資料儲存名,說明,編號,

                   輸入的資料流 ,輸出的資料流 ,

                   組成:{資料結構},資料量,存取頻度,存取方式}

  • ⒌ 處理過程

    • 具體處理邏輯一般用判定表或判定樹來描述
    • 處理過程說明性資訊的描述

      處理過程描述={處理過程名,說明,輸入:{資料流},

      輸出:{資料流},處理:{簡要說明}}

  1. 概念結構設計
  • 設計概念結構的四類方法

    • 自頂向下
  1. 首先定義全域性概念結構的框架,然後逐步細化
  • 自底向上
  1. 首先定義各區域性應用的概念結構,然後將它們整合起來,得到全域性概念結構
  • 逐步擴張
  1. 首先定義最重要的核心概念結構,然後向外擴充,以滾雪球的方式逐步生成其他概念結構,直至總體概念結構
  • 混合策略
  1. 將自頂向下和自底向上相結合,用自頂向下策略設計一個全域性概念結構的框架,以它為骨架整合由自底向上策略中設計的各區域性概念結構。
  • 常用策略

    • 自頂向下地進行需求分析
    • 自底向上地設計概念結構

  • 自底向上設計概念結構的步驟

    •     第1步:抽象資料並設計區域性檢視
    •     第2步:整合區域性檢視,得到全域性概念結構

  • 資料抽象與區域性檢視設計

    • 資料抽象

      • 三種常用抽象

        • 1. 分類(Classification)

          • 定義某一類概念作為現實世界中一組物件的型別
          • 抽象了物件值和型之間的"is member of"的語義

      • 2. 聚集(Aggregation)

        • 定義某一型別的組成成分
        • 抽象了物件內部型別和成分之間"is part of"的語義

      • 複雜的聚集,某一型別的成分仍是一個聚集

      • 3. 概括(Generalization)

        • 定義型別之間的一種子集聯絡
        • 抽象了型別之間的"is subset of"的語義
        • 繼承性

    • 區域性檢視設計

      • 設計分E-R圖的步驟:

        • ⒈選擇區域性應用

          • 在多層的資料流圖中選擇一個適當層次的資料流圖,作為設計分E-R圖的出發點
          • 通常以中層資料流圖作為設計分E-R圖的依據

      • ⒉逐一設計分E-R圖

        • 任務

          • 將各區域性應用涉及的資料分別從資料字典中抽取出來
          • 參照資料流圖,標定各區域性應用中的實體、實體的屬性、標識實體的碼
          • 確定實體之間的聯絡及其型別(1:1,1:n,m:n)
        • 兩條準則:

          • (1)屬性不能再具有需要描述的性質。即屬性必須是不可分的資料項,不能再由另一些屬性組成
          • (2)屬性不能與其他實體具有聯絡。聯絡只發生在實體之間
        • 舉例

  1. 邏輯結構設計
  • E-R圖向關係模型的轉換
  • 資料模型的優化

    • 優化資料模型的方法

      • 1確定資料依賴

        • 按需求分析階段所得到的語義,分別寫出每個關係模式內部各屬性之間的資料依賴以及不同關係模式屬性之間資料依賴
      • 2消除 冗餘的聯絡

        • 對於各個關係模式之間的資料依賴進行極小化處理,消除 冗餘的聯絡。
      • 3確定所屬正規化

        • 按照資料依賴的理論對關係模式逐一進行分析
        • 考查是否存在部分函式依賴、傳遞函式依賴、多值依賴等
        • 確定各關係模式分別屬於第幾正規化
      • 4按照需求分析階段得到的各種應用對資料處理的要求,分析對於這樣的應用環境這些模式是否合適,確定是否要對它們進行合併或分解。
      • 注意:並不是規範化程度越高的關係就越優,一般說來,第三正規化就足夠了
      • 5按照需求分析階段得到的各種應用對資料處理的要求,對關係模式進行必要的分解,以提高資料操作的效率和儲存空間的利用率
  • 設計使用者子模式

    • 定義使用者外模式時應該注重的問題

      • 包括三個方面:

        • (1) 使用更符合使用者習慣的別名
        • (2) 針對不同級別的使用者定義不同的View ,以滿足系統對安全性的要求。
        • (3) 簡化使用者對系統的使用
  1. 資料庫的物理設計
  • 資料庫物理設計的內容和方法
  • 關係模式存取方法選擇

    • DBMS常用存取方法

      • 索引方法

        • 目前主要是B+樹索引方法
        • 經典存取方法,使用最普遍
      • 聚簇(Cluster)方法

        • HASH方法
    • 選擇索引存取方法的一般規則

      • 如果一個(或一組)屬性經常在查詢條件中出現,則考慮在這個(或這組)屬性上建立索引(或組合索引)
      • 如果一個屬性經常作為最大值和最小值等聚集函式的引數,則考慮在這個屬性上建立索引
      • 如果一個(或一組)屬性經常在連線操作的連線條件中出現,則考慮在這個(或這組)屬性上建立索引
    • 聚簇

      • 為了提高某個屬性(或屬性組)的查詢速度,把這個或這些屬性(稱為聚簇碼)上具有相同值的元組集中存放在連續的物理塊稱為聚簇
    • 聚簇的用途

      • 1. 大大提高按聚簇碼進行查詢的效率
      • 2. 節省儲存空間

        • 聚簇以後,聚簇碼相同的元組集中在一起了,因而聚簇碼值不必在每個元組中重複儲存,只要在一組中存一次就行了
    • 聚簇的侷限性

      • 1. 聚簇只能提高某些特定應用的效能
      • 2. 建立與維護聚簇的開銷相當大

        • 對已有關係建立聚簇,將導致關係中元組移動其物理儲存位置,並使此關係上原有的索引無效,必須重建
        • 當一個元組的聚簇碼改變時,該元組的儲存位置也要做相應移動
  • 確定資料的存放位置

    • 根據應用情況將

      • 易變部分與穩定部分分開存放
      • 存取頻率較高部分與存取頻率較低部分,分開存放
  • 評價物理結構
  1. 小結(續)
  • 在邏輯設計階段將E-R圖轉換成具體的資料庫產品支援的資料模型如關係模型,形成資料庫邏輯模式。然後根據使用者處理的要求,安全性的考慮,在基本表的基礎上再建立必要的檢視(VIEW)形成資料的外模式
  • 在物理設計階段根據DBMS特點和處理的需要,進行物理儲存安排,設計索引,形成資料庫內模式

資料庫程式設計

  • 嵌入式SQL
  1. 嵌入式SQL的處理過程
  • 資料庫工作單元與源程式工作單元之間的通訊:

    • 1. SQL通訊區

      • 向主語言傳遞SQL語句的執行狀態資訊
      • 使主語言能夠據此控制程式流程
    • 2. 主變數

      • 主語言向SQL語句提供引數
      • 將SQL語句查詢資料庫的結果交主語言進一步處理
    • 3. 遊標

      • 解決集合性操作語言與過程性操作語言的不匹配
  1. 嵌入式SQL與主語言的通訊
  • 在SQL語句中使用主變數和指示變數的方法

    • 1) 說明主變數和指示變數

      BEGIN DECLARE SECTION

          .........

          ......... (說明主變數和指示變數)

          .........

      END DECLARE SECTION

    • 2) 使用主變數

      • 說明之後的主變數可以在SQL語句中任何一個能夠使用表示式的地方出現
      • 為了與資料庫物件名(表名、檢視名、列名等)區別,SQL語句中的主變數名前要加冒號(:)作為標誌
    • 3) 使用指示變數

      • 指示變數前也必須加冒號標誌
      • 必須緊跟在所指主變數之後
  • 在SQL語句之外(主語言語句中)使用主變數和指示變數的方法

    • 可以直接引用,不必加冒號
  • 遊標(cursor)

    • SQL語言與主語言具有不同資料處理方式
    • SQL語言是面向集合的,一條SQL語句原則上可以產生或處理多條記錄
    • 主語言是面向記錄的,一組主變數一次只能存放一條記錄
    • 僅使用主變數並不能完全滿足SQL語句嚮應用程式輸出資料的要求
    • 嵌入式SQL引入了遊標的概念,用來協調這兩種不同的處理方式
    • 遊標是系統為使用者開設的一個數據緩衝區,存放SQL語句的執行結果
    • 每個遊標區都有一個名字
    • 使用者可以用SQL語句逐一從遊標中獲取記錄,並賦給主變數,交由主語言進一步處理
  • 建立和關閉資料庫連線

    • 建立資料庫連線

      EXEC SQL CONNECT TO target [AS connection-name] [USER user-name];

      • target是要連線的資料庫伺服器:

        • 常見的伺服器標識串,如<dbname>@<hostname>:<port>
        • 包含伺服器標識的SQL串常量
        • DEFAULT
      • connect-name是可選的連線名,連線必須是一個有效的識別符號 在整個程式內只有一個連線時可以不指定連線名
    • 關閉資料庫連線

      EXEC SQL DISCONNECT [connection];

    • 程式執行過程中可以修改當前連線 :

      EXEC SQL SET CONNECTION connection-name | DEFAULT;

  • 不用遊標的SQL語句的種類

    • 說明性語句
    • 資料定義語句
    • 資料控制語句
    • 查詢結果為單記錄的SELECT語句
    • 非CURRENT形式的增刪改語句
  • 使用遊標的SQL語句