SQL或NoSQL数据库中的许多小型树结构
我想在数据库中存储许多不同树中节点的信息 首先,将有超过20000个节点在500棵树之间共享,每个节点将有5个数字属性。一旦构建完成,每个节点都需要引用它的所有直接子节点,而不需要引用其他节点 我需要在初始化时在内存中构建所有树,并在程序进入停机状态时更新/添加节点(可能每小时左右,尽管越多越好) 我看过sql邻接模型,它似乎需要花费太长的时间来构造每个表(必须进行太多的db调用),嵌套集模型是一种可能性,但扩展树更为复杂,这是经常发生的事情,它增加了数据库的复杂性,因为我认为这可能是一个非常基本的结构和查询集 我也研究过MongoDb,但它似乎更倾向于JSON类型的对象,我使用的是java,可能是过度杀戮,还有HBase,它肯定会过度杀戮(优点是如果节点数量变得巨大,它可能会有用,这是未来的一种可能性,我可以增加对DB的写入时间,这也是一个优点) 有人对我该怎么做有什么建议吗 NoSql dbs是否过火了?它们在存储树结构方面是否更好?在sql数据库旁使用它们是否是一种糟糕的做法?如果您删除SQL或NoSQL数据库中的许多小型树结构,sql,database-design,nosql,hbase,hierarchical-trees,Sql,Database Design,Nosql,Hbase,Hierarchical Trees,我想在数据库中存储许多不同树中节点的信息 首先,将有超过20000个节点在500棵树之间共享,每个节点将有5个数字属性。一旦构建完成,每个节点都需要引用它的所有直接子节点,而不需要引用其他节点 我需要在初始化时在内存中构建所有树,并在程序进入停机状态时更新/添加节点(可能每小时左右,尽管越多越好) 我看过sql邻接模型,它似乎需要花费太长的时间来构造每个表(必须进行太多的db调用),嵌套集模型是一种可能性,但扩展树更为复杂,这是经常发生的事情,它增加了数据库的复杂性,因为我认为这可能是一个非常基
(rgt-lft-1)/2
在嵌套集上生成子属性的数量,并对lft/rgt列使用浮点数,您可以在最短的时间内插入/更新/删除节点
这样做的主要问题是避免与精度相关的问题。您可以通过将lft/rgt转换为numeric并返回到float来解决后者,以获得它们的规范表示形式。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
另一个问题相当容易管理,并且在空间不足时会发生:然后偶尔需要重新索引树的一部分或全部——这需要锁定树,但速度足够快,这样做不会影响正常操作。如果您使用的是SQL Server 2008+,则可以使用适用于此类场景的新数据类型。与在Postgres中使用类似。:-)