Я ищу хороший шаблон проектирования или лучшую практику для достижения ситуации «либо этого запроса, либо другого запроса», с лучшей производительностью и минимальными накладными расходами.
Бизнес-логика / программа деманов гласит «все элементы, начиная с 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.
?>
Этот код чувствует себя «не правильно», прежде всего из-за DRY : он содержит тот же запрос, с одним небольшим отличием. Я могу изменить это с помощью более умного построения запросов.
Но хуже то, что мне нужно забить базу данных (запрос довольно тяжелый) только для того, чтобы выяснить, что в более чем половине случаев мне нужно отбросить результат и снова запросить базу данных.
Как бы вы подошли к такому случаю?