距离矩阵表,当找不到时,做一些事情

时间:2016-08-01 18:05:28

标签: php mysql

我的应用程序根据距离匹配人。距离是使用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一起使用。

  1. 还不确定......
  2. 您看到了哪些选项?

    提前致谢!

1 个答案:

答案 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)来改进它。但是,如果您计划使用您的应用进行扩展,那么以后可能会遇到问题。