第三章 系統設計
3.4 系統實作方法
3.4.2 CREATE 語句的轉換、CREATE EXTENSION TABLE 的設計與實作
國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
28
能力。
除此之外,由於 Extension Table Layout 會將資料表欄位拆成共有欄位、
私有欄位,共有欄位的資料存放在共用資料表中;私有欄位的資料則存放在各 租戶各自擁有的私有資料表中。為了協助系統工具進行後續的語句轉換,所以,
必須額外記錄各個共用資料表、私有資料表的欄位名稱資訊(不包含詮釋欄位名 稱)在 Columns_Metadata Table 中。
圖 3.6 是 Columns_Metadata Table 的欄位資訊存放格式。Columns_Metadata Table 主要記錄了實際在資料庫中,每個資料表所存在的欄位名稱,但不包含詮 釋欄位名稱(TenantId、Row)。
圖 3.6 Columns_Metadata Table 的欄位資訊存放格式:每一列以實際資料表名稱開頭,
以逗點分隔逐一記錄其所存在的欄位名稱(不包含詮釋欄位:TenantId、Row)
3.4.2 CREATE 語句的轉換、CREATE EXTENSION TABLE 的設計與實作
為了實現共有欄位的概念,軟體開發人員可以撰寫 CREATE 語句建立存放所有租 戶共有欄位資料的共用資料表;另外,CREATE EXTENSION TABLE 語句則是協助 軟體開發人員建立每個租戶各自擁有的私有資料表集合。
在進行共用資料表建立之前,必需先對共用資料表、私有資料表的命名方 式作規定以方便系統工具能夠透過資料表名稱來分辨該資料表屬於共用資料表
‧
例子 StudentInfoCommonFields、
SelectCourseCommonFields
、CourseInfoCommonFields…
NccuStudentInfo、
NccuSelectCourse、
NccuCourseInfo…
A. CREATE 語句的轉換 語句後(line 7),透過 JSqlPaeser 進行語句結構剖析以獲得語句元素,,例如:
資 料 表 名 稱 ( 此 為 CourseInfoCommonFields) 以 及 欄 位 宣 告 的 部 份 ( 此 為
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
30
CourseId Char(50) ,CourseName Char(50)…)。最後,如圖 3.8 紅字部分,在 原 SQL 語句中欄位宣告的部分加入了詮釋欄位(TenantId、Row)的宣告,同時,
將詮釋欄位設置欄位限制為 Not Null;另外,增加一個 Composite Primary Keys 以確保(TenantId , Row)的組合會是唯一。
圖 3.7 CREATE 語句範例
圖 3.8 CREATE 語句轉換後的結果
隨著共用資料表的建立,系統工具也會自動更新 Columns Meta data Table,
新增一筆記錄共用資料表的欄位資訊在 Columns_Metadata Table(圖 3.9)。
圖 3.9 執行 CREATE 語句後,Columns_Metadata Table 的更新結果
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
31
一般來說,欄位宣告有四種類型的 Integrity Constraints[21],除了最基 本的 Domain Constraints 以外(亦即欄位資料型態限制),有時也會結合其他三 種條件限制:Entity Integrity、Referential Integrity 以及 User Defined Integrity。
由於本系統工具在設計上部份採取共用資料表的架構,所以,在處理 Integrity Constraints 的時候會發生一些問題,必須將 TenantId 這個詮釋欄 位納入考量。以圖 3.10 的 Uniqueness Check 處理為例,假定要將 CourseId 這 個共有欄位設定為 Unique,則需要透過多欄位的唯一限制來協助處理(如圖 3.10 方框所示)。目前本系統工具尚未支援所有類型的 Integrity Constraints,其 他有關於 Integrity Constraints 的討論會在第五章做出進一步地探討。
圖 3.10 處理 Integrity Constraints 的範例
B. CREATE EXTENSION TABLE 語句的設計概念及實作
CREATE EXTENSION TABLE 語句的設計概念主要是為了協助軟體開發人員在 新增租戶的時候,可以撰寫該類型的語句建立新租戶所獨自擁有的私有資料表
‧
集合。所以,CREATE EXTENSION TABLE 語句的實作主要有兩個步驟:
1. 查詢 Columns_Metadata Table 找出所有的共用資料表名稱並產生私有資料 表名稱。
2. 為新加入的租戶建立其獨自擁有的私有資料表集合。
圖 3.11 CREATE EXTENSION TABLE 語句範例
圖 3.12 產生私有資料表名稱的流程
以圖 3.11 的 CREATE EXTENSION TABLE 語句為例(line 6),先利用共用資 料表名稱的關鍵字”CommonFields”在 Columns_Metadata Table 中搜尋出所有 已存在的共用資料表名稱。接下來,為新加入的租戶建立其獨自擁有的私有資 料表合(圖 3.12),首先,將所搜尋到的共用資料表名稱中的關字”CommonFields”
刪除並在資料表名稱前面加上 TenantId(此為 Nccu)以作為識別,組合成私有資 料表名稱;最後,產生 CREATE 語句(圖 3.13),在欄位宣告的部分加入了詮釋欄
2. 將”CommonFields”關鍵字刪除
3. 前面加上 TenantId
4. 結果即為私有資料表名稱
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
33
位(TenantId、Row)的宣告,同時,將詮釋欄位設置欄位限制為 Not Null;另外,
增加一個 Composite Primary Keys 以確保(TenantId , Row)的組合會是唯一。
圖 3.13 實作 CREATE EXTENSION TABLE 語句概念所產生的 CREATE 語句
同時,在 Columns_Metadata Table 進行更新的動作,新增一筆記錄(圖 3.14) 該私有資料表(此為 NccuCourseInfo)的欄位資訊在 Columns_Metadata Table。
圖 3.14 執行 CREATE EXTENSION TABLE 語句後,Columns_Metadata Table 的更新結果
圖 3.15 多個共用資料表存在,實作 CREATE EXTENSION TABLE 語句所產生的 CREATE 語句
圖 3.16 多共用資料表存在時,執行 CREATE EXTENSION TABLE 語句後,
Columns_Metadata Table 的更新結果
事實上 CREATE EXTENSION TABLE 語句概念是由多個 CREATE 語句所實作而