如何在数据库中存储稀疏布尔向量?

时间:2013-06-01 17:52:15

标签: c# database sqlite range sparse-matrix

假设我有一本约2 ^ 40页的书。每天,我都会阅读一大堆连续的页面(有时包括我已经读过的一些页面)。什么是在(SQLite)数据库中存储和更新“我读过哪些页面”信息的最明智的方法?

我目前的想法是在表中存储[firstChunkPage,lastChunkPage]条目,但我不确定如何有效地更新它。

  • 我应该首先检查每个可能的重叠然后更新吗?
  • 我应该只插入我的新范围,然后合并重叠的条目(可能多次,因为可能会发生多个重叠?)?我不确定如何构建这样的SQL查询。

这看起来是一个非常常见的问题,所以我想知道是否有人知道这个'公认'的解决方案。

欢迎任何帮助或想法!

编辑:读取实际上并不是随机的,与页数相比,预计块的数量将非常稳定且非常小。

1 个答案:

答案 0 :(得分:3)

如果数据相对稀疏,那么存储(firstChunkPage, lastChunkPage)对范围的想法应该有效。

不幸的是,像您这样的查询提到:

SELECT count(*) FROM table
WHERE firstChunkPage <= page AND page <= lastChunkPage

无法有效工作,除非您使用空间索引

对于SQLite,您应该使用R-Tree module,它实现了对这种索引的支持。引用:

  

R-Tree是一个专门用于进行范围查询的索引。 R树最常用于地理空间系统,其中每个条目是具有最小和最大X和Y坐标的矩形。 ...例如,假设数据库记录了大量事件的开始和结束时间。 R-Tree能够快速查找所有事件,例如,在给定时间间隔内任何时间处于活动状态的事件,或在特定时间间隔内启动的所有事件,或者在给定时间内开始和结束的所有事件间隔。

使用R-Tree,您可以在插入新范围之前快速识别所有重叠,并用新的组合条目替换它们。

要创建RTree索引,请使用以下内容:

CREATE VIRTUAL TABLE demo_index USING rtree(
    id, firstChunkPage, lastChunkPage
);

有关详细信息,请read documentation