优化下一个和上一个元素的查询

Pek*_*ica 28 php mysql algorithm pseudocode data-structures

我正在寻找检索记录的下一个和上一个记录而不运行完整查询的最佳方法.我有一个完全实现的解决方案,并想知道是否有更好的方法来实现这一点.

假设我们正在为一个虚构的蔬菜水果商建立一个网站.除了他的HTML页面,他每周都希望在他的网站上发布特别优惠列表.他希望这些商品位于实际的数据库表中,用户必须能够以三种方式对商品进行排序.

每个项目还必须有一个详细信息页面,其中包含有关提供的更多文本信息以及"之前"和"下一步"按钮."上一个"和"下一个"按钮需要指向相邻条目,具体取决于用户为列表选择的排序.

alt text http://www.pekkagaiser.com/stuff/Sort.gif?

显然,"西红柿,第一类"的"下一步"按钮必须是第一个例子中的"苹果,第1类",第二个中是"梨,第一类",第三个中没有.

详细信息视图中的任务是确定下一个和上一个项目,而不是每次都运行查询,列表的排序顺序是唯一可用的信息(假设我们通过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
Run Code Online (Sandbox Code Playgroud)

很明显,该items列实际上填充了数字ID.

在详细信息页面中,我现在访问相应的sortingcache记录,获取items列,将其展开,搜索当前项ID,并返回上一个和下一个邻居.

array("current"   => "Tomatoes",
      "next"      => "Pears",
      "previous"  => null
      );
Run Code Online (Sandbox Code Playgroud)

这显然很昂贵,仅适用于有限数量的记录并创建冗余数据,但我们假设在现实世界中,创建列表的查询非常昂贵(确实如此),在每个详细视图中运行它都是在问题,需要一些缓存.

我的问题:

  • 您是否认为查找不同查询订单的相邻记录是一种很好的做法?

  • 您是否了解性能和简单性方面的更好实践?你知道一些让它完全过时的东西吗?

  • 在编程理论中,这个问题有没有名称?

  • 名称"Sorting cache"是否适用于此技术并且可以理解?

  • 是否有任何公认的常见模式可以解决这个问题?他们叫什么?

注意:我的问题不是建立列表,或者如何显示详细信息视图.这只是例子.我的问题是当重新查询不可能时确定记录的邻居的基本功能,以及到达那里的最快和最便宜的方式.

如果不清楚,请发表评论我会澄清.

开始赏金 - 也许有更多关于此的信息.

小智 16

这是一个想法.当杂货商插入/更新新的优惠而不是最终用户选择要查看的数据时,您可以将昂贵的操作卸载到更新.这似乎是处理排序数据的非动态方式,但它可能会提高速度.而且,正如我们所知,性能和其他编码因素之间总是存在折衷.

为每个商品和每个排序选项创建一个表以保存下一个和上一个.(或者,如果您始终有三个排序选项,则可以将其存储在商品表中 - 查询速度是对数据库进行非规范化的一个很好的理由)

所以你会有这些列:

  • 排序类型(未分类,价格,类别和价格说明)
  • 优惠ID
  • 上一个ID
  • 下一个ID

当从数据库查询商品详细信息页面的详细信息时,NextID和PrevID将成为结果的一部分.因此,每个详细信息页面只需要一个查询.

每次插入,更新或删除商品时,您都需要运行一个验证sorttype表的完整性/准确性的过程.


noo*_*nex -3

所以你有两个任务:

  1. 构建排序的项目列表(具有不同 ORDER BY 的 SELECT)
  2. 显示有关每个项目的详细信息(从数据库中选择详细信息,并可能进行缓存)。

问题是什么?

PS:如果有序列表可能太大,您只需要实现 PAGER 功能。可能有不同的实现,例如您可能希望将“LIMIT 5”添加到查询中并提供“Show next 5”按钮。当按下此按钮时,会添加“WHERE 价格 < 0.89 LIMIT 5”等条件。