加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 如何构建数据库以进行快速节点访问

发布时间:2020-12-15 09:47:04 所属栏目:大数据 来源:网络整理
导读:我正在寻找一种方法来构建数据库与VirtualTreeView和SQLite数据库,以便快速检索数据.使用VirtualTreeView有一个OnNodeInit事件,但它并不总是适用于此目的. 数据从Usenet新闻组中获取,需要进行线程化.对线程有用的数据是post id(int64,也是主键),引用(引用线
我正在寻找一种方法来构建数据库与VirtualTreeView和SQLite数据库,以便快速检索数据.使用VirtualTreeView有一个OnNodeInit事件,但它并不总是适用于此目的.

数据从Usenet新闻组中获取,需要进行线程化.对线程有用的数据是post id(int64,也是主键),引用(引用线程中先前帖子的字符串).

程序在引用中搜索字符串并确定它应该在哪个postid.因此,例如post id = 1234,则下一篇文章可能是1235,然后1236可能是对1234的回复.

这是一个可能的数据库示例:

post id    references    parent id
  1234      .... ....       0
  1235      .... ....       0
  1236      .... ....      1234

所以现在这就是它现在的样子.

现在,问题是如何构建此数据以加快检索速度.如果只有一个根节点,我可以根据数据库条目分配RootNodeCount,然后在OnNodeInit中按要求逐个读取它们.当有子节点时,我需要以某种方式重新排列数据库,以便它知道如何更快地获取子节点,具体取决于打开哪个节点.

我正在考虑分配附加字段“has_subnodes”,其中包含以下子节点的ID.单击节点时,它将读取该节点和每个链接节点.

你将如何组织这个数据库,以便在OnNodeInit中很好地阅读它,或者你会使用那个事件吗?也可以使用AddChildNoInit()方法启动节点.欢迎任何想法或指示.

更新(以及我如何解决)

这里有一些非virtualtreeview相关信息:
Implementing a hierarchical data structure in a database

我最终做的是使用Modified Preorder Tree Traversal在数据库中存储有关节点的信息,并且每次首先请求某个节点时:

a)在内部缓存中查找它基本上与VirtualTreeView结构保持相同的结构.

b)如果在缓存中找到,则删除此缓存条目(它永远不会超过100个项目)

c)如果未找到,则在缓存中添加额外的100个项目(从请求的节点向上50个,向下50个).如果需要,此课程数可以修改为500或1000个项目.还有一些额外的检查可以查看需要读取多少上/下来以避免读取过多的重复条目.

d)如果我需要更高的速度,我可以应用额外的技术 – 根据用户滚动虚拟视图的数量从数据库加载节点 – 类似于std :: vector如何分配内存 – 首先我只加载100个节点,然后如果用户滚动了很多,我加载200,然后400等…越多的用户滚动加载整个树的速度越快,但如果他/她从不滚动,仍然不加载它.

这样,永远不会从数据库加载从未见过的节点.它适用于使用鼠标滚轮滚动(当它通过缓存为空的点并且需要更多来自磁盘的数据时偶尔有短暂延迟)以及使用箭头按钮/键滚动.将滚动条拖动到某个位置(例如从底部到中间)时速度会慢一些,但由于无法立即从磁盘中获取数据,因此可以预期.

最好是我在加载之前预先确定要用于缓存/项目的内存量,滚动速度越快但当然如果数据从未显示则会占用更多内存.

解决方法

您希望将分层??数据存储在数据库中.
问题是SQL没有能力很好地处理这种数据.

你有很多解决方案,每个都有他们的缺点和优点.
如果您想了解每种方法,请参阅以下链接:

http://www.sitepoint.com/hierarchical-data-database/
http://www.sitepoint.com/hierarchical-data-database-2/

我个人最喜欢的是Modified Preorder Tree Traversal

在这里,您以非常反直觉的方式将左侧和右侧节点存储在数据库中,这使得节点的插入有点慢,但快速检索闪电.

您可以在Delphi中编写逻辑代码,但我更喜欢在我选择的数据库中使用存储过程.这样,你在Delphi中的逻辑就变得简单了,如果数据库改变了你的Delphi代码就没有了.如果你想我可以包含存储过程的SQL代码,但现在不能,因为那些代码不在笔记本电脑上,我现在已经和我在一起了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读