假设我有一本约2 ^ 40页的书。每天,我都会阅读一大堆连续的页面(有时包括我已经读过的一些页面)。什么是在(SQLite)数据库中存储和更新“我读过哪些页面”信息的最明智的方法?
我目前的想法是在表中存储[firstChunkPage,lastChunkPage]条目,但我不确定如何有效地更新它。
这看起来是一个非常常见的问题,所以我想知道是否有人知道这个'公认'的解决方案。
欢迎任何帮助或想法!
编辑:读取实际上并不是随机的,与页数相比,预计块的数量将非常稳定且非常小。
答案 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。