2

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

这个项目是用 PHP 编写的,并且使用 PDO 来访问我的数据库。在这个项目中,为了实现“报告”和各种事情,我需要能够从这个表中选择行,通过不同的属性过滤数据,这取决于我将在什么上下文中显示数据。

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

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

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

4

2 回答 2

2

最简单的方法是使用 ORM 来获得类似的东西

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

并让 getBaseQuery 返回没有 WHERE 和多个 filterSomething 将您的条件添加到基础的部分。

如果您只使用对象,请通过将基本查询放在基类或接口中来做同样的事情,并让您的专门查询根据您的条件实现/继承您的基本查询。

如果您使用纯 php,我会采用策略模式: http ://www.phptherightway.com/pages/Design-Patterns.html (不幸的是,您必须滚动它们不提供锚点)。

于 2013-10-11T20:40:47.040 回答
1

如果您要修改的只是 where 子句,则可以将查询的初始部分存储为常量或一个对象(或属性等),然后为每个查询提供一个函数,该函数可以获取查询并附加在您的 where 子句上。

于 2013-10-11T20:31:45.840 回答