摘 要:在SQL結(jié)構(gòu)化查詢語(yǔ)言中,所有針對(duì)數(shù)據(jù)表某列或多列的數(shù)據(jù)分析統(tǒng)稱為聚合查詢。基于傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)的基礎(chǔ)上,對(duì)時(shí)態(tài)數(shù)據(jù)的聚合查詢問(wèn)題進(jìn)行了深入的分析,通過(guò)引入時(shí)態(tài)聚合子區(qū)間的概念,并定義與之相匹配的數(shù)據(jù)結(jié)構(gòu),設(shè)計(jì)實(shí)現(xiàn)了一種時(shí)態(tài)數(shù)據(jù)的聚合查詢算法。實(shí)際應(yīng)用表明,該算法可行、有效。
關(guān)鍵詞:時(shí)態(tài)數(shù)據(jù);聚合查詢;時(shí)態(tài)聚合子區(qū)間
中圖分類號(hào): TP311.13 文獻(xiàn)標(biāo)識(shí)碼 A 文章編碼:2095-2163(2015)03-
Aggregate Query and Application of Temporal Data
Huang Xiongbo
(Department of Electronic and Information Engineering, Foshan Professional Technical College, Foshan Guangdong 528137, China)
Abstract: In the SQL structured query language, all the data in a column or columns of data analysis are collectively referred to as the aggregate query. Based on traditional relational database management system(RDBMS) , aggregation queries of temporal data is analyzed. After that, by introducing temporal aggregation sub interval, the paper defines the data structure to match the aggregate query algorithm, also designs and implementations a temporal data. The practical application shows that the algorithm is feasible and effective.
Keywords: Temporal Data; Aggregate Query; Temporal Aggregation Sub Interval
0引 言
作為關(guān)系數(shù)據(jù)管理系統(tǒng)(RDBMS)的標(biāo)準(zhǔn)語(yǔ)言,SQL(Structured Query Language)結(jié)構(gòu)化查詢語(yǔ)言提供了共同的數(shù)據(jù)存取語(yǔ)言和接口標(biāo)準(zhǔn),從而使得異種數(shù)據(jù)庫(kù)系統(tǒng)之間的互操作成為了可能[1]。從功能上劃分,SQL結(jié)構(gòu)化查詢語(yǔ)言有三種類型的語(yǔ)句:數(shù)據(jù)定義語(yǔ)句(DDL,data definition language)、數(shù)據(jù)操縱語(yǔ)句(DML,data manipulation language)及數(shù)據(jù)控制語(yǔ)句(DCL,data control language)。其中,數(shù)據(jù)定義語(yǔ)句用于對(duì)基本表、視圖、索引、模式等數(shù)據(jù)對(duì)象進(jìn)行定義及修改;數(shù)據(jù)操縱語(yǔ)句用于數(shù)據(jù)的查詢、插入、刪除及修改等操作;而數(shù)據(jù)控制語(yǔ)句則用于用戶對(duì)數(shù)據(jù)庫(kù)存取權(quán)限的安全控制[2]。
在SQL的數(shù)據(jù)操縱語(yǔ)句中,經(jīng)常需要對(duì)數(shù)據(jù)表中的某列或多列數(shù)據(jù)進(jìn)行諸如求最大值、最小值或平均值的統(tǒng)計(jì)分析,而這些統(tǒng)計(jì)分析則統(tǒng)稱為聚合查詢。鑒于現(xiàn)有的時(shí)態(tài)信息應(yīng)用系統(tǒng)往往是在RDBMS的基礎(chǔ)上進(jìn)行構(gòu)建的[3-5],且RDBMS并沒(méi)有提供對(duì)應(yīng)的時(shí)態(tài)聚合函數(shù),據(jù)此,本文將深入分析時(shí)態(tài)數(shù)據(jù)的聚合查詢問(wèn)題,通過(guò)引入時(shí)態(tài)聚合子區(qū)間的概念,并定義相匹配的數(shù)據(jù)結(jié)構(gòu),進(jìn)而設(shè)計(jì)實(shí)現(xiàn)了一種可行、有效的時(shí)態(tài)聚合查詢算法。
1問(wèn)題描述
1.1 時(shí)態(tài)數(shù)據(jù)的聚合查詢問(wèn)題
如表1所示,SQL結(jié)構(gòu)化查詢語(yǔ)言提供了一系列的聚合函數(shù)來(lái)完成數(shù)據(jù)表的相關(guān)統(tǒng)計(jì)分析[6]。
表1 SQL的聚合函數(shù)
Tab.1 The SQL aggregate function
序號(hào) 函數(shù)格式 功能說(shuō)明
1 COUNT(*) 計(jì)算元組的個(gè)數(shù)
2 COUNT(<列名>) 對(duì)某一屬性的值進(jìn)行個(gè)數(shù)計(jì)算
3 SUM(<列名>) 求某一數(shù)值型屬性的總和
4 AVG(<列名>) 求某一數(shù)值型屬性的平均值
5 MAX(<列名>) 求某一屬性值的最大值
5 Min(<列名>) 求某一屬性值的最小值
在時(shí)態(tài)信息處理系統(tǒng)中,由于各個(gè)時(shí)態(tài)元組具有不同的時(shí)間生命周期,這使得相應(yīng)的聚合統(tǒng)計(jì)分析變得尤為復(fù)雜。下面將結(jié)合表2所示的時(shí)態(tài)工資數(shù)據(jù)表來(lái)加以說(shuō)明。
表2 時(shí)態(tài)工資數(shù)據(jù)表
Tab.2 Temporal salary data table
編號(hào) 工資 有效開(kāi)始時(shí)間 有效結(jié)束時(shí)間
01 2 000 2003.01 2005.04
01 2 500 2005.05 2008.04
01 3 200 2008.05 2010.09
02 2 800 2004.02 2007.10
02 4 000 2007.11 2009.09
03 3 800 2009.03 2010.06
如表2所示,為了減少時(shí)態(tài)數(shù)據(jù)的冗余存儲(chǔ),各個(gè)時(shí)態(tài)元組都添加了時(shí)間生命周期的約束,為此,時(shí)態(tài)聚合查詢應(yīng)在各個(gè)元組標(biāo)識(shí)(如表2中的“編號(hào)”)均具有單一屬性值的某一時(shí)間區(qū)間(或時(shí)刻)上進(jìn)行才具有實(shí)際意義。還應(yīng)指出的是,由于表2的時(shí)態(tài)工資數(shù)據(jù)表選用了月份為時(shí)間粒度,且每個(gè)時(shí)態(tài)元組的有效開(kāi)始時(shí)間與有效結(jié)束時(shí)間構(gòu)成了一個(gè)閉合的時(shí)間區(qū)間,故時(shí)間區(qū)間[2008.01,2008.04]與[2008.05,2010.01] 在區(qū)間點(diǎn)"2008.04"與"2008.05"上是連續(xù)的。
例1:計(jì)算表2中2008年3月的工資總和。
例2:統(tǒng)計(jì)表2中2008年3月的員工總?cè)藬?shù)。
1.2 獨(dú)立的時(shí)態(tài)聚合子區(qū)間
如前所述,為使時(shí)態(tài)聚合查詢有意義,則應(yīng)從聚合查詢時(shí)間區(qū)間與各相關(guān)時(shí)態(tài)元組中析出一系列獨(dú)立的時(shí)態(tài)聚合子區(qū)間,在這些子區(qū)間中,要求各個(gè)元組標(biāo)識(shí)均具有單一的屬性值。
例3:在表2中,若需要對(duì)[2008.01,2010.01]的時(shí)間區(qū)間進(jìn)行相關(guān)的聚合查詢,試析出獨(dú)立的時(shí)態(tài)聚合子區(qū)間。
依題意,聚合查詢的時(shí)間區(qū)間為[2008.01,2010.01],由于析出的獨(dú)立時(shí)態(tài)聚合子區(qū)間要求其內(nèi)含的各個(gè)元組標(biāo)識(shí)均具有單一的屬性值,結(jié)合表2中“編號(hào)”為"01"、"02"及"03"的員工工資變化情況,可得到如表3所示的4個(gè)獨(dú)立的時(shí)態(tài)聚合子區(qū)間。
表3 例3所對(duì)應(yīng)的獨(dú)立時(shí)態(tài)聚合子區(qū)間
Tab.3 In 3 cases the independent sub interval temporal aggregation
序號(hào)
時(shí)態(tài)聚合子區(qū)間
區(qū)間起點(diǎn) 區(qū)間終點(diǎn)
1 2 500 4 000 Null 2008.01 2008.04
2 3 200 4 000 Null 2008.05 2009.02
3 3 200 4 000 3 800 2009.03 2009.09
4 3 200 Null 3 800 2009.10 2010.01
從表3中易知,各個(gè)時(shí)態(tài)聚合子區(qū)間就形如RDBMS中的一個(gè)快照,因而可以在這些子區(qū)間中進(jìn)行相關(guān)的聚合查詢。
2 時(shí)態(tài)數(shù)據(jù)聚合查詢算法的設(shè)計(jì)與實(shí)現(xiàn)
2.1 算法的設(shè)計(jì)原理
時(shí)態(tài)聚合查詢的核心就是析出一系列獨(dú)立的時(shí)態(tài)聚合子區(qū)間,并寫入對(duì)應(yīng)的時(shí)態(tài)元組的屬性值,為了提高查詢性能,子區(qū)間的析出與屬性值的寫入應(yīng)在同一次的SQL查詢中進(jìn)行。
根據(jù)這一設(shè)計(jì)目標(biāo),時(shí)態(tài)聚合查詢算法的實(shí)現(xiàn)過(guò)程為:首先定義時(shí)態(tài)元組屬性值(內(nèi)含元組標(biāo)識(shí)、屬性值)、時(shí)態(tài)聚合子區(qū)間(內(nèi)含區(qū)間的開(kāi)始時(shí)間、結(jié)束時(shí)間、時(shí)態(tài)元組屬性值)2個(gè)結(jié)構(gòu)體,其中,時(shí)態(tài)元組屬性值是以子結(jié)構(gòu)體的形式嵌入至?xí)r態(tài)聚合子區(qū)間的結(jié)構(gòu)體中;隨后通過(guò)SQL語(yǔ)言檢索出所有與聚合查詢時(shí)間區(qū)間有交集的時(shí)態(tài)元組,并對(duì)檢索結(jié)果按照元組標(biāo)識(shí)進(jìn)行分組及排序;進(jìn)一步,在已有的時(shí)態(tài)聚合子區(qū)間的基礎(chǔ)上遍歷處理SQL檢索結(jié)果,且根據(jù)各個(gè)時(shí)態(tài)元組的有效開(kāi)始時(shí)間及有效結(jié)束時(shí)間不斷地調(diào)整時(shí)態(tài)聚合子區(qū)間的個(gè)數(shù)、開(kāi)始時(shí)間、結(jié)束時(shí)間及其對(duì)應(yīng)的時(shí)態(tài)元組屬性值;最后在一系列獨(dú)立的時(shí)態(tài)聚合子區(qū)間上進(jìn)行各種聚合查詢。
仍以例3為例介紹算法的工作原理。在表2中,“編號(hào)”為"01"、"02"及"03"的員工其工資有效時(shí)間區(qū)間與聚合查詢時(shí)間區(qū)間[2008.01,2010.01]與交集的時(shí)態(tài)元組分別為,[2005.05,2008.04] [2008.05,2010.09]、[2007.11,2009.09]、[2009.03,2010.06]。
(1)處理第1組交集[2005.05,2008.04] [2008.05,2010.09] :由于區(qū)間點(diǎn)"2008.04"("2008.05")把聚合查詢時(shí)間區(qū)間分成了2個(gè)時(shí)間子集,故此時(shí)可如圖1所示創(chuàng)建[2008.01,2008.04]和[2008.05,2010.01]2個(gè)時(shí)態(tài)聚合子區(qū)間,并寫入對(duì)應(yīng)的時(shí)態(tài)元組屬性值。
圖1 編號(hào)為"01"的員工其時(shí)態(tài)元組所對(duì)應(yīng)的時(shí)態(tài)聚合子區(qū)間
Fig.1 From the number "01" employee corresponds to the sub interval temporal aggregation
(2) 處理第2組交集[2007.11,2009.09] :在圖1的基礎(chǔ)上插入?yún)^(qū)間點(diǎn)"2009.09"("2009.10"),得到了如圖2所示的3個(gè)時(shí)態(tài)聚合子區(qū)間,同時(shí)更新受影響的時(shí)態(tài)元組屬性值。
圖2 編號(hào)為"01"和"02"的員工其時(shí)態(tài)元組所對(duì)應(yīng)的時(shí)態(tài)聚合子區(qū)間
Fig.2 From the number "01" and "02"employee corresponds to the sub interval temporal aggregation
(3) 處理第3組交集[2009.03,2010.06] :在圖2的基礎(chǔ)上插入?yún)^(qū)間點(diǎn)"2009.02"("2009.03"),得到了如圖3所示的4個(gè)時(shí)態(tài)聚合子區(qū)間,此外,各個(gè)時(shí)態(tài)聚合子區(qū)間所對(duì)應(yīng)的時(shí)態(tài)元組屬性值均以有序(如從小至大)的形式進(jìn)行寫入,以便提升其后進(jìn)行的諸如MAX、MIN等聚合查詢的運(yùn)算效能。
圖3 編號(hào)為"01"、"02"及"03"的員工其時(shí)態(tài)元組所對(duì)應(yīng)的時(shí)態(tài)聚合子區(qū)間
Fig.3 From the number "01","02" and "03"employee corresponds to the sub interval temporal aggregation
從圖1~圖3可知,任一時(shí)態(tài)元組的時(shí)間交集(記作 與已有的各個(gè)時(shí)態(tài)聚合子區(qū)間(記作 )的插入調(diào)整有以下3種情況[7]:
(1) 不新增時(shí)態(tài)聚合子區(qū)間
若 成立時(shí),則不新增時(shí)態(tài)聚合子區(qū)間,且 所內(nèi)含的時(shí)態(tài)元組屬性值也不需作調(diào)整;而當(dāng) 成立時(shí),則不新增時(shí)態(tài)聚合子區(qū)間,但應(yīng)把 內(nèi)含的時(shí)態(tài)元組屬性值寫進(jìn) 中去。
(2) 新增1個(gè)時(shí)態(tài)聚合子區(qū)間
若 成立時(shí),則新增1個(gè)時(shí)態(tài)聚合子區(qū)間,即把 拆分為 和 ,同時(shí)把 所對(duì)應(yīng)的時(shí)態(tài)元組屬性值寫進(jìn)新調(diào)整的 和 中去;同理,若 成立,則應(yīng)把 拆分為 和 ,同時(shí)把 所對(duì)應(yīng)的時(shí)態(tài)元組屬性值寫進(jìn)新調(diào)整的 和 中去。
(3) 新增2個(gè)時(shí)態(tài)聚合子區(qū)間
若 成立時(shí),則新增2個(gè)時(shí)態(tài)聚合子區(qū)間,即把 拆分為 、 和 ,同時(shí)把 所對(duì)應(yīng)的時(shí)態(tài)元組屬性值寫進(jìn)新調(diào)整的 、 和 中去。
2.2 算法的設(shè)計(jì)實(shí)現(xiàn)
綜上所述,可以設(shè)計(jì)如下的時(shí)態(tài)聚合查詢算法。
算法名稱 時(shí)態(tài)聚合查詢算法
輸入:時(shí)態(tài)數(shù)據(jù)表Temporal_Table、聚合查詢區(qū)間[Query_Start, Query_End]、聚合函數(shù)名稱 Aggregate_Style
輸出:在各個(gè)時(shí)態(tài)聚合子區(qū)間上的聚合查詢結(jié)果
(1)相關(guān)初始化
(1.1)定義保存時(shí)態(tài)元組屬性值的結(jié)構(gòu)體
struct Attrib_Information
{
char ID[20];// 標(biāo)識(shí)時(shí)態(tài)元組的ID
float score; // 時(shí)態(tài)元組對(duì)應(yīng)的數(shù)值型屬性值
}
(1.2)定義保存時(shí)態(tài)聚合子區(qū)間的結(jié)構(gòu)體
struct Temporal_Aggregation_Interval
{
DateTime AI_S;
//時(shí)態(tài)聚合子區(qū)間的開(kāi)始時(shí)間
DateTime AI_E;
//時(shí)態(tài)聚合子區(qū)間的結(jié)束時(shí)間
struct Attrib_Information Value[];
//Value動(dòng)態(tài)數(shù)組,其類型為Attrib_Information結(jié)構(gòu)體
}
(1.3)定義時(shí)態(tài)元組屬性值寫入過(guò)程
procedure Write_AI(float tempscore,struct Temporal_Aggregation_Interval tempNode)
{
int position=Binary_Search(tempscore,tempNode);
// Binary_Search為折半查詢函數(shù),返回tempscor數(shù)值在tempNode.Value中的插入位置
DataMove(tempNode.Value,position,1);
//把tempNode.Value數(shù)組的元素從position位起整體后移1位
tempNode.Value[position]=tempscore;
//把tempscore值插入至tempNode.Value數(shù)組的position位
}
(1.4)賦初值
struct Temporal_Aggregation_Interval Node[];
//Node動(dòng)態(tài)數(shù)組,其類型為Temporal_Aggregation_Interval結(jié)構(gòu)體
Node[0].AI_S = Query_Start;
Node[0].AI_E = Query_End ;
(2)檢索與聚合查詢的時(shí)間區(qū)間有交集的時(shí)態(tài)元組,并對(duì)檢索結(jié)果分組及排序
select * from Temporal_DataTable where not(VT_S> Query_End OR Query_Start> VT_E) GROUP by ID ASC→Rs
(3)遍歷處理查詢結(jié)果,析出時(shí)態(tài)聚合子區(qū)間,并寫入對(duì)應(yīng)的時(shí)態(tài)元組的屬性值
for i=0 to Rs.RecordSet.count-1
//遍歷處理有交集的時(shí)態(tài)元組
begin
for(j=0 to Length(Node)-1)
// Length(Node)為動(dòng)態(tài)數(shù)組時(shí)態(tài)聚合子區(qū)間的長(zhǎng)度
begin
if (Rs.RecordSet[i].VT_S<= Node[J].AI_S) and
(Node[J].AI_E<= Rs.RecordSet[i].VT_E) then
begin
Write_AI(Rs.RecordSet[i].Value, Node[J]);
//把時(shí)態(tài)元組屬性值Rs.RecordSet[i].Value寫進(jìn)
時(shí)態(tài)聚合子區(qū)間Node[J]中去
end;
if ((Node[J].AI_S < Rs.RecordSet[i].VT_S) and ( Rs.RecordSet[i].VT_S< Node[J].AI_E)) and (Node[J].AI_E <= Rs.RecordSet[i].VT_E) then
begin
temp= Node[J].AI_E;
Node[J].AI_E= Rs.RecordSet[i].VT_S;
Node[J+1].AI_S= Rs.RecordSet[i].VT_S;
Node[J+1].AI_E= temp;
//新增1個(gè)時(shí)態(tài)聚合子區(qū)間Node[J+1]
Write_AI(Rs.RecordSet[i].Value, Node[J]);
Write_AI(Rs.RecordSet[i].Value, Node[J+1]);
end;
if ((Node[J].AI_S < Rs.RecordSet[i].VT_E) and (Rs.RecordSet[i].VT_E < Node[J].AI_E)) and (Rs.RecordSet[i].VT_S <= Node[J].AI_S) then
begin
Node[J].AI_E= Rs.RecordSet[i].VT_E;
Node[J+1].AI_S= Rs.RecordSet[i].VT_E;
Node[J+1].AI_E= Rs.RecordSet[i].VT_S;
Write_AI(Rs.RecordSet[i].Value, Node[J]);
Write_AI(Rs.RecordSet[i].Value, Node[J+1]);
end;
if ((Node[J].AI_S < Rs.RecordSet[i].VT_S) and (Rs.RecordSet[i].VT_E < Node[J].AI_E)) then
begin
//新增2個(gè)時(shí)態(tài)聚合子區(qū)間Node[J+1]和Node[J+2]
temp= Node[J].AI_E;
Node[J].AI_E= Rs.RecordSet[i].VT_S;
Node[J+1].AI_S= Rs.RecordSet[i].VT_S ;
Node[J+1].AI_E= Rs.RecordSet[i].VT_E;
Node[J+2].AI_S= Rs.RecordSet[i].VT_E ;
Node[J+2].AI_E= temp;
Write_AI(Rs.RecordSet[i].Value, Node[J]);
Write_AI(Rs.RecordSet[i].Value, Node[J+1]);
Write_AI(Rs.RecordSet[i].Value, Node[J+2]);
end;
end;
end.
(4)在各個(gè)時(shí)態(tài)聚合子區(qū)間Node中執(zhí)行相應(yīng)的時(shí)態(tài)聚合查詢
for(i=0 to Length(Node)-1)
begin
case Aggregate_Style='count'
result_count=Length(Node[i].Value);
case Aggregate_Style='sum'
begin
result_sum=0;
for(j=0 to Length(Node[i].Value)-1)
result_sum =Node[j].Value+ result_sum;
end;
case Aggregate_Style='avg'
begin
result_sum=0;
for(j=0 to Length(Node[i].Value)-1)
result_sum =Node[j].Value+ result_sum;
result_avg= result_sum/ Length(Node[i].Value);
end;
case Aggregate_Style= 'max'
result_max= Node[i].Value[Length(Node[i].Value)-1];
case Aggregate_Style= 'min'
result_min= Node[i].Value[0];
end;
3 應(yīng)用實(shí)例與性能測(cè)試
3.1 實(shí)驗(yàn)環(huán)境
為了驗(yàn)證算法的有效性,本文對(duì)上述時(shí)態(tài)工資表的聚合查詢進(jìn)行了的設(shè)計(jì)與實(shí)現(xiàn)。實(shí)驗(yàn)的硬件環(huán)境為惠普ProDesk 490 G2 MT商用臺(tái)式機(jī)(CPU:i5-4570 4*3.2GHz;內(nèi)存:4GB DDR3 1600 ),軟件環(huán)境及開(kāi)發(fā)工具為Windows 8.1+ Embarcadero Delphi 2010,程序的運(yùn)行界面如圖4所示。
圖4 時(shí)態(tài)聚合的程序界面
Fig.4 The temporal aggregation query program interface
3.2 性能測(cè)試
由于算法的計(jì)算耗時(shí)主要集中在時(shí)態(tài)聚合子區(qū)間的析出與時(shí)態(tài)屬性值的寫入,為此,這里隨機(jī)地往表2中追加了1.2萬(wàn)名員工、共11萬(wàn)條的時(shí)態(tài)工資元組數(shù)據(jù),并按照時(shí)態(tài)子區(qū)間的析出數(shù)量進(jìn)行分組的性能測(cè)試[8],測(cè)試結(jié)果如表4所示。
表4 時(shí)態(tài)聚合查詢的計(jì)算耗時(shí)(單位:μs)
Tab.4 The time-consuming computation of temporal aggregate query (unit: μs)
序號(hào) 時(shí)態(tài)子區(qū)間的析出數(shù)量 時(shí)態(tài)子區(qū)間的析出耗時(shí) 時(shí)態(tài)屬性值的寫入耗時(shí) 小計(jì)
1 100 4.53 0.31 4.84
2 200 6.11 0.53 6.64
3 500 15.34 0.89 16.23
從表4可知,雖然算法的計(jì)算耗時(shí)隨著時(shí)態(tài)聚合子區(qū)間析出數(shù)量的增加而增加,但其計(jì)算耗時(shí)仍然維持在較低的μs等級(jí)里,故算法具有較好的應(yīng)用場(chǎng)合。事實(shí)上,在表2的時(shí)態(tài)工資表中,由于其時(shí)間粒度為月份,因而析出500個(gè)時(shí)態(tài)聚合子區(qū)間就意味著聚合查詢時(shí)間區(qū)間至少覆蓋了41年(500/12 ≈41)多的工資數(shù)據(jù)。
4結(jié)束語(yǔ)
本文分析了時(shí)態(tài)數(shù)據(jù)的聚集查詢問(wèn)題,并設(shè)計(jì)實(shí)現(xiàn)了一種可行、有效的時(shí)態(tài)聚集查詢算法。下一步的主要工作有,設(shè)計(jì)高效的時(shí)態(tài)索引技術(shù)和優(yōu)良的數(shù)據(jù)結(jié)構(gòu)進(jìn)而改善現(xiàn)有算法的計(jì)算效能,同時(shí)研究時(shí)態(tài)聚合子區(qū)間的并行析出方法,以便更好地提升算法的負(fù)載能力。
參考文獻(xiàn):
[1] 王珊,薩師煊.數(shù)據(jù)庫(kù)系統(tǒng)概論(第4版)[M].北京:高等教育出版社,2006:78-129.
[2] 沈鈞毅,侯迪,馮中慧,等.數(shù)據(jù)庫(kù)系統(tǒng)原理[M].西安: 西安交通大學(xué)出版社,2014:32-70.
[3] 黃雄波.電子病歷中時(shí)態(tài)數(shù)據(jù)庫(kù)的分析與設(shè)計(jì)[D]. 廣州:華南理工大學(xué),2007.
[4] 黃雄波,陳章,岳喜順.電子病歷中重疊時(shí)態(tài)數(shù)據(jù)的分析與消除[J]·計(jì)算機(jī)技術(shù)與發(fā)展,2009,18(3):235-238·
[5] 黃雄波,張榮榮.一種改進(jìn)的時(shí)態(tài)數(shù)據(jù)模型的設(shè)計(jì)與應(yīng)用[J].計(jì)算機(jī)時(shí)代,2014,33(7):1-3·
[6] 施伯樂(lè),丁寶康,汪衛(wèi).數(shù)據(jù)庫(kù)系統(tǒng)教程 [M]. 第3版. 北京:高等教育出版社,2008:74-115.
[7] 徐潔磐.離散數(shù)學(xué)及其在計(jì)算機(jī)中的應(yīng)用[M].北京:人民郵電出版社,2008:1-62.
[8] 黃雄波,陳章,徐小增.電子病歷中時(shí)態(tài)數(shù)據(jù)的過(guò)濾運(yùn)算研究[J].計(jì)算機(jī)應(yīng)用與軟件,2009,26(12):117-120·