我正在尝试将数据存储在关系数据库的二进制空间分区树中。 这种数据结构的棘手之处在于它有两种不同类型的节点。 第一种类型,我们称之为数据节点,只是保存一定数量的项目。 我们定义了可以持有的最大项目数量 t
. 第二种类型,我们称之为容器节点,包含另外两个子节点。 将项添加到树中时,节点将递归,直到找到数据节点。 如果数据节点中的项数小于 t
,则该项将插入到数据节点中。 否则,数据节点将拆分为另外两个数据节点,并替换为其中一个容器节点。 删除元素时,必须发生反向过程。
我有点迷茫。 我应该如何使用关系模型完成这项工作?
为什么不有两个表,一个用于节点,一个用于项目? (请注意,我在写答案时使用了术语"叶"而不是"数据"节点;"叶"节点包含数据项,非"叶"节点包含其他节点。
节点表将具有如下列:id primary key, parentid references node, leaf boolean
,此外还有一些列来描述节点的空间恩赐以及它将如何/已经拆分。 (我不知道您是在2D还是3D中工作,所以我没有提供有关几何形状的详细信息。
数据表将包含id primary key, leafid references node
和任何数据。
您可以通过在每个级别发出SELECT * FROM node WHERE parentid = ?
查询并检查要下降到哪个子级来向下遍历树。 将数据项添加到叶子是一个简单的INSERT
。 拆分节点需要取消设置叶标志,插入两个新的叶节点,并通过更改其叶 id 值来更新节点中的所有数据项以指向相应的子节点。
请注意,SQL 往返可能很昂贵,因此如果您希望将其用于实际应用程序,请考虑在数据库中使用相对较大的t
构造一个更细粒度的树,以在拥有数据项后存储您感兴趣的叶子。