官术网_书友最值得收藏!

3.1 數據庫對象和數據庫文件

3.1.1 數據庫的基本概念

SQL Server 2016將數據庫映射為一組磁盤文件,并將數據與日志信息分別保存于不同的磁盤文件中,每個文件僅在與之相關的數據庫中使用。因此,從物理角度看,數據庫包括數據文件和日志文件。從邏輯角度看,數據庫中的表、索引、觸發器、視圖、鍵、約束、默認值、規則、用戶定義數據類型或存儲過程及數據庫本身,都可以理解為數據庫對象。

1.數據庫的結構層次

SQL Server的數據庫基本結構分為3個層次,反映了觀察數據庫的3種不同角度。以內模式為框架所組成的數據庫叫做物理數據庫,以概念模式為框架所組成的數據庫叫做概念數據庫,以外模式為框架所組成的數據庫叫做用戶數據庫。

(1)物理數據庫。這是數據庫的最內層,是物理存儲設備上實際存儲數據的集合。這些數據是原始數據,是用戶加工的對象,由內部模式描述的指令操作處理的位串、字符和字組成。在SQL Server中就是存儲文件,即由操作系統管理的數據文件和日志文件。

(2)概念數據庫。這是數據庫的中間一層,是數據庫的整體邏輯表示。概念數據庫指出了每個數據的邏輯定義及數據間的邏輯聯系,是存儲記錄的集合,涉及的是數據庫所有對象的邏輯關系,而不是它們的物理情況,是數據庫管理員概念下的數據庫。在SQL Server中表現為由數據行和列組成的基本表。

(3)用戶數據庫。這是用戶所看到和使用的數據庫,表示了一個或一些特定用戶使用的數據集合,即邏輯記錄的集合。數據庫不同層次之間的聯系是通過映射進行轉換的。在SQL Server中表現為視圖、報表和查詢結果集等。

2.數據庫的邏輯結構

SQL Server的數據庫邏輯結構可以理解為在運行SQL Server軟件中觀察到的數據庫組成。例如,展開SQL Server 2016的示例數據庫teaching,如圖3-1所示,可以看到teaching數據庫組成部分,如數據庫關系圖、表、視圖等數據庫對象。每個數據庫對象完全限定的對象名稱包含4部分:

以訪問teaching數據庫的表student為例,即使在當前服務器中也需要寫成teaching. dbo.student的形式。如果從其他服務器中訪問,前面還需加上服務器名。其中,dbo表示架構;schema在SQL Server中為架構的統稱。

圖3-1 數據庫的邏輯結構

3.架構

架構是形成單個命名空間的數據庫實體的集合。命名空間是一個集合,其內部的每個元素的名稱都是唯一的。在SQL Server 2016中的默認架構是DBO。如果用戶創建數據庫時沒有指定架構,系統將使用默認架構。展開一個數據庫中的“安全性”→“架構”文件夾,就可以觀察到系統架構列表。

4.數據庫所有者

數據庫所有者(DBO)就是有權限訪問數據庫的用戶,即登錄數據庫的網絡用戶。數據庫所有者是唯一的,擁有該數據庫中的全部權限,并能夠提供給其他用戶訪問權限和功能。

5.數據庫的物理文件

每個SQL Server 2016數據庫至少具有兩個操作系統文件,即一個主數據文件和一個日志文件。主數據文件包含數據和數據庫對象,日志文件包含恢復數據庫中的所有事務所需的信息。

SQL Server 2016數據庫具有以下3種類型的文件。

(1)主數據文件包含數據庫的啟動信息,并指向數據庫中的其他文件。用戶數據和對象可存儲在此文件中,也可以存儲在次要數據文件中。每個數據庫有一個主要數據文件,建議文件擴展名是.mdf。

(2)次要數據文件是可選的,由用戶定義并存儲用戶數據。通過將每個文件放在不同的磁盤驅動器上,次要文件可用于將數據分散到多個磁盤上,建議文件擴展名是.ndf。

(3)事務日志文件保存用于恢復數據庫的日志信息。每個數據庫必須至少有一個日志文件,建議文件擴展名是.ldf。

默認情況下,數據和事務日志被放在同一個驅動器的同一個路徑下,這是為處理單磁盤系統而采用的方法。但是,在生產環境中建議將數據和日志文件放在不同的磁盤上。

3.1.2 數據庫的常用對象

數據庫對象是數據庫的組成部分,除了數據庫本身外,常見的對象有表、索引、視圖、數據庫關系圖、默認值、規則、觸發器、用戶、存儲過程、序列等,本節簡要介紹這些對象的概念,為后續學習打下基礎。

(1)表(Table)。數據庫中的表與日常生活中使用的表格類似,由行(Row)和列(Column)組成。其中,列由同類的信息組成,每列又稱為一個字段,每列的標題稱為字段名。行包括若干列的信息項。一行數據稱為一個或一條記錄,是有一定意義的信息組合。一個數據庫表由一條或多條記錄組成,沒有記錄的表稱為空表。每個表中通常都有一個主關鍵字,用于唯一地確定一條記錄。

(2)索引(Index)。索引是根據指定的數據庫表列建立起來的順序。它提供了快速查詢大量數據的方法。有的索引還可以限制表,使其指定的列數據不重復。

(3)視圖(View)。視圖是一個虛擬的表,在數據庫中實際并不存在。視圖是由查詢數據表產生的,可以用來控制用戶對數據的訪問,并能簡化數據的顯示,提高數據的安全性管理水平。

(4)數據庫關系圖(Database diagram)。這是本數據庫中的表之間的關系示意圖,也稱圖表,利用圖表可以編輯表與表之間的關系以及表的行列屬性。

(5)默認值(Default)。默認值是當在表中創建列或插入數據時,對沒有指定其具體值的列或列數據項賦予事先設定好的值。

(6)規則(Rule)。規則是對數據庫表中數據信息的限制,其限定的是表的列。

(7)存儲過程(Stored Procedure)。存儲過程是為完成特定功能而匯集在一起的一組SQL程序語句,經編譯后存儲在數據庫中的SQL程序。

(8)觸發器(Trigger)。觸發器是一個用戶定義的SQL事務命令的集合。當對一個表進行插入、更改、刪除時,這組命令就會自動執行。

(9)用戶(User)。用戶是有權限訪問數據庫的使用者,同時需要自己輸入登錄賬號和密碼。一般來說,數據庫用戶分為管理員用戶和普通用戶,前者可對數據庫進行修改刪除,后者只能進行閱讀、查看等操作。

除了以上列出的數據庫對象之外,不同的數據庫管理系統也有部分自定義的對象,將在具體學習中分別介紹,此處不再贅述。

3.1.3 數據庫的存儲

SQL Server 2016數據庫是以文件的方式存儲到磁盤中,其中數據文件和日志文件的結構不同,存儲方式也不一樣,如圖3-2所示。

圖3-2 數據的存儲方式

1.數據文件的存儲結構

從SQL Server 2016數據庫的物理架構上來看,SQL Server用于存儲數據的基本單位是頁,每頁容量為8KB。也就是說,數據庫對應磁盤文件在邏輯上可以被劃分為多個頁。通常頁碼是由0~n的一組連續號碼組成。實際上,SQL Server 2016在執行底層的磁盤I/O時也是以頁級為單位的。SQL Server將8個物理上連續的頁組成一個區,以此可以更加有效地管理數據頁。

(1)數據頁。SQL Server將8KB的數據劃分為一頁,即在SQL Server數據庫中的1MB數據中包含128頁。

SQL Server 2016的頁類型共有包括數據頁、索引頁、文本/圖像頁等8種。每個頁的開頭為96B的系統信息,此信息包括頁碼、頁類型、頁的可用空間以及擁有該頁的對象分配單元ID。其中,頁類型用于指明該頁存儲的數據類型以及使用狀態等信息。數據區占有8060B,頁尾的行偏移數組占有36B。

(2)擴展盤區(Extents)。數據頁是SQL Server數據庫讀寫數據的基本單位,擴展盤區就是管理存儲空間的基本單位。一個擴展盤區由8個物理上連續的頁(64KB)組成,即SQL Server數據庫中每1MB包含16個區。

為了提高空間利用率,SQL Server 2016在為數據庫中的某個數據表分配存儲區時采取兩種不同的策略。

①將擴展盤區中所有8個存儲頁全部分配給一個數據庫對象(如數據表),采用這種方法分配的區也被稱為“統一區”。統一區中的所有8個存儲頁只能供所屬對象使用。

②允許擴展盤區中的存儲頁由1~8個數據對象共同使用。這種分區方式也稱為“混合區”。采用這種方式的分區,區中的每一頁(共8頁)都可由不同的對象擁有。

2.日志文件的存儲結構

SQL Server數據庫提供的日志功能可以記錄數據行從數據庫創建到當前時刻對數據庫所做的全部更改。針對數據庫中任何一行執行的操作都將被作為一個日志行,并在事務提交時寫入日志文件中。SQL Server 2016中的事物日志功能一般用于恢復指定事務,還原的數據庫、文件、文件組或頁前滾至故障點,支持事務性復制和備份服務器解決方案,實現在SQL Server啟動時恢復所有未完成的事務。

(1)SQL Server數據庫日志的物理結構。日志文件并不包括在文件組內,SQL Server 2016的日志文件中包含著一系列日志行。日志行按照順序存儲到實現事務日志的物理文件集中。

(2)SQL Server數據庫日志的邏輯結構。SQL Server 2016數據庫中的事務日志以日志行為單位。每條日志行是由一個日志序列號(Log Sequence Num,LSN)標識。每條新日志行均寫入日志的邏輯結尾處,并使用一個比前一行LSN大的LSN。LSN唯一標識一條日志行。每一日志行中都包含該日志行所屬的事務ID。

(3)SQL Server 2016將數據庫的回滾操作也放到日志中。SQL Server數據庫在事務日志中為每個事務都預留了空間,以確保存有足夠的日志空間行由回滾語句或錯誤引起的回滾操作。事務完成后將釋放此保留空間。

數據庫日志文件中,用于確保數據庫成功回滾的首日志行與最后一條日志行之間的部分稱為日志的活動部分,即“活動日志”。這是進行數據庫完整恢復所需的日志部分。需要注意的是,永遠不能截斷活動日志的任何部分。

主站蜘蛛池模板: 莱芜市| 金山区| 合山市| 龙门县| 玉门市| 敦化市| 云龙县| 海淀区| 永善县| 南川市| 高雄县| 滦平县| 乌兰县| 古浪县| 景泰县| 陆良县| 丹巴县| 于都县| 长兴县| 霞浦县| 柯坪县| 天峨县| 福安市| 都安| 闽侯县| 乌什县| 漳平市| 清苑县| 武宣县| 浪卡子县| 西平县| 合阳县| 威远县| 两当县| 辽阳市| 富锦市| 柘城县| 洛川县| 永年县| 阳信县| 县级市|