0

我想将信息存储在数据库中许多不同树的节点上。

首先将有超过 20000 个节点在 500 棵树之间共享,每个节点将有 5 个数字属性。一旦构建,每个节点都需要引用它的所有直接子节点,而不需要引用其他节点。

我需要在初始化时在内存中构建所有树,并在程序进入停机时间后更新/添加节点(可能每隔一小时左右,尽管越多越好)。

我查看了 sql 邻接模型,它似乎构建每个表需要很长时间(必须进行太多的数据库调用),嵌套集模型是一种可能性,但扩展树更复杂,这是会发生很多,它增加了数据库的复杂性,因为我认为这可能是一个非常基本的结构和查询集。

我也研究过 MongoDb,但它似乎更适合 JSON 类型的对象,而且我正在使用 java,并且可能会过度杀戮,而且 HBase 肯定会过度杀戮(优点是如果节点数量变得巨大,它可能会出现很有用,这对未来来说是一种可能性,我可以增加对数据库的写入时间,这也是一个优势)

有人对我如何解决这个问题有任何建议吗?

NoSql dbs 是否矫枉过正?他们在存储树结构方面做得更好吗?将它们与 sql 数据库一起使用是不好的做法吗?

4

2 回答 2

1

如果您使用的是 SQL Server 2008+,则可以使用适用于此类场景的新HierarchyID数据类型。

于 2011-05-31T15:55:22.737 回答
1

如果您(rgt - lft - 1) / 2在嵌套集上删除子属性的产量数量,并为 lft/rgt 列使用浮点数,则可以在最短的时间内插入/更新/删除节点。

这样做的主要问题是避免与精度相关的问题。您可以通过将 lft/rgt 转换为数字并返回到浮点数来解决后者,以获得它们的规范表示。Postgres 示例:

select (.1::float + .7::float) * 10::float;                          -- 8
select floor((.1::float + .7::float) * 10::float);                   -- 7
select floor(((.1::float + .7::float) * 10::float)::numeric::float); -- 8

另一个问题相当容易管理,并且在您用完空间时发生:您有时需要重新索引部分或全部树 - 它需要锁定树,但速度足够快,您可以在不影响正常操作的情况下这样做.

于 2011-05-31T15:37:47.497 回答