第五章 結論與未來研究方向
5.2 未來研究方向
行語句轉換的執行時間。最後,實際進行多項效能測試和 Private Table Layout 比較,從結果顯示,以 Extension Table Layout 的概念並且在其詮釋欄位建立 索引(Index)的方式去設計多租戶應用程式之資料層級,軟體開發人員沿用一租
1. 本研究暫以租戶識別碼(TenantId)作為資料隔離的主要機制,在資料安全 性的考量下,從租戶的心靈層面看來仍有些疑慮,但若能在應用程式層級 提供更完善的機制去防止惡意的用戶利用 TenantId 來偽裝自己的身分竊取 其他用戶的資料,相信一定能夠提高資料的安全性。
2. 期望未來能夠在極少的更動之下,開發一套系統工具協助資料進行系統化 地轉移,改以 Extension Table Layout 的資料存放方式來儲存資料。接下
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
69
來,透過本系統工具進行語句轉換,讓軟體開發人員能夠沿用一租戶一資 料表的寫法來撰寫 SQL 語句。
3. 由於本研究在部份設計上採取共用資料表的架構,從 4.2 小節所進行的實 驗推斷租戶的數量會影響本系統工具進行語句轉換的執行時間,因此,當 租戶的數量大幅增加以後,要如何維持資料庫存取、查詢的效能在一定的 水準也是未來在實際使用本系統工具時需要解決的問題。
4. 如何在共用資料表的架構下,妥善處理 Integrity Constraints 是未來待 解決的問題。如同 3.4.2 小節所提到的,目前本系統工具在實作 Integrity Constraints 的處理,主要是透過資料庫所提供的多欄位限制加上 TenantId 的概念來完成,其他目前尚未支援的部份或許之後也可以仿造上述的方式 來解決。
‧
[1] [Chong et al.06] F. Chong, G. Carraro, and R. Wolter, “Multi-Tenant DataArchitecture,” http://msdn.microsoft.com/en-us/library/aa479086.aspx [2] [Mell et al.11] P. Mell, and T. Grance, “Recommendations of the National
Institute of Standards and Technology,” in The NIST Definition of Cloud Computing, 2011.
[3] [Force.com] The Design of the Force.com Multitenant Internet Application Development Platform
[4] [Aulbach et al.09] Stefan Aulbach, D. Jacobs, A. Kemper, M. Seibold, “A Comparison of Flexible Schemas for Software as a Service,” in SIGMOD’09, June 29–July 2, 2009.
[5] [Aulbach et al.08] Stefan Aulbach, T. Grust, D. Jacobs, A. Kemper, J. Rittinger,
“Multi-Tenant Databases for Software as a Service: Schema-Mapping Techniques,” in SIGMOD’08, June 9–12, 2008.
[6] [Foping et al. 07] Franclin S. Foping, I. M. Dokas, J. Feehan, S. Imran, “A New Hybrid Schema-Sharing Technique for Multitenant Applications”.
[7] [Univ et al. 10] Zhejiang Univ., Hangzhou, “Transforming relational database into HBase: A case study,” in IEEE’10, July 16–18, 2010.
[8] [Hisashi et al. 10] SHIMAMURA Hisashi, S. Kenji, K. Takayuki, N.Shoji,
“Realization of the High-density SaaS Infrastructure with a Fine-grained Multitenant Framework”.
[9] [Ramasubramanian Thiyagarajan et al. 10] Ramasubramanian Thiyagarajan, S.
Kuppusamy, “Enabling Multi-Tenancy in Web Applications,” in devx.com, June 10, 2010.
[10] [Scott Chate 10] Scott Chate, “Convert your web application to a multi-tenant
‧
SaaS solution,” in ibm.com, Dec 14, 2010.
[11] [Martin Grund et al. 08] Martin Grund, M. Schapranow, J. Krueger, J. Schaffner, A. Bog, “Shared Table Access Pattern Analysis for Multi-Tenant Applications,”
in IEEE’08, 2008.
[12] [Alfons Kemper] Alfons Kemper, “Database Technology for SaaS(Software as a Service)”.
[13] 吳定威,「支援多租戶應用程式的 SQL 語句轉換機制」,國立政治大學資訊 科學系碩士學位論文,台北,民國 101 年 1 月。
[14] JSqlParser http://jsqlparser.sourceforge.net/
[15] SQL Statement tutorial http://www.w3schools.com/sql/default.asp [16] Eclipse http://www.eclipse.org/
[17] JSP
tutorial
http://www.jsptut.com/[18] Apache Tomcat http://tomcat.apache.org/
[19] MySQL http://www.mysql.com/
[20] Databse Design-Design pattern: many-to-many
http://www.tomjewett.com/dbdesign/dbdesign.php?page=manymany.php [21] Data Integrity
http://msdn.microsoft.com/en-us/library/aa933058(v=sql.80).aspx [22] Bootstrap http://twitter.github.com/bootstrap/
[23] XAMPP http://www.apachefriends.org/en/xampp.html [24] XAMPP
tutorial
http://www.mediawiki.org/wiki/Manual:Running_MediaWiki_on_XAMPP [25] JDBC http://www.oracle.com/technetwork/java/javase/jdbc/index.html [26] W3C http://www.w3.org/
[27] The Long Tail http://www.longtail.com/the_long_tail/about.html [28] UML http://www.uml.org/
‧
[[ ]] :: SQL statement using Private Table Layout SQL statement using Extension Table Layout .
//Notations introduction
Bold fonts is a string in the SQL statement, for example, CREATE TABLE
Italic fonts is a element in the SQL statement, for example, TableName is the table
name of the statement , ColumnNames is a list of impacted column names in the statement ; ColumnValues is a list of impacted column values in the statement . string1 string2: return a new string of the concatenation string1and string2 .
string substring : delete a substring (substring) from the end of the string (string).
GetAllCN() : scan Column_Metadata Table to return a list of all common table names .
Mcoln( ColumnNames ) : return two lists : CommonColumnNames , PrivateColumnNames .
CommonColumnNames = col | col is a common table column name ,
col in ColumnNames.
PrivateColumnNames = col | col is a private table column name ,
col in ColumnNames. Mcolv( ColumnValues ) : return two list : CommonColumnValues , PrivateColumnValues
CommonColumnValues = val | val is a common table column value ,
val in ColumnValues.
PrivateColumnValues = val | val is a private table column value , val in ColumnValues.
Mue( UpdateExpressions ) : return two lists : CommonUpdateExpressions ,
PrivateUpdateExpressions .
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
73
CommonUpdateExpressions = col = val | col = val in UpdateExpressions , col is a
common table column name.PrivateUpdateExpressions = col = val | col = val in UpdateExpressions , col is a
private table column name. CtoP(TableName , TenantId ) : TenantId TableName CommonFields , return a private table name that converted from a given
common table name (TableName) and tenant id (TenantId) .
Mcn(TableName) : TableName CommonFields , return a common table name.
Mpn(TableName,TenantId ) : TenantId TableName , return a private table name.
GetMR( TableName ) : get the maximum row in a given table (TableName ).
GenS(Statement ) : generate a statement from a given statement(Statement )
‧
//Rules for CREATE statement, for example, CREATE TABLE TableName ( ColumnDefinitions ) 1. [[ (CREATE TABLE TableName ( ColumnDefinitions )) ]]
= GenS( CREATE TABLE TableName
( TenantId Char (50) not null , Row Integer not null , ColumnDefinitions ,
Primary key (TenantId , Row)) )
//Rules for CREATE EXTENSION TABLE statement, for example, CREATE EXTENSION TABLE TenantId
2. [[ (CREATE EXTENSION TABLE TenantId ) ]]
= FOR CommonTableName IN GetAllCN() DO
GenS( CREATE TABLE CtoP(CommonTableName , tenantId ) ( TenantId Char (50) not null ,
Row Integer not null ,
Primary key (TenantId , Row) ) )
END//Rules for ALTER statement, for example,
ALTER TABLE TableName AlterType AlterExpression
3. [[ (ALTER TABLE TableName AlterType AlterExpression, TenantId ) ]]
= GenS ( ALTER Mpn(TableName , TenantId ) AlterType AlterExpression )
4. [[ (ALTER TABLE TableName AlterType AlterExpression) ]]
= GenS ( ALTER TableName AlterType AlterExpression )
‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
75
//Rules for INSERT statement, for example, INSERT INTO TableName ( ColumnNames )
VALUES ( ColumnValues )
5. [[ (INSERT INTO TableName ( ColumnNames ) VALUES ( ColumnValues ) , TenantId )]]
= (CommonColumnNames , PrivateColumnNames ) Mcoln(ColumnNames ) ; (CommonColumnValues , PrivateColumnValues ) Mcolv(ColumnValues ) ;
GenS ( INSERT INTO Mcn(TableName)
( TenantId , Row , CommonColumnNames ) VALUES
( tenantid , GetMR( Mpn( TableName,TenantId ) ) , CommonColumnValues ) ) ; GenS ( INSERT INTO Mpn( TableName , TenantId )
( TenantId , Row , PrivateColumnNames ) VALUES
( TenantId , GetMR( Mpn( TableName , TenantId ) ) , PrivateColumnValues ) )
‧
//Rules for UPDATE statement, for example, UPDATE TableName
SET UpdateExpressions
WHERE Conditions , where UpdateEexpressions is like ColumnName
1= ColumnValue
1, ..,ColumnName
n= ColumnValue
n6. [[ (UPDATE TableName SET UpdateExpressions WHERE Conditions, TenantId ) ]]
= (CommonUpdateExpressions , PrivateUpdateExpressions ) Mue(UpdateExpressions ) ; FOR row
IN ( SELECT Row
FROM
( Mcn( TableName )
INNER JOIN Mpn( TableName , TenantId )
ON Mcn( TableName ).TenantId = Mpn( TableName , TenantId ).TenantId AND Mcn( TableName ).Row = Mpn( TableName , TenantId ).Row ) WHERE TenantId = TenantId AND (Conditions ))
DO
GenS( UPDATE Mcn( TableName ) SET CommonUpdateExpressions
WHERE TenantId = TenantId AND Row = Row ) ; GenS( UPDATE Mpn( TableName,TenantId )
SET PrivateUpdateExpressions
WHERE TenantId = TenantId AND Row = Row )
END‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
77
//Rules for DELETE statement, for example, DELETE FROM TableName
WHERE Conditions
7. [[ (DELETE FROM TableNme WHERE Conditions, TenantId ) ]]
= FOR Row
IN ( SELECT Row
FROM
( Mcn( TableName )
INNER JOIN Mpn( TableName , TenantId )
ON Mcn( TableName ).TenantId = Mpn( TableName , TenantId ).TenantId AND Mcn( TableName ).Row = Mpn( TableName , TenantId ).Row ) WHERE TenantId = TenantId AND (Conditions ))
DO
GenS( DELETE Mcn(TableName )
WHERE TenantId = TenantId AND Row = Row ) ; GenS( DELETE Mpn( TableName , TenantId )
WHERE TenantId = TenantId AND Row = Row )
END‧ 國
立 政 治 大 學
‧
N a tio na
l C h engchi U ni ve rs it y
78
//Rules for SELECT statement, for example, SELECT ColumnNames
FROM TableName WHERE Conditions
8. [[ (SELECT ColumnNames FROM TableName WHERE Conditions, TenantId ) ]]
= GenS( SELECT ColumnNames