我的应用程序根据距离匹配人。距离是使用Google Maps API距离矩阵计算的。 它将人员的位置分组,然后使用API进行1次查询。
示例:
FROM: 纽约 洛杉矶 芝加哥 纽约 纽约 洛杉矶
TO: 洛杉矶 圣地亚哥 达拉斯 达拉斯 达拉斯 奥斯汀
数组将是: 从: 纽约 洛杉矶 芝加哥
TO: 洛杉矶 圣地亚哥 达拉斯 奥斯汀
对于相同的城市使用Google API,可以优化每次刷新。所以我在考虑创建一个包含城市的表格。
CREATE TABLE IF NOT EXISTS `distancematrix` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`from` varchar(100) NOT NULL,
`to` varchar(100) NOT NULL,
`distancetime` int(11) NOT NULL,
`distancekm` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `from` (`from`),
KEY `to` (`to`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
现在我想创建一个首先检查表的库(我正在使用CodeIgniter),如果没有结果,它应该使用Google API并将结果存储到下一次。
你会如何编写这样的函数?它必须是有效的,因此我正在寻求建议。我显然不希望有不必要的循环。
应该通过在其中抛出from和a来调用该函数。
表格的功能:
public function get_distance($from, $to) {
$result_array = array();
if (is_array($from)) {
foreach($from as $index => $origin) {
$query = $this->db->select("`from` as `origin`, `to` as `destination`, distancetime, distancekm, 'true' as result", false)
->from('distancematrix')
->where('from', $origin)
->where_in('to', $to);
$query_result = $query->get()->result_array();
$opposite = $this->db->select("`from` as `destination`, `to` as `origin`, distancetime, distancekm, 'true' as result", false)
->from('distancematrix')
->where_in('from', $to)
->where('to', $origin);
$opposite_result = $opposite->get()->result_array();
$merge_result = array_merge($query_result, $opposite_result);
$result_array[$origin] = $merge_result;
}
}
return $result_array;
}
我看到的选项: 1.对每个组合执行查询,如果找不到,请将其放入未找到的数组中。这个未找到的数组稍后将与API一起使用。
您看到了哪些选项?
提前致谢!
答案 0 :(得分:0)
我有一个类似的"我的一个应用程序中的问题,我们需要为500名明星提供前200条推文(固定列表)。他们的前200条推文不断更新,所以我们不断需要拨打twitter流apis。我们以类似的方式解决了这个问题:通过创建数据库表来存储信息并每天运行CRON作业,这将刷新表中的数据。
你的情况更具挑战性。 $ to 和 $ from 可能会有很多的可能性。你没有固定的清单(就像例子中的明星一样)。我看到的一个问题是缩放。您计划在数据库中保留一个数据缓存,因为它太大了。它可以进行优化:您可以将附近的城市合并在一起并将其统计为一个。但那就足够了吗?从长远来看,这个解决方案可能无法解决。
你提到的选项1是好的:
a)在当地检查
(尽可能多地优化它,例如:
a.1)提出相反的查询是好的:因为你不想存储两次
a.2)如果您正在检查 X 和 Z 之间的距离,并且您的距离在 X 和 Y 之间以及 Y 和 Z 您可以使用该信息来获得近似距离。等)
b)如果未找到,请将其标记为未找到
c)查询API
d)获取结果并在本地存储。
你应该对这个解决方案没问题,你可以通过优化a)来改进它。但是,如果您计划使用您的应用进行扩展,那么以后可能会遇到问题。