如何在关系数据库中存储二进制空间分区树?

时间:2011-05-10 18:27:05

标签: sql database data-structures relational-database space-partitioning

我正在尝试将数据存储在关系数据库的binary space partitioning tree中。关于这种数据结构的棘手部分是它有两种不同类型的节点。第一种类型,我们称之为数据节点,只包含一定数量的项目。我们将可以保留的最大项目数定义为t。第二种类型(我们称之为容器节点)包含另外两个子节点。将项添加到树时,将递归节点,直到找到数据节点。如果数据节点中的项目数小于t,则将项目插入数据节点。否则,数据节点被分成另外两个数据节点,并被其中一个容器节点替换。删除元素时,必须执行相反的过程。

我有点失落。我应该如何使用关系模型来完成这项工作?

1 个答案:

答案 0 :(得分:1)

为什么没有两个表,一个用于节点,一个用于项目? (注意,当我写答案时,我使用了术语“leaf”而不是“data”节点;“leaf”节点有数据项,非“leaf”节点包含其他节点。)

节点表将具有如下列:id primary key, parentid references node, leaf boolean,此外还有一些列用于描述节点的空间边界以及它将如何/已被拆分。 (我不知道你是在2D还是3D工作,所以我没有提供有关几何的详细信息。)

数据表将包含id primary key, leafid references node和任何数据。

您可以通过在每个级别发出SELECT * FROM node WHERE parentid = ?个查询并检查要下降的子项来向下遍历树。将数据项添加到叶子是一个简单的INSERT。拆分节点需要取消设置叶标志,插入两个新的叶节点,并通过更改其leafid值来更新节点中的所有数据项以指向相应的子节点。

请注意,SQL往返可能很昂贵,因此如果您希望将其用于实际应用程序,请考虑在数据库中使用相对较大的t,在叶片的内存中构建更细粒度的树你有数据项后感兴趣。