2011-05-31 68 views
0

我想将节点信息存储在数据库中很多不同树中。很多SQL或NoSQL数据库中的小型树结构

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

我需要在初始化时和更新建立在内存中的所有树木/添加节点一旦程序进入停机时间(也许每隔一小时左右,虽然越多越好)。

我已经看过这似乎像它会花很长时间来构建(不必进行太多的数据库调用)每个表的SQL邻接模型,嵌套集模型这​​是一个可能性,但更复杂的展开树这将会发生很多事情,并且会增加数据库的复杂性,因为我认为这可能是一个非常基本的结构和查询集。

我也看过MongoDb,但它似乎更适合于JSON类型的对象,我使用的是java,可能会超过kill,并且HBase会定义查看kill(如果节点数量变为巨大的它可能派上用场这是对未来的可能性,我可以增加写时间,以这将是一个优势太)

人有我怎么可能会去这方面有任何建议的DB?

NoSql dbs是否过度杀伤?他们在储存树木结构方面好得多吗?在sql数据库中使用它们是不是很好的做法?

回答

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 

另一个问题是相当容易管理和发生,当你运行的空间:你再偶尔需要重新索引部分或全部树的 - 它需要锁定的树,但它速度足够快,以便在不影响正常操作的情况下进行操作。

1

,如果你使用SQL Server 2008+可以使用意味着这样的情况下,新HierarchyID数据类型。

+0

使用了在Postgres的[整数数组(http://www.postgresql.org/docs/current/static/arrays.html)类似。 :-) – 2011-05-31 16:31:31