If db query A не возвращает достаточных результатов, запустите запрос B: как оптимизировать?

Я ищу хороший шаблон проектирования или лучшую практику для достижения ситуации «либо этого запроса, либо другого запроса», с лучшей производительностью и минимальными накладными расходами.

Бизнес-логика / программа деманов гласит «все элементы, начиная с 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 : он содержит тот же запрос, с одним небольшим отличием. Я могу изменить это с помощью более умного построения запросов.

Но хуже то, что мне нужно забить базу данных (запрос довольно тяжелый) только для того, чтобы выяснить, что в более чем половине случаев мне нужно отбросить результат и снова запросить базу данных.

Как бы вы подошли к такому случаю?

5
задан berkes 20 August 2010 в 14:43
поделиться