我正在寻找在不运行完整查询的情况下检索记录的下一个和上一个记录的最佳方法。我有一个完全实施的解决方案,并且想知道是否有更好的方法可以做到这一点。
假设我们正在为一个虚构的蔬菜水果商建立一个网站。除了他的 HTML 页面,他每周都想在他的网站上发布一份特别优惠列表。他希望这些报价驻留在实际的数据库表中,并且用户必须能够以三种方式对报价进行排序。
每个项目还必须有一个详细信息页面,其中包含有关报价的更多文本信息以及“上一个”和“下一个”按钮。“上一个”和“下一个”按钮需要根据用户为列表选择的排序指向相邻的条目。
(来源:pekkagaiser.com)
显然,“Tomatoes, Class I”的“下一个”按钮在第一个示例中必须是“Apples, class 1”,在第二个示例中必须是“Pears, class I”,而在第三个示例中没有。
详细视图中的任务是确定下一个和上一个项目,而无需每次都运行查询,将列表的排序顺序作为唯一可用的信息(假设我们通过 GET 参数得到?sort=offeroftheweek_price
,并忽略安全隐患) .
显然,简单地将下一个和前一个元素的 ID 作为参数传递是想到的第一个解决方案。毕竟,此时我们已经知道 ID。但是,这不是一个选项——它可以在这个简化的例子中工作,但在我的许多现实世界用例中却不行。
我目前在我的 CMS 中使用的方法是使用我命名为“排序缓存”的东西。加载列表时,我将项目位置存储在名为 的表中的记录中sortingcache
。
name (VARCHAR) items (TEXT)
offeroftheweek_unsorted Lettuce; Tomatoes; Apples I; Apples II; Pears
offeroftheweek_price Tomatoes;Pears;Apples I; Apples II; Lettuce
offeroftheweek_class_asc Apples II;Lettuce;Apples;Pears;Tomatoes
显然,该items
列实际上填充了数字 ID。
在详细信息页面中,我现在访问相应的sortingcache
记录,获取items
列,展开它,搜索当前项目 ID,并返回上一个和下一个邻居。
array("current" => "Tomatoes",
"next" => "Pears",
"previous" => null
);
这显然很昂贵,仅适用于有限数量的记录并创建冗余数据,但让我们假设在现实世界中,创建列表的查询非常昂贵(确实如此),在每个详细视图中运行它都没有这个问题,需要一些缓存。
我的问题:
您认为这是找出不同查询顺序的相邻记录的好习惯吗?
您知道性能和简单性方面的更好做法吗?你知道什么使这完全过时吗?
在编程理论中,这个问题有名字吗?
“排序缓存”这个名称对于这种技术是否合适且易于理解?
是否有任何公认的通用模式来解决这个问题?他们叫什么?
注意:我的问题不是关于构建列表,或者如何显示详细视图。这些只是例子。我的问题是在无法重新查询时确定记录邻居的基本功能,以及到达那里的最快和最便宜的方式。
如果有不清楚的地方,请发表评论,我会澄清。
开始赏金 - 也许有更多关于这方面的信息。