數據庫體系結構可以分成3個層次:
外部層次 概念層次 內部層次外部層次是指每個用戶用不同的高級語言來訪問數據庫所面對的接口,概念層次數據庫信息的表示以及模的式定義(包括安全性和完整性約束等等),而內部層次就是的存儲表示(非物理記錄也非機器相關),數據庫的設計需要保證這三個層次之間的獨立性:
概念層和內部層之間物理數據的獨立性 外部層和概念層之間邏輯數據的獨立性DBA(數據庫管理員)必須很好的了解企業的數據資源以及企業需求,除此之外DBA還有一下職責:
數據庫模式定義(數據庫邏輯設計) 存儲結構和訪問方法 物理組織以及修改方法 用戶訪問控制 完整性約束 監測數據庫性能 和用戶保持溝通DBA要完成這麼多工作必須借助於DBMS(數據庫管理系統),我們可以從兩個方面來看待什麼是DBMS
DBMS首先是一個軟件系統,它能夠滿足以下數據庫需求:
數據定義 數據修改 DML(數據操作語言)請求 查詢優化 數據安全性 數據完整性 數據並發 數據恢復 性能其次DBMS還是一個文件系統
數據庫應用有兩種典型的結構,C/S架構(客戶機-服務器架構)、B/S架構(浏覽器-服務器架構),現今的應用也是逐漸由C/S架構發展到B/S架構
C/S架構中用戶要麼通過數據庫應用直接和DBMS打交道獲取數據庫服務,要麼通過網絡連接到數據服務器,由數據庫服務器完成和DBMS的交互
然而在如今Web應用的大力發展下,誕生了新型的多層次B/S架構數據庫應用:
用戶通過Web浏覽器和服務器交互 Web服務器響應用戶操作並把用戶請求轉達給應用服務器 應用服務器完成系統的業務邏輯,把用戶請求翻譯成數據請求送達數據庫服務器,並且把數據請求反饋給Web服務器 數據庫服務器運行DBMS,直接和數據庫交互我們把現實世界中的實體之間的聯系抽象成表(Table)的形式,就叫做關系
如下一張記錄客戶信息的表就是我們所說的關系:
Customer:
對於關系我們有很多術語:
域Domain:Domain是指屬性的數據類型以及這些數據類型所匹配的運算操作,數據屬性可以是系統提供的,也可以是用戶定義的 屬性/字段Attribute:屬性就是表的列數據所代表的統一的現實世界中的含義,Customer表中name、street和city就是該表的屬性 元組Tuple:Tuple是表中一行數據的集合,它表示一條完整的關系記錄,如Customer表中(Jones, North, Harrison)就是一個元組 基數Cardinality:表中元組的個數 度Degree:表中屬性的個數C.J.Date這本書中定義了兩個作用於類型的操作符:
Selector:允許用戶聲明或選擇這種類型的值 THE_:允許用戶訪問這些值的組成(這裡還不是很理解)
關系是一張表,表頭是斷言(或者叫恆真函數),那麼表中每個元組就是一個真命題,C.J.Date把表頭斷言叫做關系,而把關系的實例——這些元組的集合叫做關系變量(RELVARS)
關系變量是變化的,因為表中的數據隨時都可能發生更改,有兩種關系變量:
基本關系變量:元組的集合描述的就是實際的基本關系 視圖:是基於基本關系的一種抽象元組表示(我一直把視圖理解為,我們有很多基礎表,但展現出來的不一定是完整的基礎表,而是某個業務邏輯需要的子關系[視圖],這些子關系可以是基本表的Restrict和Project,也可以是多張基本表的Join)C.J.Date用術語目錄(Catalog)或字典(Dictionary)來描述記錄關系模式的表,書上又稱它們為描述符信息或元數據(metadata)
通俗理解,目錄就是描述關系表名、列名行名、列數行數等信息的表
關系必須滿足以下性質:
關系中沒有重復的元組 元組是無序排列的 屬性也是無序排列的 每個元組在對應屬性中至多有一個值(多數關系型數據庫可以允許為null)我們把對關系的操作抽象成以下三種(抽象,區別於SQL中具體操作):
Restrict:提取表中某些行(元組) Project:提取表中某些列(屬性) Join:兩張表某列(屬性)具有相同值,根據這些屬性的值把這兩張表合並在一起關系操作有一下兩個特性:
所有的操作都是針對表,所有操作的輸出也是一張表 (閉包屬性)一個操作的輸出(表)可以作為另一個操作的輸入關系型數據庫就是包含一個或多個關系(表)的數據庫,這裡的表是指從業務邏輯、業務需求中抽象出來的邏輯結構,而非物理存儲結構(我們並不關心物理存儲結構,這是DBMS的工作)
關系型數據庫就是單純的多表結構,表之間並沒有指針互相引用
關系型數據庫有一套規范化設計模式,用於有效的避免數據冗余和信息缺失,將在後面章節中介紹
關系模式定義:有屬性