我最近设计了一个使用大量查询的网站。在开发我的网站期间,我遇到了一个非常耗时且令人沮丧的问题。
所以问题是,在某个时候我想向网站添加一个附加功能,这对我的查询影响最大,我需要更改其中的大部分才能使该功能正常工作。所以让我举个例子:假设我有一个用户表,我没有添加一列来检查用户是否被禁止。现在我添加了“banned”列,现在的问题是,我需要安排所有其他查询来首先检查用户是否被禁止。我希望这是有道理的。
所以我的问题是,有没有一种方法可以最大限度地减少这项工作,而不是遍历所有查询并修改它们(添加 is user banned),而是添加一次该功能,查询就可以工作了?基本上我该如何改进?
我希望这是有道理的,如果没有,我会尽力进一步解释。
如果能帮助我提高编码知识,我们将不胜感激。
附言。 我正在使用 SQL 和 PHP。如果有比 SQL 更好的东西可以解决这个问题,请提出建议。
谢谢
最佳答案
我明白你的问题。你有一些列规则。在所有应用程序中全局使用。例如,在我的例子中有“状态”列,并且有一些逻辑含义称为“重要”,如果列具有集合中的特定值之一,它就起作用。
所以,在任何地方,要检查状态是否“重要”,我需要写:
WHERE `status` IN('INCIDENT', 'ERROR')
如果我需要将“FLAGGED”添加到重要状态列表中,我需要重写所有 SQL 查询:
WHERE `status` IN('INCIDENT', 'ERROR', 'FLAGGED')
一旦我厌倦了这个。我决定编写一个 MySQL 函数来完成这项工作。称之为 IS_STATUS_IMPORTANT(状态)。 但是这个解决方案没有通过测试,因为它降低了性能——它不允许 MySQL 正确使用索引。
我最终通过创建一些应用程序全局条件解决了这个问题,比方说:
class DbHelper {
public static function importanceCondition($column_name) {
return $column_name . " IN('INCIDENT', 'ERROR') ";
}
}
现在我在整个应用程序中编写:
$sql = 'SELECT * FROM blah .... WHERE ... AND ' . DbHelper::importanceCondition('x.status');
如果我需要更改一些逻辑条件,我会在一个地方进行,并且它适用于整个应用程序。
在你的情况下你可以添加一些功能
class DbHelper {
...
public static function validUserCondition($user_alias) {
return " ({$user_alias}.deleted = 0 AND {$user_alias}.banned = 0) ";
}
}
关于php - 改进 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31000881/