用于以多种不同方式筛选 SQL 数据库内容的编程模式


Programming pattern for filtering SQL database contents in several different ways

我正在做一个项目,我们在SQL数据库中有一个表,该表可能包含相对较大的(数十万(行。

这个项目是用PHP编写的,并且使用PDO访问我的数据库。在这个项目中,为了实现"报告"和各种事情,我需要能够从这个表中选择行,根据我要在哪个上下文中显示数据,按不同的属性过滤数据。

我很好奇在这种情况下,性能非常好的设计会是什么。我已经为此想到了以下选项,但我真的不喜欢其中任何一个:

  • 为每种不同的过滤技术编写一个单独的查询(即 API 函数(。这似乎是不可取的,因为我将在每个函数中复制 90% 的 SQL,并且很难维护(例如,如果我需要更改/修复我的一个查询,我现在需要更改/修复所有这些,而不仅仅是一个(。
  • 提供单个 API 函数,该函数检索未筛选的行列表,然后在我的应用程序中筛选它们,而不是使用 SQL。这是不可取的,因为它浪费了大量精力来处理我的应用程序不关心的行。
  • 使用单个查询
  • 编写单个函数,其中包含各种可选参数,如果提供这些参数,则会更改查询的 WHERE 子句。这可能是我迄今为止最好的选择,但我仍然不确定我是否喜欢它,因为这意味着拥有一个具有非常奇怪签名的函数,并且有一堆三元语句来更改WHERE子句是否给出参数。

是否有一种或多种普遍接受的编程模式来设计提供此类功能的 API?

最简单的方法是使用 ORM 来拥有类似

ORM::getTable('api')->getBaseQuery('get')->filterSomething()->execute();

并让 getBaseQuery 返回没有 WHERE 和多个过滤器的部分,将您的条件添加到基中。

如果您只使用对象,则通过将 basequery 放在基类或接口中来执行相同的操作,并让您的专用查询使用您的条件实现/继承您的基本查询。

如果你使用纯PHP,我会选择策略模式:http://www.phptherightway.com/pages/Design-Patterns.html(不幸的是,您必须滚动他们在那里不提供锚点(。

如果您要修改的只是 where 子句,则可以将查询

的初始部分存储为常量或类似对象(或属性等(中的此类内容,然后为每个查询提供一个函数,该函数抓取查询的第一部分并附加到您的 where 子句上。