簡體   English   中英

如何在關系數據庫中存儲二進制空間分區樹?

[英]How can I store a binary space partitioning tree in a relational database?

我試圖將數據存儲在關系數據庫的二進制空間分區樹中。 關於此數據結構的棘手部分是它具有兩種不同類型的節點。 第一種類型,我們稱為數據節點,僅包含一定數量的項目。 我們將可保存的最大項目數定義為t 第二種類型,我們稱為容器節點,包含另外兩個子節點。 將項目添加到樹時,將遞歸節點,直到找到數據節點為止。 如果數據節點中的項目數小於t ,則將項目插入到數據節點中。 否則,該數據節點將拆分為其他兩個數據節點,並由容器節點之一替換。 刪除元素時,必須執行相反的過程。

我有點迷路了。 我應該如何使用關系模型來完成這項工作?

為什么沒有兩個表,一個用於節點,一個用於項目? (請注意,在我寫答案時,在下面使用術語“葉子”而不是“數據”節點;“葉子”節點具有數據項,非“葉子”節點包含其他節點。)

節點表將具有以下列: id primary key, parentid references node, leaf boolean ,此外,還有一些列用於描述節點的空間邊界以及如何/將其拆分。 (我不知道您是在2D還是3D模式下工作,因此我沒有提供有關幾何的詳細信息。)

數據表將具有id primary key, leafid references node以及任何數據。

您可以通過發出SELECT * FROM node WHERE parentid = ?向下遍歷樹SELECT * FROM node WHERE parentid = ? 在每個級別進行查詢,並檢查要歸入哪個子級。 向葉子添加數據項是一個簡單的INSERT 拆分節點需要取消設置葉子標志,插入兩個新的葉子節點,並通過更改其葉子標識值來更新節點中的所有數據項以指向適當的子節點。

請注意,SQL往返可能會很昂貴,因此,如果您想在實際的應用程序中使用它,請考慮在數據庫中使用相對較大的t來構造細粒度的樹,以存儲您感興趣的葉子之后數據項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM