我正在做一个项目,我们在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 子句上。