Để giải quyết vấn đề này, có 2 phương pháp tiếp cận hiệu quả nhất: (1) tiếp cận chồng chéo HR-tree và (2) tiếp cận đa phiên bản (Multiversion) MVR- tree.
Phƣơng pháp tiếp cận chồng chéo HR-tree
R1 A B C 1 2 3 4 5 6 7 8 9 R2 A1 B C 1 2 3a 4 5 6 7 8 9 R3 A1 B C1 1 2 3a 4 5 6 7 8a 9
HR-tree [5] sử dụng phương pháp chồng chéo này với giả định rằng các S(t) liên tiếp khơng có nhiều sự khác nhau. Nó giữ các R-tree như một cây duy nhất. Một mặt, nếu nút nào không thay đổi giữa 2 mốc thời gian thì các nhánh chung sẽ được chia sẻ giữa các cây với nhau để tiết kiệm không gian. Mặt khác, nếu một nhánh có chứa nội dung đối tượng đã thay đổi nó được sao chép hồn tồn và đánh dấu với một mốc thời gian như trong Hình 2.10.
Hình 2.10. Phƣơng pháp chồng chéo
Phương pháp chồng chéo khắc phục thiếu sót của phương pháp tiếp cận từng phần liên tuc. Nó ngăn chặn việc sao chép các nhánh con từ bất kỳ thời điểm nào, đối với các nhánh và nút gốc khi có sự thay đổi nó sẽ chỉ ra các nút và nhánh mới, vì vậy nó tiết kiệm được khơng gian lưu trữ. Các thuộc tính thời gian là thời gian thực hiện, khoảng thời gian thực hiện là thời gian một đối tượng đã được lưu trong cơ sở dữ liệu khơng gian. Do đó một MBR được lưu trữ trong cơ sở dữ liệu không gian kể từ thời điểm được đưa vào cho đến khi nó được cập nhật hay bị xoá đi.
Lập chỉ mục thuật tốn HR-tree nó tương tự như của R-tree [2]. Tuy nhiên, nó có một số khác biệt từ R-tree:
Insertion
Đầu tiên nút lá để chèn vào các phần tử mới được tìm thấy bằng cách áp dụng chức năng choosesubtree của R*-tree [3]. Nếu một vài cây trước đó là nút lá, nó sẽ được nhân đơi. Sau đó, các mục mới được chèn và cập nhật vào thư mục gốc của cây hiện tại. Chú ý răng những cây trước mốc thời gian là không bao giờ được sửa đổi.
Deletion
Chỉ có 02 sửa đổi cần thiết trong Guttman’s CondenseTree [2]: (1) trong thuật toán chèn, thuật toán chèn trên phải được sử dụng thay thế gốc của nó và (2) một nút có chứa mục để chèn vào trong tập Q sẽ được xóa bỏ chỉ khi nó là
mốc thời gian hiện tại. Mặt khác, một nút sẽ được xóa bỏ nếu nó là trùng lặp. Nếu nó thuộc về trạng thái trước đó của R-tree, nó sẽ khơng được xóa bỏ.
Ưu điểm của HR-tree là hiệu suất truy vấn mốc thời gian nhanh vì truy vấn mốc thời gian là truy vấn trực tiếp tới R-tree và tìm kiếm thực hiện bên trong cây.
Tuy nhiên, nhược điểm của HR-tree là khơng gian địi hỏi lớn, bởi vì phần lớn các bộ dữ liệu HR-tree độc lập với R-tree tại mỗi mốc thời gian.
Trong ví dụ Hình 2.11, nếu 1 bản ghi mới e1 của e0 được chèn vào nút D0, nó sẽ tạo ra 2 nút mới: D1 (chứa phần tử của D0 cộng với e1), và E1 (chứa phần tử E0 trừ đi e0). Sự thay đổi sẽ được đưa vào gốc B1 và C1, vì vậy ngay cả khi đối tượng thay đổi vị trí của nó tồn bộ tuyến (path) cần phải nhân đơi. Từ tóm tắt này, nếu đối tượng thường xuyên thay đổi thì kết quả của nó sẽ nhiều bản sao. Hơn thế nữa, hiệu quả suy giảm rất nhanh cho khoảng truy vấn (như là khoảng độ dài tăng lên do bản sao tăng).
Hình 2.11. Chèn vào một phiên bản mới e1 thay thế đối tƣợng e0 Phƣơng pháp tiếp cận đa phiên bản (multiversion)
HR+-tree sử dụng phương pháp tiếp cận này tương tự như phương pháp tiếp cận chồng chéo trong việc giữ nhiều R-tree như là một cây duy nhất. Tuy nhiên HR+-tree (multiversion R-tree) cho phép đưa vào nhiều mốc thời gian để đặt trong cùng một nút. Các nút mới là được tạo chỉ khi nó vượt khỏi giới hạn, mỗi phần tử có khn dạng (S, tstart, tend, pointer), trong đó S thể hiện MBR như định nghĩa trong R-tree, tstart (tend) đại diện cho mốc thời gian tại đó các mục tương ứng sẽ được chèn (xoá). Thời gian tồn tại của một mục là khoảng đóng [tstart, tend). Nếu có một mục là khơng bị xố cho đến thời gian hiện tại, nó được đánh dấu “*” (một từ với nghĩa là thời gian hiện tại).
Xem Hình 2.12 nếu nút lá E0 là có chỗ (tối đa là 4) chúng có thể chèn e1 (phiên bản khác của e0) tại thời gian T1 trong cùng một nút và cập nhật được đưa vào gốc của thời gian hiện tại.
Hình 2.12. Chèn một phiên bản mới của e1 thay thế đối tƣợng e0.
Thuật toán lập chỉ mục của HR+-tree cũng gần tương tự như R-tree và cập nhật sẽ thực hiện trong phiên bản quá khứ gần nhât của R-tree.
Insertion
Không giống như thường lệ R-tree chọn một mục để chèn vào nút lá, tuy nhiên lựa chọn đưa vào có thể được nhân đơi để đảm bảo cho hiệu suất truy vấn mốc thời gian tốt nhất. Ví dụ trong Hình 2.13 nút lá được lựa chọn bởi thuật toán cây con là D, thực hiện bằng cách làm theo mục u trong nút A. Nếu chèn <h,2,*> vào D mà không mở rộng phạm vi không gian của D, thì việc chèn khơng làm thay đổi bất kỳ cấu trúc trong cây. Tuy nhiên nếu chèn là nguyên nhân mở rộng phạm vi, một mục mới u’ được tạo ra trong khi u là bị xố (xu hướng của nó là thay đổi đến 2 lần). Đưa (a,b,c,d) trong khoảng thời gian [0, 2) vào không gian giới hạn (bounds) u , trong khi giới hạn u’ còn hoạt động ở mốc thời gian 2.
(a)Before insertion (b)After insertion
Hình 2.13. Nhân đơi một phần tử trung gian
Tràn (overflow) xảy ra khi một phần tử (phần tử) là được chèn vào một nút, nút đó đã chứa tối đa các phần tử. Xử lý tràn như quá trình tại Hình 2.14
… <s, 0, 2, B> <t, 0, 2, C> <u, 0, *, D> <v, 0, *, E> <w, 2, *, F> <a, 0, *> <b, 0, *> <c, 0, *> <d, 0, *> <a, 0, *> <b, 0, *> <c, 0, *> <d, 0, *> <h, 2, *> … <s, 0, 2, B> <t, 0, 2, C> <u, 0, *, D> <v, 0, *, E> <w, 2, *, F> <u, 2, *, D> <h, 2, *>entry to be inserted D A D A
Hình 2.14. Xử lý overflow
Chia khoá (Key split) xảy ra chỉ khi tất cả các mục trong nút được chèn tại mốc thời gian hiện tại và đảm bảo điều kiện phiên bản mạnh (strong version): thời gian các mục tồn tại B*Psvo, B thể hiện khả năng của nút, Psvo là một tham số [0,1].
Chia phiên bản (Version Split) được thực hiện và đảm bảo điều kiện phiên bản yếu (weak version): thời gian các mục tồn tại B*Psvo.
Tuy nhiên chúng ta luôn cố gắng để tránh việc Version Split bởi vì nó sẽ xảy ra các mục dư thừa. Xem hình 2.15, khi khả năng của nó là 3 nút lá bị phân chia và sau đó làm cho dư thừa mục C0 và d0.
Hình 2.15. Làm dƣ thừa các phần tử khi bị tràn Deletion
Tương tự như R-tree nhưng chỉ có các mục tồn tại mới bị xoá ở mốc thời gian hiện tại. Một mục là bị xoá vật lý chỉ khi tstart là bằng thời gian hiện tại. Thuật tốn xố có thể gây ra lỗi tràn bởi vì nó cần tạo những mục mới để phục vụ cho việc truy vấn, như thể hiện trong Hình 2.12.
Hình 2.16. Nhân đơi một phần tử trong khi xoá
Thiếu mục (Underflow) xảy ra là hậu quả của việc vi phạm các điều kiện phiên bản yếu (weak version) sau khi xố. Chúng ta có 3 lựa chọn để xử lý việc Underflow:
(1) Xuất phát trực tiếp từ R-tree, chèn lại các mục tồn tại vào nút Underflow. Tuy nhiên việc chèn lại các mục có thể dẫn đến dư thừa phiên bản và sẽ còn lại tối thiểu.
(2) Một nút có thể khơng cịn underflow nếu một vài mục được chèn cùng một mốc thời gian. Vì vậy chúng ta không xử lý các underflow mà làm một danh sách các nút underflow. Trước khi xử lý ở mốc thưòi gian tiếp theo, chúng ta kiểm tra mỗi nút trong danh sách , nếu có bất kỳ một nút underflow nào thì chúng ta chèn lại các mục đang tồn tại.
(3) Chúng ta không áp dụng việc chèn lại tất cả, mà cố gắng để hợp các nút underflow với một nút anh em của nó.
Trong các thử nghiệm HR+-tree tiêu tốn một phần nhỏ không gian cần thiết tương ứng HR-tree (thường ít hơn 20%). HR+-tree kế thừa hiệu quả của HR-tree trong mốc thời gian truy vấn, thực hiện tốt hơn nhiều trong khoảng truy vấn. Tuy nhiên từ phân tích các thuật tốn của nó, khi đối tượng thay đổi ở tốc độ ổn định, nó tốn rất nhiều khơng gian nhớ từ khi các đối tượng được nhân bản rông rãi. Hơn nữa, nó vẫn cịn hạn chế phương pháp thực hiện để truy vấn khoảng thời gian từ khi phiên bản được nhân rộng.
2.1.3. MV3Rtree
Bởi vì khơng một phương nào trong số 3DR-tree, HR-tree, HR+-tree có thể giải quyết việc truy vấn theo vết thời gian (timeslice) và khoảng thời gian một cách hiệu quả, do đó Multiversion 3DR-tree (MV3R-tree) [10] được đề xuất để thực hiện cho yêu câu trên. MV3R-tree nó khắc phục vấn đề này bằng cách kết hợp 2 cấu trúc: a multiversion R-tree (MVR-tree) và một phần nhỏ 3DR-tree xây dựng trên các nút lá của MVR-tree. Hình 2.17 minh hoạ một ví dụ của
… <s, 0, 2, B> <t, 0, 2, C> <u, 0, *, D> <v, 0, *, E> <w, 2, *, F> A <a, 0, *> <b, 0, *> <c, 0, *> <d, 0, *> <h, 0, *> <a, 0, *> <b, 0, *> <c, 0, *> <d, 0, *> <h, 0, 2> … <s, 0, 2, B> <t, 0, 2, C> <u, 0, 2, D> <v, 0, *, E> <w, 2, *, F> <u’, 2, *, D> D A D
MV3R-tree. MV3R-tree có thể xử lý hiệu quả tất cả các kiểu của truy vấn với không gian yêu cầu nhỏ.
Khoảng cách giữa hai cấu trúc độc lập thu được : (a) bằng cách sử dụng những nút lá phía trên cây thay vì các đối tượng hiện thời để xây dựng phần R- tree và (b) bằng cách thay thế HR-tree với MVR-tree chứa nhiều không gian hiệu quả hơn.
Do MV3R-tree kết hợp các ý tưởng của MVR-tree và 3DR-tree, vì vậy nó thừa hưởng các ưu điểm của cả 2 loại cây. Trong thử nghiệm của [9] cho thấy rằng nó có thể xử lý cả truy vấn theo vết thời gian (timeslice) và khoảng thời gian một cách hiệu quả với yêu cầu không gian tương đối nhỏ.
Tuy nhiên MV3R-tree cũng thừa hưởng những nhược điểm, nó khơng hiệu quả cho các khi hầu hết các đối tượng đang chuyển động ở tốc độ ổn định, hơn thế nữa kết quả địi hỏi khơng gian rất lớn với cả 2 cấu trúc.
Hình 2.17. Kết hợp của MVR-tree và 3DR-tree 2.1.4. Lập chỉ mục cho các quỹ đạo (quá khứ) của các vị trí 2.1.4. Lập chỉ mục cho các quỹ đạo (quá khứ) của các vị trí
Bằng cách xem xét thời gian như một chiều không gian, dữ liệu thu được từ các đối tượng điểm di chuyển là tương tự như 1 “chuỗi” bất kỳ định hướng trong không gian 3D (với 2 chiều tương ứng với không gian và 1 chiều tương ứng với thời gian). Bằng cách lấy mẫu chuyển động của đối tượng điểm chúng ta có 1 đường đa đoạn (polyline) thay vì một “chuỗi”, nó đại diện cho các quỹ đạo của đối tượng điểm di chuyển. Trong hình học đối tượng điểm di chuyển được gọi là một quỹ đạo như thể hiện trong hình 2.18. Một quỹ đạo của đối tượng điểm chuyển động có thể coi như khơng gian (3D) dữ liệu của riêng nó, do đó nó có thể được hỗ trợ bởi một phương pháp tiếp cận khơng gian. Chúng ta có thể sử dụng phương pháp tiếp cận không gian để lập chỉ mục dữ liệu, đơn thuần như là một tập hợp các đoạn đường thẳng vì vậy vấn đề của nó là sự duy trì của quỹ đạo.
Có 2 phương pháp tiếp cận: Đầu tiên, không thời gian R-tree (gọi tắt là STR-tree) [3], tổ chức các đoạn đường thẳng khơng chỉ theo tính chất khơng gian mà cịn nhóm các phân đoạn tuỳ theo quỹ đạo của nó, chúng ta gọi nó là thuộc tính duy trì quỹ đạo. Thứ 2, Trajectory-Bundle tree (gọi tắt là TB-tree) [6],
MVR-Tree
nhằm mục đích chỉ để duy trì quỹ đạo và để lại các thuộc tính khơng gian khác sang một bên.
R-tree được sửa đổi như sau: xấp xỉ (approximating) các đoạn dường thẳng với MBB trong Hình 2.19 (a), như nhìn thấy trong Hình 2.19 (b), một đoạn đường thẳng có thể chỉ chứa 4 chiều khác nhau trong một MBB. Thông tin bổ xung này là được lưu trữ ở mức lá bằng cách đơn giản là thay đổi định dạng sang (id, MBB, định hướng (orientation)) với tên miền định hướng của nó là {1,2,3,4}. Giả sử số quỹ đạo từ 0 tới n, một nút lá lá sẽ có định dạng (id, trajectory#, MBB, orientation).
Hình 2.18. Chuyển động của một đối tƣợng không gian và quỹ đạo tƣơng ứng
Hình 2.19. (a) Xấp xỉ quỹ đạo sử dụng MBB (b) Ánh xạ của đoạn đƣờng thẳng trong một MBB
Hạn chế của phương pháp này là không gian chết (“dead space”) có phạm vi lớn. Rõ ràng phạm vi bao bọc tương ứng MBB là chiếm khơng gian lớn, trong khi đó khơng gian thực tế bị chiếm bởi quỹ đạo là rất nhỏ. Điều này dẫn đến chồng chéo nhau và do đó suy xét khả năng lập chỉ mục cấu trúc là nhỏ.
Lập chỉ mục STR-tree
Trong thuật toán chèn của STR-tree, chúng ta yêu cầu chèn vào một đoạn của một đối tượng. Đầu tiên để duy trì quỹ đạo của đối tượng, nó tìm một nút
chứa tiền nhiệm của nó. Nếu nút đó được tìm thấy và có khơng gian, chúng ta chèn phân đoạn. Nhưng nếu nút là đầy đủ, chúng ta kiểm tra cha mẹ lân cận của nó có đầy đủ hay khơng. Nếu cha mẹ của nó khơng đầy đủ chúng ta sẽ phân chia các nút lá. Thứ hai, giữ thuộc tính khơng gian, chúng ta sẽ sử dụng thuật toán chèn gốc của R-tree [2] trong trường hợp bố mẹ nút lá là đầy đủ, các phần còn lại của cây (màu xám bóng mờ cây trong hình 2.20) sẽ được chèn vào nút lá ngang bằng nút lá chứa tiền nhiệm mà nó khơng tìm thấy, tồn bộ cây sẽ được chèn vào.
Hình 2.20. Xử lý chèn cho STR-tree
Hình 2.21. Các kiểu chia đoạn
Một sửa đổi khác của cây STR-tree từ R-tree là phân chia thuật toán, để duy trì quỹ đạo trong chỉ mục, chúng ta chia một nút lá khi nó tràn như sau (như thể hiện trong hình 2.21):
(a) Tất cả các đoạn là được huỷ kết nối với nhau, QuadraticSplit được gọi ra để quyết định việc phân chia.
(b) Không phải tất cả các đoạn là huỷ kết nối với nhau, đoạn huỷ kết nối được đặt vào nút mới tạo ra.
(c) Không tồn tại đoạn huỷ kết nối, đoạn kết nối ngược gần nhất được đặt vào nút mới tạo ra.
Lập chỉ mục TB-tree
Không giống như STR-tree, TB-tree nhằm mục đích cho phương pháp tiếp cận duy trì quỹ đạo một cách hồn tồn, như vậy một nút lá chỉ chứa đoạn thuộc cùng một quỹ đạo, do đó lập chỉ mục được hiểu như là một tập hợp (bundle) quỹ đạo. Nhược điểm là các đoạn đường thẳng độc lập từ quỹ đạo nằm trong không gian gần sẽ được lưu trữ trong các nút khác nhau. Khi sự chồng chéo tăng lên, sự suy xét khơng gian giảm vì vậy giá thành cho phạm vi truy vấn thơng thường tăng lên.
Hình 2.22. (a) Nút cha là khơng đầy đủ, (b) Nút cha đầy đủ
Thuật toán chèn là để chèn một phân đoạn mới tới một nút. Đầu tiên chúng ta chọn toàn bộ nút lá chứa một phân đoạn được kết nối với mục mới. Trong trường hợp nút là khơng tìm thấy, chúng ta tạo một nút mới cho mục mới. Trong trường hợp nút là được tìm thấy (giai đoạn 1 trong hình 2.22a), nếu nút lá có khơng gian chúng ta chèn vào mục mới, nhưng ngược lại chúng ta tăng cây cho tới khi chúng ta tìm thấy một nút cha khơng đầy đủ (giai đoạn 2 đến 4 trong Hình 2.22a). Chúng ta chọn con đường đúng nhất (giai đoạn 5) để chèn vào nút mới. Nếu có chỗ trong nút cha (giai đoạn 6), chúng ta chèn nút lá mới như thể hiện trong Hình 2.22a. Trong trường hợp nút cha là đầy đủ như trong hình 2.22b chúng ta sẽ chia nó bằng cách tạo một nút mới (khơng lá) ở mức 1có nút lá mới