第五章 資料庫暨資料表設計與建立
Chapter 5 Outline 5-1 資料庫正規化實例 5-2 資料庫正規化與SQL Server的運作效能 5-3 SQL Server 2005的系統資料型態 5-4 新建一資料庫 5-5 新建一資料表 5-6 變更資料表的結構 5-7 產生建立資料表的指令碼 5-8 刪除資料表 5-9 本章總結
5-1 正規化實例 做完3NF後的資料表,如右圖所示。日後如有加入相關的資料表或是欄位都需要檢查是否符合正規化原則
5-2 正規化與SQL Server的運作效能 資料庫正規化有助於排除資料存取的異常與存取效率的提昇,是將關聯式資料庫最佳化的核心。 良好的邏輯資料庫設計可替最佳的資料庫和應用程式效能奠定最好的基礎 。 正規化過的資料庫最大的特點是:「每一個資料表的欄位數量較少」(但是資料表的數量會相對地增加),而未經過正規化的資料庫可能會是一些欄位較多的大資料表。
5-2 正規化與SQL Server的運作效能 由於較大較少的資料表被分割成較小較多的資料表,所以可以建立更多的叢集索引以加速查詢。 因為每個資料表的欄位較少,所以每筆記錄的資料量都會較小,如此便可加速資料排序和索引的建立過程。 由於每個資料表上的索引較少,有助於資料變更時所付出的維護代價。 資料表中會出現較少的NULL值,因此重複性的資料也會變少進而提昇資料庫的存取效率。 在SQL Server中,合理的正規化會有提昇執行效能的功用。但是一旦正規化的程度提高,就會造成存取資料時其資料表連結鏈過長 (需要合併好幾個表格方能查出資料,這樣一來不但會造成存取資料變慢也會困擾應用程式的開發人員)。 因此,一般來說,除非正規化的結果會造成在查詢資料時必須透過四層以上的連結,否則都會儘可能進行資料庫正規化的動作。
5-3 SQL Server的系統資料型態 無論是在新建資料表的欄位設定、宣告區域變數或是參數設定時都需要宣告它們的資料型態,好的資料庫設計必須是使用正確的資料型態。 SQL Server 2005的系統資料型態若依照使用的用途來歸類,大致上可分為下列幾種資料型態: 精確數值型態 近似數值型態 日期與時間型態 字元字串型態 Unicode字元字串 二進位字串型態 其他資料型態
5-3 SQL Server的系統資料型態 精確數值型態(Numeric):可精確表示各種數字,依其使用位元組之大小而有範圍。 整數型態( Integers ) Bigint(8 bytes)、int(4 bytes)、smallint(2 bytes)、tinyint (1 byte) 十進制小數型態(Decimal) decimal[(precision[, scale])] 、numeric ,位元組大小與宣告的精確度有關 金錢型態(Monetary) Money(8 bytes) 、 smallmoney(4 bytes) 在精確數值資料型態中可以表示各種數字,包括:正數和負數、小數和分數以及整數,又可細分為整數型態、十進制小數型態以及金錢型態。 使用這些的數字是精準的,並不會受到電腦捨去小數點的位數而影響數值,例如:0.3以二進位紀錄為變成0.01001…,再轉成十進制0.299999 這樣一來就會與原先的0.3有一些誤差,但這樣的情況並不會發生在精確數值型態上。 ,decimal(l0,4)表示6位整數及4位小數
5-3 SQL Server的系統資料型態 近似數值型態(Approximate Numeric):該型態的數值資料可能會因為數值運算而會有些許的誤差,包含 float real 在SQL Server中real為float(24),儲存大小為4個位元組 ;而float準確度最高可宣告至float(53),儲存大小為8個位元組。
5-3 SQL Server的系統資料型態 日期與時間型態(Date And Time):用來儲存「日期-時間」的資料,包含 datetime:佔用8個位元組,精準度到1/300秒 smalldatetime :佔用4個位元組,精準度只有到分鐘 事實上SQL Server 2005在內部會將datetime資料類型的值儲存成兩個位元組的整數, 前面的位元組用來儲存在「基底日期」(1900年1月1日) 之前或之後的天數。 另外一個位元組用來儲存當日午夜時間之後的某種單位數字 (datetime與smalldatetime單位不同)
5-3 SQL Server的系統資料型態 字元字串型態(Character) 二位元資料型態(Binary Strings) 一般字元型態 char 、 varchar 、 varchar(max) Unicode的字元字串型態 nchar 、 nvarchar 、 n varchar(max) 二位元資料型態(Binary Strings) binary varbinary Varbinary(max) Char(n):儲存固定長度n的非unicode字元,最大的長度為8,000 字,所佔的儲存大小為n個位元組。 Varchar(n):儲存不固定長度的非Unicode資料,最大的長度亦為8,000 字,所佔的儲存大小為實際資料的大小。例如:char(20),儲存 “Hello”,佔用20bytes,如果使用varchar(20),則只佔用5bytes Varchar(max):儲存不固定長度的非Unicode資料,但最大可儲存2G個字 Nchar(n):儲存固定長度的unicode字元,最大的長度為4,000 字,所佔的儲存大小為2n個位元組。 Binary(n):儲存固定長度的二位元資料,最大長度為8,000 個位元組,所佔的儲存大小為n+4個位元組。
5-3 SQL Server的系統資料型態 其他特殊的資料型態(Special) timestamp:時間戳記,在同一資料庫中該戳記是唯一值,所佔的儲存大小為8個位元組,一個資料表只可以有一個timestamp的資料欄位。 uniqueidentifier:這是一個全域唯一識別的資料型態(Globally Unique Identifier /GUID) sql_variant :可儲存varchar(max)、nvarchar(max)、timestamp 以及 sql_variant以外的各種 SQL Server所支援的資料型態。 xml :儲存XML的文件或文字片段。 Timestamp:在同一系統中的不同資料庫可能會有相同之戳記,而uniqueidentifier在同一系統中是唯一值,就算在不同的資料庫也不會出現相同的值。
5-3 SQL Server的系統資料型態 資料型別轉換 在Transact-SQL中,資料型別轉換可能發生在兩個不同層級﹕ 將一個物件的資料轉移到「比較」或「結合」另一個物件的資料,此時可能要將資料從一個物件的資料型別轉換成其他物件的資料型別。 將Transact-SQL結果資料行、傳回碼或輸出參數移入程式變數時,必須將它從SQL Server資料型別轉換成變數的資料型別。
5-3 SQL Server的系統資料型態 SQL Server的資料型別轉換分為 使用者看不到的隱含轉換 SQL Server 會自動將資料轉換成另一種資料型別。如果將Int與float做運算,則會將int隱含地轉換成float。 使用CAST或CONVERT轉換函數 CAST與CONVERT函數會將數值(區域變數、資料行或別的運算式) 轉換成別的資料型別。 CAST ( expression AS data_type ) CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 例如:CAST ( $157.27 AS VARCHAR(10) )會將數值$157.27轉換成字元字串 ‘$157.27’ 。
5-4 新建一資料庫 1.建立資料庫時必須考慮該資料庫的名稱、擁有者(建立該資料庫的使用者)、大小,以及用來儲存該資料庫的檔案和檔案群組 2.進入SSMSE中,選欲建立資料庫的伺服器點選[資料庫]滑鼠右鍵彈出式選單的[新增資料庫]選項 只要輸入資料庫名稱,其餘都是使用預設值即可 在SQL Server 中資料庫,會依據儲存的資料自動長大,初始大小只是開始建立時的預留空間而已。
5-5 新建一資料表 1.在關聯式資料庫中資料表可說是靈魂所在,因為必須先要資料才能在做進一步的處理。 2.建立資料表之前必須先做資料庫的正規化以得到較佳的綱要,以便建立相關欄位與限制。 3.必須了解系統資料型態,欄位使用適當的型態可以提高運作的效率
5-5 新建一資料表(續) 1.在SSMSE中展開某一資料庫,接著點選[資料表]物件(右邊視窗的空白處亦可)滑鼠右鍵彈出式選單的[新增資料表]選項即可進入資料表設計畫面,如右圖所示。
5-5 新建一資料表(續) 2.請輸入欄位名稱,並選擇適當的資料型別。
5-5 新建一資料表(續) [資料行屬性]可以規劃其他更細項的設定,例如 允許Null:決定該資料欄位在輸入時是否允需沒有輸入 描述:顯示選定資料行的文字描述。 識別規格的(Is Identity)、識別值種子以及識別值增量:可設定該欄位的唯一性,使用欄位的唯一性時還需要設定[識別值種子](Identity Seed/初始值)及[識別值增量](Identity Increment/每次自動增加的量) 為 RowGuid:可設定該欄位的「全域唯一性」 (GUID) 計算資料行規格:可以輸入用於計算該資料行的公式。 勾選識別規格的(Is Identity)欄位可使系統為該欄位邊寫流水號,換句話說就是使用者可以不用輸入該欄位的值 計算資料行規格:可為欄位設定計算公式,例如商品小計=單價*數量*折扣
5-6 變更資料表的結構 建立資料表之後可能需要新增/刪除欄位,或是修改欄位的資料型態,此時可以在SSMSE中點選該資料表滑鼠右鍵彈出式選單中的[修改]選項即可。 修改資料表結構的使用方式與新增資料表相同
5-7產生建立資料表的指令碼 在SQL Server中除了使用SSMSE的方式可以建立資料庫物件(就是資料庫、資料表、預存程序、登入、資料庫使用者…etc)也可以使用SQL敘述(搭配系統預存程序來建立更方便)。 除了自行撰寫SQL敘述之外,SSMSE提供產生建立物件的SQL指令碼引擎。透過該工具可以輕鬆產生建立物件的指令碼加以備份。 有了指令碼就等於我們對這個資料表的結構做了備份,我們只要執行這個指令碼就可以輕易的再造出一個一模一樣的資料表 ,但是這並不包含資料表內的資料
5-7產生建立資料表的指令碼
5-8 刪除資料表 在資料庫中刪除物件通常稱之為DROP 刪除物件在SQL Server 中的方式都相同,只要點選該物件滑鼠右鍵彈出式選單的[刪除]選項就會進入刪除物件的畫面。 如果有其他物件相依於該物件,則可能無法刪除(例如資料表為檢視的基底資料表)或一併刪除相依物件(例如資料表的觸發程序)。
5-9 本章總結 正規化是資料庫設計與提昇資料庫整體效能的重要技巧,從第一正規化到第三正規化原則都該牢記 5-9 本章總結 正規化是資料庫設計與提昇資料庫整體效能的重要技巧,從第一正規化到第三正規化原則都該牢記 1NF:去除非單元值屬性 1NF→2NF:去除非鍵屬性的部份功能相依 2NF→3NF:去除非鍵屬性的遞移功能相依。 SQL Server 2005系統資料型態介紹。 資料表的新建、修改以及刪除的方法。 資料欄位建立的方法與所要注意的事項。 如何產生物件的指令碼。