分析資料庫資料表的結構
了解資料表的結構以及在 Azure SQL 中可以用它們做什麼是開發一個好的應用程式資料模型的關鍵。
在卡片遊戲線上參考應用程式中,許多不同類型的資料必須儲存在資料庫中,使其可以盡可能精確地表示此數位媒體中的實體卡片。
在本單元中,您將了解 Azure SQL 中資料庫資料表的基本概念、其儲存方式,以及其可保存的資料類型。
關聯式資料庫和資料模型
關聯式資料庫是一種資料庫類型,可將資料儲存在資料列和資料行中,進而結合以建立稱為資料表的結構,類似於將資料輸入 Excel 試算表。 您可以透過唯一索引鍵鍵值來關聯資料庫中的資料表;例如,訂單資料表中所參考的 products 資料表中的產品 ID。 您也可以在階層中擁有一對多或父子關聯性的索引鍵值。 資料模型是關聯式資料庫中資料表的表示法,及其彼此連線或參考的方式。
什麼是資料庫資料表?
資料表是關聯式資料庫中許多物件的其中一個,但卻是目前為止最重要的物件。 如果沒有資料表,我們要如何以及在何處儲存資料? 資料表類似於試算表,由資料行和資料列組成。 當您只要使用試算表時,為何要有資料庫? 假設您電腦上有成千上萬個試算表,其中包含數百萬或數十億個資料列。 您該如何搜尋這些檔案? 這些檔案如何以邏輯和實體方式進行儲存和排序? 資料庫可讓我們將這些「試算表」儲存在結構化且已排序的方法中,以不到一秒的速度立即存取任何資料表中的任何記錄。
與試算表類似,資料表是由資料列 (水平元素) 與資料行 (垂直元素) 所組成。 您可以將資料行視為我們的資料表儲存或描述的內容的屬性。 您可以將資料表中的資料列視為由這些資料行中的資料所組成的記錄。 當資料列和資料行相交時,它稱為欄位,就像試算表中的儲存格。 雖然資料表中可以儲存的記錄數 (或列數) 受到資料庫可以存取的電腦儲存量或磁碟空間的限制,但是資料行數限制為 1,024。 擁有數百個資料行的資料表很難維護,就像在垃圾抽屜底部尋找迴紋針一樣。 資料表是資料庫中的永久結構,但在某些情況下您可以使用暫存資料表,我們將在本課程模組中稍後介紹。
資料會以資料列和資料行格式在這些資料表中結構化,且可以儲存為數字、日期、文字、二進位物件,或甚至是 JSON 文件。 除了資料表之間的關聯性之外,您也可以套用規則集來限制或增強可在資料表中儲存的資料。
您可以套用的一些規則包括:
- 能夠限制資料列中的欄位可以是 Null 或需要值
- 如果未指定任何值,則會指派預設值
- 定義及限制可接受的值
- 根據資料表內的其他資料行,自動插入衍生自計算值的資料
卡片遊戲資訊應用程式會有卡片名稱、卡片 ID 和卡片顏色等欄位,每張卡片都是資料表中的記錄。 使用此案例,您可以看到表格中的資料列和資料行如何保存下圖中其中一張遊戲卡片的專屬資訊。
記憶體最佳化的資料表
Azure SQL 也有經記憶體最佳化的資料表,這些資料表會儲存在資料庫伺服器的主要記憶體中,其中資料列會直接對記憶體進行讀取和寫入。 不過,如果出現重新開機或災害復原的情況,磁碟上也有資料表的實體複本,以獲得持久性。 基於本課程模組的目的,您將不會使用經記憶體最佳化的資料表,但了解它們的存在很重要。
如您所見,在實作任何程式碼之前,先擬定資料表結構的智慧型決策,可確保隨應用程式成長和演進可靠且可擴充的資料模型。
比較 Azure SQL 資料類型
當您定義資料表內的資料行時,不僅需要以該資料表唯一的名稱予以識別,還必須為其指派資料類型。 資料類型是資料行的屬性,用來指定可保存的資料類型,例如數字、文字和日期。
決定何時使用哪個資料類型
將資料儲存在資料庫中需要仔細查看您想要保存的資料類型。 這是金錢嗎? 我的數字會多大? 您需要儲存小數嗎? 應用程式是否需要資料庫來儲存映像? 一個資料行需要容納多少文字? 根據這些答案,您會有可用於每個案例的特定資料類型。
Azure SQL 中使用的一些常見資料類型如下:
- 字元:當您想要將字元或文字儲存在資料庫中時,Azure SQL 會提供
nchar
和nvarchar
資料類型。 針對固定大小的文字資料使用nchar
,而針對可變大小的文字資料使用nvarchar
。 使用max
作為nvarchar
的長度會允許資料列中每個欄位最多 2 GB 的文字儲存空間。Nchar
和nvarchar
也允許您以日文和中文等語言查看的多位元組字元。 - 小數:具有特定精確度的數字會使用
decimal
資料類型。 此資料類型必須由兩個變數定義。 首先,有效位數 (p),或要儲存的小數位數總數上限。 其次是小數位數,即儲存在小數點右邊的小數位數。 - 整數:儲存不需要帶小數值的精確數字時,您可以使用
integer
類型。 大部分的使用案例都屬於使用int
資料類型,但有適用於其他特殊案例的整數類型。 對於較小的值,您可以使用tinyint
和smallint
;對於大數字,bigint
是最好的。 money 資料類型可用來儲存貨幣。 - 位元:
bit
資料類型只能包含 0 或 1,非常適合布林值或 true/false 資料。 - 日期和時間:類似於數字資料類型,您可以使用各種精確度層級,將日期和時間儲存在資料庫中。
date
資料類型會以 YYYY-MM-DD 格式將資料儲存在資料庫中。 如果您需要更多精確度,您可以使用datatime2
資料類型 (以 YYYY-MM-DD hh:mm:ss[.nnnnnnn] 格式儲存日期)。 如果您只需要時間,那麼您可以使用time
資料類型 (其使用 hh:mm:ss[.nnnnnnn] 格式)。 如果您正在建立考慮全球化的應用程式,您可以使用datetimeoffset
資料類型 (其包含時區資訊)。 - 二進位:如果您需要儲存影像或檔案等資料,您可以使用
binary
和varbinary
資料類型。binary
資料類型用於固定長度的二進位資料,而varbinary
資料類型用於可變長度的二進位資料。 - 空間:Azure SQL 有兩種空間資料類型:
geometry
與geography
。geometry
類型代表歐幾里得 (平面) 座標系統中的資料,而geography
類型則代表球面座標系統中的資料。 一旦使用這些類型將資料儲存在資料庫中,您便能使用 SQL 來執行空間作業,例如最鄰近查詢 (最接近我位置的披薩餐廳) 或幾何空間中的點位置 (x、y 和 z 在圖形上交集的位置)。
了解了資料庫資料類型的新知識之後,請回顧一下卡片遊戲應用程式的資料模型。 您可以看到 card_id
和 card_power
等資料行會是數字類型,其中 card_name
、card_type
和 card_color
會是文字資料類型。 因為必須儲存卡片藝術,所以使用 varbinary
的最大大小可讓您將影像儲存在資料表中。
如何儲存資料表?
在資料庫所在的檔案系統上,資料表會儲存在分頁中。 這些分頁是 8K 檔案,以資料、文字/影像或索引頁的形式出現。 如同書籍或文章的索引一樣,每個分頁都會以標頭區段開頭,以描述分頁中的內容。 此標頭資訊包括頁碼、分頁類型、分頁上可用空間的數量,以及擁有分頁的物件配置單位識別碼。 範圍會保留八個實際連續的分面,因此 Azure SQL 資料庫每 MB 會有 16 個範圍。 (每個範圍 64K * 16 個範圍 = 1,024K 或 1 MB) 您可以在分頁和範圍架構指南中深入了解本主題。
為何儲存資料表的方式很重要? 設計資料模型,並決定要使用的資料類型和資料類型大小時,您必須記住,某個分面的資料無法流過並繼續前往另一個分頁。 使用一律使用最大大小的資料類型建立資料行可能會導致效能問題,因為可能會為每個資料列建立分頁。