唐歡徠
(華南理工大學 計算機科學與工程學院,廣東 廣州510640)
SQL Server 2005中增加了新的XML支持,引入了一種稱為XML的本機數據類型。用戶創建的數據表,可以在關系列之外還有一個或多個 XML類型的列,此外,還允許帶有變量和參數。為了更好地支持XML模型特征(例如文檔順序和遞歸結構),XML值以內部格式存儲為大型二進制對象(BLOB)[1]。SQL Server 2005將 XML數據存儲在關系數據庫中會給數據管理和查詢處理帶來好處。SQL Server 2005提供了強大的查詢和修改關系數據的能力,而且已經擴展到查詢和修改XML數據。 它支持關系數據和XML數據之間的互操作,這為更廣泛地采用 XML功能開辟了道路[3]。關系列與XML類型列并存的方式,既能保持原有關系數據庫的優點,又能在關系數據庫中使用XML更好地描述復雜的數據結構,如層次或樹狀的數據。
本文在CRM系統客戶屬性表中引入了XML類型,并且使用XML配置文件描述具有層次結構的客戶屬性,并根據此配置文件動態生成界面,因而實現了客戶屬性的可擴展操作。使用XML字段存儲和擴展客戶屬性以及具有層次性的客戶屬性,并在系統中實現了對客戶屬性的添加、修改、刪除、查詢等操作。可擴展的CRM系統,既保持了原有基于關系數據庫的CRM系統的特點,又可以增刪客戶屬性,或記錄較為復雜的客戶屬性,因而具有較好的靈活性。
用戶可以在同一個數據庫中存儲關系數據和XML數據。簡而言之,數據庫引擎除了知道如何遵循關系數據模型之外,還知道如何遵循XML數據模型。在升級到SQL Server 2005之后,關系數據和SQL應用程序仍然能夠正常工作。對SQL Server 2005中XML數據類型的列,可以建立XML列的索引,并對其進行查詢和修改。數據庫利用現有的關系基礎結構和引擎組件(例如存儲引擎和查詢處理器)來進行 XML處理[1]。
多樣化的結構數據需求和保留數據間隱含約束的必要性是擴展關系型數據模型支持XML文檔存儲的最重要的兩個原因。另外,SQL語言在處理半結構化或者標記信息時的局限性也促使了XQuery語言的發展。XQuery語言在設計的時候已經考慮到XML數據的特性和處理XML數據的相關問題[1]。
SQL Server 2005提供了對XQuery的全面支持,它將XPath 2.0作為導航語言包括在內,其實現提供了用于遍歷節點(for)、節點檢查(where)、返回值(return)和排序(order by)的構造,也提供了用于在查詢過程中重新進行數據構形的元素構造。XML數據類型提供了4種檢索XML值或實例的方法:query()、value()、exist()和 nodes(),以及修改 XML 數據的modify()方法。前4個方法均接受XQuery表達式作為參數,其中:query()方法用于提取 XML 實例的部分;value()方法用于從XML實例提取標量值;exist()方法用于對XML實例進行存在性檢查;nodes()方法用于從XML實例片斷產生一個新的XML實例。modify()方法執行XML DML以完成對XML數據片段的修改,如添加或刪除子樹或者更新標量值等,而需要修改的數據也是通過XQuery來定位的[2]。
結構化數據應該存儲在表和關系列中。當應用程序需要執行細粒度查詢和數據修改時,對于使用XML的半結構化數據和標記數據,XML數據類型是比較合適的選擇[4]。
在基于關系數據庫的CRM系統中,為了實現客戶屬性的擴展,基本的客戶屬性被看作屬于結構化的數據,用關系數據庫的普通數據類型存儲,客戶的擴展屬性使用SQL Server 2005中專門的XML數據類型存儲。
可擴展的CRM系統,核心是可擴展的客戶屬性的設計[2],允許系統動態地增減客戶的屬性,因此這里提出一種基于關系數據以及XML數據混合的方式來實現可擴展的客戶屬性模型。基于此模型,系統可以實現對關系數據庫數據和XML數據的混合操作,如查詢、插入、更新、刪除。首先抽取CRM系統擁有的共同的客戶屬性,如客戶姓名、電話、年齡、地址等,這些固定的屬性直接對應關系數據庫里的列。客戶的擴展屬性,由于其可動態增刪的特性,具有一定半結構化的特征,因此使用SQL Server 2005中增加的專門的XML數據類型存儲。在這個XML字段中,可擴展的客戶屬性以屬性名和屬性值成對出現。對XML字段使用XQuery語言進行查詢與更新操作,即可實現對客戶擴展屬性的動態增刪。因此本CRM系統中記錄客戶屬性的數據表的結構為若干個基本屬性的字段加一個XML字段,如圖1所示。

圖1 對客戶屬性的擴展Fig.1 Expansion of customer property
由于關系數據和XML數據存放于同一數據表中,對客戶數據的查詢被分為2種類型,查詢客戶的基本屬性時,使用的是普通的SQL查詢;對客戶數據的擴展屬性,也就是XML字段查詢時,使用的是XQuery查詢[3]。具體的查詢流程如圖2所示。

圖2 查詢流程Fig.2 Flow chart of query
對某個客戶資料進行普通SQL查詢時,對于表中的非XML字段,可以由程序直接呈現到界面上,對于XML字段,基于ASP.NET的應用程序可以使用命名空間System.Data.SqlTypes中的SqlXml類型對象對XML字段進行處理,使用此對象創建一個XmlReader類型變量,讀取XML字段里的某個節點的客戶擴展屬性的屬性名和屬性值,從而實現對客戶擴展屬性的查詢顯示。
對于客戶擴展屬性即XML字段的查詢,可以使用SQL Server 2005里所支持的XQuery語句進行查詢。以下的查詢,條件是客戶擴展屬性中存在“推薦人”屬性,且“推薦人”為“李東”,返回符合此條件的所有客戶的名字、電話、地址、性別以及表示此客戶的擴展屬性的XML字段[4]:

可擴展CRM系統的插入操作也分為對數據表的行插入操作和對XML字段添加節點的插入操作。對數據表的行插入操作,首先從頁面上讀取客戶屬性中的基本屬性,然后讀取客戶擴展屬性,使用System.Xml命名空間的XmlDocument類型的對象把擴展屬性封裝成為一個XML文檔,插入數據庫時可以使用XmlDocument類型的InnerXml屬性構建Insert into語句即可把XML文檔的內容保存到數據庫表的XML字段中。
對XML字段添加節點的插入操作,在SQL Server 2005中對XML字段使用modify方法,然后使用XML數據修改語言DML中的insert語句就可以實現對XML中的某一節點進行更新。下面的SQL語句實現了對ID為129的客戶的擴展屬性中增加“推薦人”屬性且屬性值為“李東”:


對CRM系統的更新操作也可以分為對數據表中的行更新操作和對XML字段的某節點更新操作。對基本客戶屬性的更新操作直接使用SQL的update語句。對客戶擴展屬性中的某一屬性的值,即XML字段某節點進行更新時,在SQL Server 2005中對XML字段使用modify方法,然后使用XML數據修改語言DML中的replace value of語句就可以實現對XML中的某一節點進行更新。以下語句實現了把ID為129的客戶的擴展屬性中的“推薦人”屬性的值的更改:

可擴展CRM系統中對客戶屬性的查詢既有SQL也有XQuery,或者是二者結合形成更復雜的查詢,最終通過ASP.NET進行業務處理后呈現到用戶面前。基本框架如圖3所示。

圖3 基本框架Fig.3 Basic framework
如圖4所示,在可擴展CRM系統應用于某部門之前,可以事先對系統的客戶擴展屬性進行整體配置,增加適用于本部門所有客戶的擴展屬性,這個配置文件以XML的形式存放于服務器中[5]。而在對某個特定客戶屬性進行添加操作時,先讀取配置文件,動態加載客戶的基本屬性和配置中的擴展屬性,另外,還可以根據此客戶的特殊性動態增刪其特有的屬性,從而更好實現客戶屬性的可擴展性。

圖4 對客戶屬性的操作Fig.4 Operation of customer property
配置文件片段如圖5所示,生成的動態界面如圖6所示。

圖5 配置文件片段Fig.5 Configuration fragment

圖6 動態界面片斷Fig.6 Dynamic interface fragment
基于本文所提出的CRM可擴展屬性模型開發的CRM系統已經在某汽車配件公司上線使用,解決了CRM從一個系統遷移到另一個系統往往要對關系數據庫進行重新設計的問題。由于客戶屬性模型是可擴展的,系統能夠在市場、銷售、客戶服務、財會、產品庫存各個部門使用,實現了CRM中客戶數據在各個部門的共享以及客戶數據的擴展,大大提高了公司運作的效率,成為公司利潤提高的加速器。
詳細介紹了XML在基于關系數據庫的CRM系統中的應用,并使用XML與關系數據庫相結合的方式,利用SQL Server 2005中對XML強大的支持,實現了可擴展的客戶屬性模型,從而提高了CRM的可擴展性,使CRM更能適應不同的部門對客戶屬性的不同需求,很大程度上克服了原有基于關系數據庫的CRM系統無法實現擴展客戶屬性且屬性不能呈現層次或樹狀結構的缺點,使不同的客戶可以擁有不同的擴展屬性,并且可以保存較為復雜的客戶屬性,從而為針對CRM進行數據挖掘提供了更豐富的數據來源,提高CRM的潛在價值和應用效率。
[1]Scott Klein.SQL Server 2005 XML高級編程[M].王馨,譯.北京:清華大學出版社,2007.
[2]龐啟盛,楊東勇.基于XML的CRM系統的研究與實現[J].計算機工程與設計, 2006, 27(14):2637-3639.PANG Qi-sheng,YANG Dong-yong.Research and realization of CRM system with XML[J].Computer Engineering and Design,2006,27(14):2637-3639.
[3]孟小峰,王宇,王小鋒.XML查詢優化研究[J].軟件學報,2006,17(10):2069-2086.MENG Xiao-Feng,WANG Yu,WANG Xiao-feng.Research on XML query optimization[J].Journal of Software,2006,17(10):2069-2086.
[4]孔令波,唐世渭,楊冬青,等.XML數據的查詢技術[J].軟件學報,2007.18(6):1400-1418.KONG Ling-bo,TANG Shi-wei,YANG Dong-qing,etal.Querying techonniques for XML Data[J].Journal of Software,2007,18(6):1400-1418.
[5]秦杰,楊樹強.XML數據庫技術研究[J].計算機科學,2003,30(8):6-9.QIN Jie,YANG Shu-qiang.XML Database Researching[J].Computer Science,2003,30(8):6-9.
[6]徐小平.基于B/S結構的分布式CRM系統的設計與實現[J]計算機工程與設計,2003,24(13):70-72.XU Xiao-ping.Design and implementation of distributed customer relationship management system based on B/S construction[J].Computer Engineering and Design,2003,24(13):70-72.