ber*_*kes 5 php mysql refactoring
我正在寻找一个好的设计模式,或最佳实践,以实现"此查询,或其他查询"的情况,具有最佳性能和最小开销.
demans的商业逻辑/程序说"自Foo之后的所有项目",除非返回少于三个项目,然后是"所有项目".我正在重构当前的代码,并且无法想出实现这种逻辑的好方法.
当前的伪代码(Drupal/PHP):
<?php
$result = db_query(
'SELECT n.uid FROM og_ancestry oga ' .
'INNER JOIN node n on n.nid = oga.nid ' .
'WHERE oga.group_nid = %d AND n.created > %d GROUP BY n.uid ' .
'ORDER BY cnt DESC LIMIT %d', $group_nid, $since, $limit);
while ($row = db_fetch_array($result)) {
$uids[] = $row['uid'];
}
if (count($uids) < 3) {
$result = db_query(
'SELECT n.uid FROM og_ancestry oga ' .
'INNER JOIN node n on n.nid = oga.nid ' .
'WHERE oga.group_nid = %d GROUP BY n.uid ' .
'ORDER BY cnt DESC LIMIT %d', $group_nid, $limit);
while ($row = db_fetch_array($result)) {
$uids[] = $row['uid'];
}
}
//...do something with the result.
?>
Run Code Online (Sandbox Code Playgroud)
这段代码感觉"不对",首先是因为DRY:它包含相同的查询,只有一个小的区别.我可以通过更聪明的查询构建来改变它.
但更糟糕的是,我需要锤击数据库(查询非常繁重)只是为了发现在超过一半的情况下,我需要丢弃结果并再次查询数据库.
你会如何处理这种情况?
如果,正如您所说,“在超过一半的情况下,我需要丢弃结果并再次查询数据库”,那么您最好的选择可能是仅运行第二个查询,然后在本地评估结果数据集,丢弃记录(如果适用)。实际上,这更多的是一种转移复杂性的问题,而不是降低复杂性的问题,但至少只有一次数据库访问。
如果是ORDER BY n.created DESC,过滤可以简单地查看第三条记录,如果它早于 foo,则完成;否则,您需要找到 foo 之前的第一条记录并丢弃它和后续记录。
| 归档时间: |
|
| 查看次数: |
181 次 |
| 最近记录: |