我正在尝试将数据存储在关系数据库的binary space partitioning tree中。关于这种数据结构的棘手部分是它有两种不同类型的节点。第一种类型,我们称之为数据节点,只包含一定数量的项目。我们将可以保留的最大项目数定义为t
。第二种类型(我们称之为容器节点)包含另外两个子节点。将项添加到树时,将递归节点,直到找到数据节点。如果数据节点中的项目数小于t
,则将项目插入数据节点。否则,数据节点被分成另外两个数据节点,并被其中一个容器节点替换。删除元素时,必须执行相反的过程。
我有点失落。我应该如何使用关系模型来完成这项工作?
答案 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
,在叶片的内存中构建更细粒度的树你有数据项后感兴趣。