李書攀
摘 要
面向對象數據庫為適應新的數據庫應用需要而產生的數據庫系統,它將面向對象的方法與數據庫技術融合在一起。本文針對在程序開發時,數據庫schema經常變動而導致原有存放在數據庫中的數據失效,頻繁將數據導入導出的問題,構建基于schema可變技術的面向對象數據庫,使得數據庫在schema變化的過程中,盡可能的保留數據庫中存儲的原有數據,減少數據庫中數據因schema變化而引起的數據丟失問題,提高面向對象數據庫的可用性。
【關鍵詞】schema可變 面向對象數據庫
面向對象對象數據庫是面向對象技術與數據庫技術的結合,構成新的數據庫領域研究和發展方向,使數據庫管理系統能夠全面的支持面向對象的模型,使數據庫中的數據接近于面向對象程序所定義的語義結構,實現面向對象程序與數據庫的無縫銜接,提高數據庫模擬和操縱客觀對象的能力。同時面向對象數據庫面臨著與其它數據庫相似的問題,如數據庫的可擴展性問題、數據庫性能提升問題等。
本文針對在開發設計數據庫時schema經常變動而導致原有存放在數據庫中的數據失效,頻繁將數據導入導出的問題,提出一種基于schema可變技術的面向對象數據庫,使得數據庫能夠在schema變動的情況下盡量保證能夠繼續使用以前的存儲的數據而不必重新導入數據,提高數據庫的可用性。
1 數據庫的概要設計
依據分層設計的思想是將每個模塊劃分為不同的層次。整個數據庫共分為三個層次,從上到下分別是接口層、數據操縱層、數據存儲層,結構如如圖1所示。
1.1 用戶接口層
該層是數據庫提供給用戶的接口,主要是用于規范客戶端程序如何訪問數據庫的應用接口,其提供了諸如查詢和更新數據庫中數據的方法。該層主要包含兩個部分:
(1)程序接口:增加(Create)、查詢(Retrieve)、更新(Update)和刪除(Delete)操作是數據庫的最基本的操作,它們主要被用于描述軟件系統中持久層的基本操作,同時也是數據庫中最為常用的操作。
(2)管理接口:提供數據庫的基本方法,如刪除schema結構,查看數據庫表中數據內容等。
1.2 數據操縱層
該層主要負責對數據庫內的對象進行操縱,包括反射Java的類結構、類的schema的存儲、索引的維護以及創建等,主要分為以下幾個模塊:
(1)Reflector:反射(reflector)是Java語言提供的一種動態的獲取加載到JVM中的類的方法、屬性以及方法和屬性上的標注的技術。在schema可變技術的面向對象數據庫中,在很多的地方需要借助到Java語言的反射技術,如類結構的解析、schema的檢測、實例中數據的獲取等。
(2) ClassicMetadata:主要是用來存儲解析出來的類的結構,避免對已經解析過的類的結構再次進行解析,管理類的版本以及schema的演化。
(3)Index Query:主要是對索引進行管理。它的功能體現在以下幾個方面:①當需要創建索引時,根據創建索引的條件,創建索引;②當查詢條件使用到索引時,根據索引的特點以及查詢的方式,選擇一種最為適合此種查詢的索引操作;③當用戶插入的數據造成索引的更新時,更新和調整索引等;④對索引的狀態進行管理和監控。
1.3 數據存儲層
該層主要用于維護已經存儲在數據庫中的數據,包括類的存儲的組織方式,類的索引的結構等。主要分為以下幾個模塊:
(1)Class Index:由于在面向對象數據庫中每個類的實例都是用UUID標識的。根據UUID的重復率低、長度固定、數據結構為string類型的特點,構建索引全部類的實例的數據結構。
(2)Class Field index:由于在每個類中,可以依據每個類的屬性,為某個屬性建立索引,Classic Field index提供了索引,方便用戶快速查詢到需要的數據。
(3)ACID transection slot:ACID是指事務的原子性、一致性、獨立性及持久性,是數據庫必須具備的性質。ACID transection slot就是為了保證ACID在數據庫中的實現而設置的。同時它也提供了部分基本的數據結構,為數據的存儲提供了可能。
2 schema可變技術的實現
2.1 面向對象數據庫中的Schema可變技術
數據庫的Schema是對數據模型的實現。Schema表示了數據庫的結構或者是數據庫中的一個名字空間,包含了一組表結構、視圖、和存儲過程等對象。在面向對象數據庫中,數據庫的schema是通過類的結構來表示的,schema的變化可能會導致數據庫中存放的原有數據失效或丟失。
Schema可變技術即意味著當數據庫的類結構發生變化時,如果該類的部分數據以及數據的限定與上一個版本的類結構中存儲的數據以及數據限制兼容時,則上一個版本的類結構存儲的數據依然可以在當前的類結構當中使用,不必進行數據庫中數據的調整或者更新操作。再該面向對象數據庫中,通過建立的類結構與數據庫中存儲的數據做映射的方式實現schema可變技術,我們使用的映射方法為:將類的名稱與版本號相結合的方式——“原類名+版本號”為類命名。
數據庫支持schema可變技術可以帶來很多的優勢:
(1)盡可能的保留已經存儲在數據庫中的原始數據,使其在schema發生變動時,不丟失數據。
(2)在schema變動時,不必對數據庫進行調整或者更新的操作,簡化了數據庫管理員的工作。
2.2 面向對象數據庫中Schema變化的原因
Schema變化是由類結構的變化造成的,類結構變化的原因可分為以下幾種:endprint
2.2.1 由于類自身的變化而造成的
(1)增加屬性。
(2)減少屬性。
(3)改變屬性的類型。
(4)改變屬性的約束條件。
2.2.2 由于父類的變化而造成的
在面向對象語言中存在繼承關系,即子類繼承父類中的屬性,當該類父類的結構發生改變的時,子類的結構會同時發生改變。
2.3 Schema可變技術的主要流程
在Schema可變的面向對象數據庫中,實現schema可變技術的重要操作位主要有三個,分別是是Schema的解析,Schema發生變化后的處理以及如何將Schema中的數據添加到不同版本的類結構中。
2.3.1 Schema的解析流程
Schema的解析是指獲取指定類內部的屬性以及屬性的標識等信息的過程,解析完之后會將解析后的schema信息添加到數據庫中。其具體流程如下所示:
(1)將類名加入隊列中,并從隊列中取出一個類名進行解析,如果該類為object則放棄解析,如果不是object則轉到2。
(2)將該類的父類父類添加到隊列中。
(3)逐個解析該類的屬性。
a. 如果是基本類型,則解析其名稱以及約束。
b. 如果不是基本的類型,則解析器名稱以及約束,并將該類的名稱加入到隊列中。
(4)轉到1。
2.3.2 Schema變化后的對Schema處理
Schema變化后,數據庫能夠識別出該schema的變化,然后根據解析出來的類結構,生成新的版本信息,如果該類與數據庫中存儲的該類以前的版本信息兼容,則生成新的類結構和版本號,具體流程如下所示:
(1)檢測該類的結構是否存在,如果存在則不再進行類結構的演化并刪除該結構;如果不存在,則轉到(2)。
(2)根據兼容性列表(如表1所示),檢測該schema中保存的類的結構是否與其它的版本相沖突,如果不沖突,則存儲該類的結構,轉到(4);如果沖突,則給出沖突的原因、版本號等信息。
(3)根據已經存在的類的結構,生成新的版本號。
2.3.3 Schema變化后對類的處理
當程序進行查詢操作時,根據傳遞過來的客戶端的schema信息,查詢在服務器端是否已經存儲與該Scheme相應的版本,如果不存在,則返回空;如果存在,則依據查詢條件進行查詢,具體流程如下所示:
(1)從數據庫中獲取該類的所有數據,如果數據庫中所有的類都應解析完畢,則退出解析過程并返回結果;如果還有未解析的類,則取出一個,進行解析。
(2)根據數據庫中存儲的類中的屬性和類的版本信息,逐一解析數據庫中存儲的類的每個屬性,并將值填入查詢結果中。
a.在數據庫中的類不包含該類屬性時,如果該屬性允許此值為空,則將該屬性設置為null;如果該屬性不允許為空,則放棄對數據庫中類的解析,轉到1。
b. 類中同名屬性的類型發生改變,則放棄對數據庫中存儲的類的解析并轉到(1)。
c. 類中屬性的標示發生改變,如果兼容則繼續解析,如果不兼容,則放棄對數據庫中存儲的類的解析并轉到1。
d. 如果數據庫中的類包含該類的屬性時,如果兼容則繼續解析,如果不兼容,則放棄對數據庫中存儲的類的解析并轉到1。
(3)轉到1。
3 系統測試
3.1 面向對象數據的存取
3.1.1 構造POJO類結構
public class Person {
private String name;
private int age;
}
3.1.2將name設置為test,age設置為20,并將該類數據存入數據庫中。
3.1.3從數據庫中取出數據,name=test,age=20
由此可以說明,數據庫能夠完成對類結構的解析,并可以取出相應的數據。
3.2 在兼容的情況下schema變更測試
3.2.1更改后的Person類
public class Person {
private String name;
private int age;
private String description;
}
在這里增加一個屬性description,它為String類型的,默認的情況下,允許該字段為null,所以屬于能夠與前邊所存儲的類的實例相兼容。
3.2.2在服務器端輸入命令對版本進行查看,版本信息顯示如下內容
V1:Person:Name String,Person:Age Int
V2:Person:Name String,Person:Age Int,Person:description String
3.2.3讀取數據,讀取結果為:Name=test,Age=20,Description= 。
在這組測試中,可以得出該數據庫所提供的schema可變技術是正確的。
3.3 在不兼容情況下schema變更測試
3.3.1更改后的Person類
public class Person {
private String name;
private Age age;
}
在這里將原有的名稱為age的屬性由int修改為Age類。
3.3.2使用該類添加數據,則返回錯誤信息
“There is collision on Person:name, please recheck the schema. Collision version V1”
在這組測試中,可以得出該數據庫可能夠識別不兼容的schema,并提示有沖突的版本。
4 總結
基于schema可變技術的面向對象數據庫實現了schema可變技術,使得數據庫在schema變化的過程中,盡可能的保留數據庫中存儲的原有數據,減少數據庫中數據因schema變化而引起的數據丟失問題,提高面向對象數據庫的可用性。但是其也有部分不足的地方,如不能夠很好的支持泛型、對靜態變量不能夠做到有效的支持、不支持事務等。在以后的工作中,將根據面向對象數據庫的發展逐漸的完善該數據庫,使其融入新的技術融入更多的技術并且在已有的技術上進行創新。
參考文獻
[1]Object database[N/OL].2010.http://en.wikipedia.org/wiki/Object_database.
[2]埃史爾.Java編程思想(第四版)[M].北京:機械工業出版社,2007.
[3]王珊、薩師煊等.數據庫系統概論[M]. 北京:教育出版社,2006.
[4]Richardson.POJOs IN ACTION:Developing Enterprise Applications with Lightweight Frameworks[M]. Oreilly & Associates Inc,2007.
作者單位
南陽師范學院計算機與信息技術學院 河南省南陽市 473061endprint
2.2.1 由于類自身的變化而造成的
(1)增加屬性。
(2)減少屬性。
(3)改變屬性的類型。
(4)改變屬性的約束條件。
2.2.2 由于父類的變化而造成的
在面向對象語言中存在繼承關系,即子類繼承父類中的屬性,當該類父類的結構發生改變的時,子類的結構會同時發生改變。
2.3 Schema可變技術的主要流程
在Schema可變的面向對象數據庫中,實現schema可變技術的重要操作位主要有三個,分別是是Schema的解析,Schema發生變化后的處理以及如何將Schema中的數據添加到不同版本的類結構中。
2.3.1 Schema的解析流程
Schema的解析是指獲取指定類內部的屬性以及屬性的標識等信息的過程,解析完之后會將解析后的schema信息添加到數據庫中。其具體流程如下所示:
(1)將類名加入隊列中,并從隊列中取出一個類名進行解析,如果該類為object則放棄解析,如果不是object則轉到2。
(2)將該類的父類父類添加到隊列中。
(3)逐個解析該類的屬性。
a. 如果是基本類型,則解析其名稱以及約束。
b. 如果不是基本的類型,則解析器名稱以及約束,并將該類的名稱加入到隊列中。
(4)轉到1。
2.3.2 Schema變化后的對Schema處理
Schema變化后,數據庫能夠識別出該schema的變化,然后根據解析出來的類結構,生成新的版本信息,如果該類與數據庫中存儲的該類以前的版本信息兼容,則生成新的類結構和版本號,具體流程如下所示:
(1)檢測該類的結構是否存在,如果存在則不再進行類結構的演化并刪除該結構;如果不存在,則轉到(2)。
(2)根據兼容性列表(如表1所示),檢測該schema中保存的類的結構是否與其它的版本相沖突,如果不沖突,則存儲該類的結構,轉到(4);如果沖突,則給出沖突的原因、版本號等信息。
(3)根據已經存在的類的結構,生成新的版本號。
2.3.3 Schema變化后對類的處理
當程序進行查詢操作時,根據傳遞過來的客戶端的schema信息,查詢在服務器端是否已經存儲與該Scheme相應的版本,如果不存在,則返回空;如果存在,則依據查詢條件進行查詢,具體流程如下所示:
(1)從數據庫中獲取該類的所有數據,如果數據庫中所有的類都應解析完畢,則退出解析過程并返回結果;如果還有未解析的類,則取出一個,進行解析。
(2)根據數據庫中存儲的類中的屬性和類的版本信息,逐一解析數據庫中存儲的類的每個屬性,并將值填入查詢結果中。
a.在數據庫中的類不包含該類屬性時,如果該屬性允許此值為空,則將該屬性設置為null;如果該屬性不允許為空,則放棄對數據庫中類的解析,轉到1。
b. 類中同名屬性的類型發生改變,則放棄對數據庫中存儲的類的解析并轉到(1)。
c. 類中屬性的標示發生改變,如果兼容則繼續解析,如果不兼容,則放棄對數據庫中存儲的類的解析并轉到1。
d. 如果數據庫中的類包含該類的屬性時,如果兼容則繼續解析,如果不兼容,則放棄對數據庫中存儲的類的解析并轉到1。
(3)轉到1。
3 系統測試
3.1 面向對象數據的存取
3.1.1 構造POJO類結構
public class Person {
private String name;
private int age;
}
3.1.2將name設置為test,age設置為20,并將該類數據存入數據庫中。
3.1.3從數據庫中取出數據,name=test,age=20
由此可以說明,數據庫能夠完成對類結構的解析,并可以取出相應的數據。
3.2 在兼容的情況下schema變更測試
3.2.1更改后的Person類
public class Person {
private String name;
private int age;
private String description;
}
在這里增加一個屬性description,它為String類型的,默認的情況下,允許該字段為null,所以屬于能夠與前邊所存儲的類的實例相兼容。
3.2.2在服務器端輸入命令對版本進行查看,版本信息顯示如下內容
V1:Person:Name String,Person:Age Int
V2:Person:Name String,Person:Age Int,Person:description String
3.2.3讀取數據,讀取結果為:Name=test,Age=20,Description= 。
在這組測試中,可以得出該數據庫所提供的schema可變技術是正確的。
3.3 在不兼容情況下schema變更測試
3.3.1更改后的Person類
public class Person {
private String name;
private Age age;
}
在這里將原有的名稱為age的屬性由int修改為Age類。
3.3.2使用該類添加數據,則返回錯誤信息
“There is collision on Person:name, please recheck the schema. Collision version V1”
在這組測試中,可以得出該數據庫可能夠識別不兼容的schema,并提示有沖突的版本。
4 總結
基于schema可變技術的面向對象數據庫實現了schema可變技術,使得數據庫在schema變化的過程中,盡可能的保留數據庫中存儲的原有數據,減少數據庫中數據因schema變化而引起的數據丟失問題,提高面向對象數據庫的可用性。但是其也有部分不足的地方,如不能夠很好的支持泛型、對靜態變量不能夠做到有效的支持、不支持事務等。在以后的工作中,將根據面向對象數據庫的發展逐漸的完善該數據庫,使其融入新的技術融入更多的技術并且在已有的技術上進行創新。
參考文獻
[1]Object database[N/OL].2010.http://en.wikipedia.org/wiki/Object_database.
[2]埃史爾.Java編程思想(第四版)[M].北京:機械工業出版社,2007.
[3]王珊、薩師煊等.數據庫系統概論[M]. 北京:教育出版社,2006.
[4]Richardson.POJOs IN ACTION:Developing Enterprise Applications with Lightweight Frameworks[M]. Oreilly & Associates Inc,2007.
作者單位
南陽師范學院計算機與信息技術學院 河南省南陽市 473061endprint
2.2.1 由于類自身的變化而造成的
(1)增加屬性。
(2)減少屬性。
(3)改變屬性的類型。
(4)改變屬性的約束條件。
2.2.2 由于父類的變化而造成的
在面向對象語言中存在繼承關系,即子類繼承父類中的屬性,當該類父類的結構發生改變的時,子類的結構會同時發生改變。
2.3 Schema可變技術的主要流程
在Schema可變的面向對象數據庫中,實現schema可變技術的重要操作位主要有三個,分別是是Schema的解析,Schema發生變化后的處理以及如何將Schema中的數據添加到不同版本的類結構中。
2.3.1 Schema的解析流程
Schema的解析是指獲取指定類內部的屬性以及屬性的標識等信息的過程,解析完之后會將解析后的schema信息添加到數據庫中。其具體流程如下所示:
(1)將類名加入隊列中,并從隊列中取出一個類名進行解析,如果該類為object則放棄解析,如果不是object則轉到2。
(2)將該類的父類父類添加到隊列中。
(3)逐個解析該類的屬性。
a. 如果是基本類型,則解析其名稱以及約束。
b. 如果不是基本的類型,則解析器名稱以及約束,并將該類的名稱加入到隊列中。
(4)轉到1。
2.3.2 Schema變化后的對Schema處理
Schema變化后,數據庫能夠識別出該schema的變化,然后根據解析出來的類結構,生成新的版本信息,如果該類與數據庫中存儲的該類以前的版本信息兼容,則生成新的類結構和版本號,具體流程如下所示:
(1)檢測該類的結構是否存在,如果存在則不再進行類結構的演化并刪除該結構;如果不存在,則轉到(2)。
(2)根據兼容性列表(如表1所示),檢測該schema中保存的類的結構是否與其它的版本相沖突,如果不沖突,則存儲該類的結構,轉到(4);如果沖突,則給出沖突的原因、版本號等信息。
(3)根據已經存在的類的結構,生成新的版本號。
2.3.3 Schema變化后對類的處理
當程序進行查詢操作時,根據傳遞過來的客戶端的schema信息,查詢在服務器端是否已經存儲與該Scheme相應的版本,如果不存在,則返回空;如果存在,則依據查詢條件進行查詢,具體流程如下所示:
(1)從數據庫中獲取該類的所有數據,如果數據庫中所有的類都應解析完畢,則退出解析過程并返回結果;如果還有未解析的類,則取出一個,進行解析。
(2)根據數據庫中存儲的類中的屬性和類的版本信息,逐一解析數據庫中存儲的類的每個屬性,并將值填入查詢結果中。
a.在數據庫中的類不包含該類屬性時,如果該屬性允許此值為空,則將該屬性設置為null;如果該屬性不允許為空,則放棄對數據庫中類的解析,轉到1。
b. 類中同名屬性的類型發生改變,則放棄對數據庫中存儲的類的解析并轉到(1)。
c. 類中屬性的標示發生改變,如果兼容則繼續解析,如果不兼容,則放棄對數據庫中存儲的類的解析并轉到1。
d. 如果數據庫中的類包含該類的屬性時,如果兼容則繼續解析,如果不兼容,則放棄對數據庫中存儲的類的解析并轉到1。
(3)轉到1。
3 系統測試
3.1 面向對象數據的存取
3.1.1 構造POJO類結構
public class Person {
private String name;
private int age;
}
3.1.2將name設置為test,age設置為20,并將該類數據存入數據庫中。
3.1.3從數據庫中取出數據,name=test,age=20
由此可以說明,數據庫能夠完成對類結構的解析,并可以取出相應的數據。
3.2 在兼容的情況下schema變更測試
3.2.1更改后的Person類
public class Person {
private String name;
private int age;
private String description;
}
在這里增加一個屬性description,它為String類型的,默認的情況下,允許該字段為null,所以屬于能夠與前邊所存儲的類的實例相兼容。
3.2.2在服務器端輸入命令對版本進行查看,版本信息顯示如下內容
V1:Person:Name String,Person:Age Int
V2:Person:Name String,Person:Age Int,Person:description String
3.2.3讀取數據,讀取結果為:Name=test,Age=20,Description= 。
在這組測試中,可以得出該數據庫所提供的schema可變技術是正確的。
3.3 在不兼容情況下schema變更測試
3.3.1更改后的Person類
public class Person {
private String name;
private Age age;
}
在這里將原有的名稱為age的屬性由int修改為Age類。
3.3.2使用該類添加數據,則返回錯誤信息
“There is collision on Person:name, please recheck the schema. Collision version V1”
在這組測試中,可以得出該數據庫可能夠識別不兼容的schema,并提示有沖突的版本。
4 總結
基于schema可變技術的面向對象數據庫實現了schema可變技術,使得數據庫在schema變化的過程中,盡可能的保留數據庫中存儲的原有數據,減少數據庫中數據因schema變化而引起的數據丟失問題,提高面向對象數據庫的可用性。但是其也有部分不足的地方,如不能夠很好的支持泛型、對靜態變量不能夠做到有效的支持、不支持事務等。在以后的工作中,將根據面向對象數據庫的發展逐漸的完善該數據庫,使其融入新的技術融入更多的技術并且在已有的技術上進行創新。
參考文獻
[1]Object database[N/OL].2010.http://en.wikipedia.org/wiki/Object_database.
[2]埃史爾.Java編程思想(第四版)[M].北京:機械工業出版社,2007.
[3]王珊、薩師煊等.數據庫系統概論[M]. 北京:教育出版社,2006.
[4]Richardson.POJOs IN ACTION:Developing Enterprise Applications with Lightweight Frameworks[M]. Oreilly & Associates Inc,2007.
作者單位
南陽師范學院計算機與信息技術學院 河南省南陽市 473061endprint