基于Oracle Spatial的时态空间数据库设计


需求前提:数据每年变化1~2次,软件预计生命周期50年

实践环境:Oracle Spatial

术语表:时空对象,快照

时空对象:一个地理目标从诞生到消亡所经历的空间和时间范围及其属性信息。这是一个为处理时空数据方便而抽象出来的概念,相当于全信息模型中的全信息对象。为了理解时空对象,我们以二维地物为例。二维地物在二维空间中占据一定的空间范围,表现为一个二维几何体,也就是它的几何属性。如果再增加一条时间轴,成为(x,y,t)坐标系,并认为任何的空间对象都有诞生和消亡,则这个二维地物就在(x,y,t)坐标系中占据了一定的三维空间。我们就把二维地物从诞生到消亡这一时间段所占据的空间-时间范围称之为“时空对象”。同理,也可以将时空对象扩展为三维的空间对象在时间维度上的延续,也就是四维对象。时空对象的属性信息是一张二维表。

快照:一个地理目标在某一特定时刻所占据的空间范围及其属性信息,或者说:时空对象在某一特定的时刻所占据的空间范围及其相应的属性信息。举例来说,地图上绘制了一个饭店的位置,大小,这就是饭店的一个快照。因为饭店是从某一时刻才诞生的,又会在某一时刻消亡,而在诞生和消亡之间,还可能会搬迁或扩建。所以地图上反映的仅仅是饭店在某一时刻的状态,所以称之为饭店在某一时刻的快照或时空对象在某一特定时刻的快照。注意,快照总是对应于某一特定的时刻,否则将失去快照的意义。快照的属性信息是时空对象属性信息表中的一条记录。

设计方向:

以时空对象的概念组织空间数据和属性数据,使得对地物变迁历史的查询和分析成为可能。

对应用层屏蔽历史数据的处理过程,将历史数据的处理当作数据库模块的功能之一。

技术要点:

1、 Oracle包变量的会话独立性

2、 动态视图技术(基于函数的视图)

图形解说:

时间

空间

对象诞生时间

观察方向

当前观察时间

对象消亡时间

快照3

快照2

快照1

时空对象(对象一)

对象三

对象二

从以上示意图中可以清晰地看出,每一个时空对象都是由多个快照记录所描述的。观察者的每一次观察都是基于一个特定的观察时间的。例如,图示中的观察者应该看到对象一的快照2和对象三的快照2,而无法看到对象二和对象一、三的其他快照记录。看不到对象二是因为在此观察时间之前,对象二已经消亡。看不到对象一的快照1是因为对象一有更新的观察数据快照2可以更好地近似反映对象二在当前观察时间所处的状态。

数据表:数据表的设计基于以上概念

对象表

Obj_id

NUMBER

时空对象标识号

  1<pk>   
  2  
  3Start_time   
  4  
  5DATE   
  6  
  7对象诞生时间   
  8  
  9  
 10  
 11End_time   
 12  
 13DATE   
 14  
 15对象消亡时间   
 16  
 17  
 18  
 19Obj_Attr   
 20  
 21VARCHAR2(100)   
 22  
 23对象属性数据   
 24  
 25会因时间的流逝而发生变化的属性信息。   
 26  
 27  
 28  
 29  
 30  
 31  
 32  
 33  
 34  
 35  
 36  
 37  
 38  
 39  
 40  
 41快照记录表   
 42  
 43  
 44  
 45Obj_id   
 46  
 47NUMBER   
 48  
 49时空对象标识号   
 50  
 51<fk>   
 52  
 53Snap_id   
 54  
 55NUMBER   
 56  
 57快照数据的唯一序号   
 58  
 59<pk>   
 60  
 61Snap_time   
 62  
 63DATE   
 64  
 65快照时间   
 66  
 67  
 68  
 69Snap_end   
 70  
 71DATE   
 72  
 73快照结束时间   
 74  
 75属于同一时空对象的最近的下一条快照的快照时间。设置此列的目的是为了查询方便。   
 76  
 77Geom.   
 78  
 79MDSYS.SDO_GEOMETRY   
 80  
 81快照几何数据   
 82  
 83  
 84  
 85Attr   
 86  
 87VARCHAR2(100)   
 88  
 89快照属性数据   
 90  
 91会因时间的流逝而发生变化的属性信息。   
 92  
 93  
 94  
 95  
 96  
 97  
 98  
 99  
100  
101  
102  
103  
104  
105  
106  
107  
108  
109  
110  
111  
112  
113  
114  
115  
116  
117  
118  
119  
120  
121  
122  
123  
124  
125存储过程:   
126  
127利用Oracle中包变量的会话独立性,在包中建立以下几个基本的存储过程:设置当前观察时间,获取当前观察时间,利用当前观察时间和传入的Snap_time,Snap_end参数判断快照记录是否可见(Snap_Filter)。   
128  
129  
130  
131视图:建立在快照记录表上的视图,基于存储函数Snap_Filter实现对表中记录的筛选。传入参数为:Snap_time,Snap_End.,返回值为此快照是否可见。   
132  
133  
134  
135SELECT Obj_id, Snap_time, Geom, Attr   
136  
137FROM 快照记录表   
138  
139WHERE Snap_Filter(Snap_time, Snap_end) &gt; 0;   
140  
141  
142  
143Obj_id   
144  
145NUMBER   
146  
147时空对象标识号   
148  
149  
150  
151Snap_time   
152  
153DATE   
154  
155快照时间   
156  
157  
158  
159Geom.   
160  
161MDSYS.SDO_GEOMETRY   
162  
163快照几何数据   
164  
165  
166  
167Attr   
168  
169VARCHAR2(100)   
170  
171快照属性数据   
172  
173  
174  
175  
176  
177  
178  
179  
180  
181  
182  
183  
184  
185触发器:   
186  
187视图上的触发器,使应用层用户可以在视图中插入,修改,删除数据。   
188  
189要点: 1、维护表中数据时要避免出现时间悖论,造成时间逻辑混乱。   
190  
1912、快照记录表中的Snap_end列的维护稍微麻烦一些,应小心谨慎。   
192  
193  
194  
195扩展与变化:   
196  
1971、 支持多种观察模式。   
198  
199为了查询功能的灵活性,可以增加几个扩展功能的存储过程:设置当前的观察模式,获取当前的观察模式,重写Snap_Filter函数以支持多种观察模式。   
200  
201例如:   
202  
203【对象历史追溯模式】此时当前观察时间这一参数失效,Snap_Filter的行为发生变化,视图中看到的是某一(或某几个)指定对象的所有快照。这种模式便于对单个对象的整个历史变迁过程加以追踪。   
204  
205【时间段观察模式】此时需要设置的观察时间不是一个时间点,而是一个时间段。Snap_Filter的返回值也有了更丰富的含义,可以用不同的数字(例如:1,2,4)表示某一快照记录在当前时间段开始,结尾,中间的可见性。这种模式可以用于需要对两个不同时间点的数据进行比较的场合。   
206  
2072、 增加对象关系表以描述时空对象之间的联系   
208  
209时空对象之间可能会有各种各样的联系,例如:变化,融合,分裂等。可通过以下表格加以描述。   
210  
211  
212  
213时空对象关系表   
214  
215Obj_1   
216  
217NUMBER   
218  
219时空对象标识号   
220  
221<pk><fk>   
222  
223Obj_2   
224  
225NUMBER   
226  
227时空对象标识号   
228  
229<pk><fk>   
230  
231Relation_type   
232  
233NUMBER   
234  
235关系类型   
236  
237<pk>   
238  
239  
240  
241  
242  
243  
244  
245  
246  
247使用方法:   
248  
249如果是查询最新信息,即观察时间为系统当前时间,则直接访问视图即可。   
250  
251如果是查询历史数据,只需在数据连接会话中调用存储过程来设置当前观察时间,其效果是所有视图中可见的记录集合都是当前观察时间点可见的记录,其他记录不会出现在视图中。</pk></fk></pk></fk></pk></pk></fk></pk>
Published At
Categories with 数据库类
Tagged with
comments powered by Disqus