我确信之前已多次讨论过,但无论出于什么原因,我都找不到任何东西(可能没有咖啡)。
这是一个设计问题。
一个(远程)数据库看起来像这样
id|timestamp|log_entry|task_id
这些内容被提取到PHP / Codeigniter门户并映射到本地数据库
task_id|name|...
现在,解析我需要的远程数据(除其他外)获取与每行相关联的名称。简单的方法是遍历结果,并在每次迭代中进行查找(id - > name)。但是这会产生很多数据库调用。我看到的另一种方法是将所有id-name对预先获取到一个数组中,然后将其用于查找。
对于这个特定的项目,我不认为性能是一个问题。但哪种方法最有效呢?
编辑:伪代码
<?php
// ---------- Multiple queries example ------
$log_result = mysql_query('SELECT id, task_id, log_entry, timestamp FROM remote_db WHERE date=X');
foreach ($log_result as $log_row)
{
// Get task name for row
$task_name = mysql_query("SELECT name FROM local_db WHERE id={$log_row['task_id']}");
// Process this row ...
echo "Proccesed {$task_name} which occured at {$log_row['timestamp']}";
}
// ---------- Array example -----------------
$task_lookup = mysql_query('SELECT id, name FROM local_db');
$log_result = mysql_query('SELECT id, task_id, log_entry, timestamp FROM remote_db WHERE date=X');
foreach ($log_result as $log_row)
{
// Get task name for row
// assume task_lookup[] = array(id => name)
$task_name = $task_lookup[$log_row['task_id']];
// Process this row ...
echo "Proccesed {$task_name} which occured at {$log_row['timestamp']}";
}
?>
答案 0 :(得分:1)
如果您仍然需要所有信息,那么一定要选择一次并循环所需的内容(特别是因为数据库是远程的,许多调用的延迟会加起来)。
编辑:查看伪代码: 您可以使用远程数据库中的ID数组来缩小从本地数据库中获取的结果。类似的东西:
$log_result = mysql_query('SELECT id, task_id, log_entry, timestamp FROM remote_db WHERE date=X');
$task_lookup = mysql_query('SELECT id, name FROM local_db WHERE id IN taskIdsFromLogQuery');