我们应该创建一个Web应用程序,其中包含多个事件,每个事件都有一个位置(创建为用户生成的内容,因此事件的数量将越来越大)。 任何事件之间的距离应该是可用的,例如,以确定前5个最接近的事件和这样的事情。 用户可以更改事件的位置。
如何为此设计数据库/模型(以可扩展的方式)?
我正在考虑使用“距离表”(就像http://www.deutschland-tourist.info/images/entfernungstabelle.gif)这样做。然后,每次,如果位置发生变化,必须重新计算一行和一列(这应该通过延迟作业来完成,因为立即进行更改并不重要)。缩放中可能出现的问题:数据库变大(n个事件的n项),计算量太大。例如,我们应该看看这对10.000用户是否可行。如果每个事件只创建了一个事件,那么这将是1亿个整数......
您认为这是一种有效的方法吗?怎么能用轨道模型实现这样的距离表?是否可以使用SQL数据库? 你会开始其他方法吗?
答案 0 :(得分:1)
答案 1 :(得分:0)
请浏览以下链接。希望能帮到你。 <是/> https://github.com/jlecour/geokit-rails3
答案 2 :(得分:0)
PostgreSQL 9.1+支持kth nearest neighbor indexing。这样的事情可能使用SQL dbms为您提供最佳性能,并且不需要维护任何其他表。
答案 3 :(得分:0)
这可以使用带有latidude / longditude坐标的PHP / MySQL来实现。Haversine Formula用于使用这些坐标确定距离。
demo在30 X 30矩阵上显示距离(如您的示例),demo用于在地图上显示火车站。 MySQL数据库结构是
id | int(11)
name | varchar(200)
lat | decimal(10,6)
lon | decimal(10,6)
使用Haversine Formula的SQL SELECT语句是
$stmt = $dbh->prepare("SELECT name, lat, lng, ( 3959 * acos( cos( radians(?) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(?) ) + sin( radians(?) ) * sin( radians( lat ) ) ) ) AS distance FROM mytable ORDER BY distance LIMIT 0 , 30");
// Assign parameters
$stmt->bindParam(1,$lat);//from search location
$stmt->bindParam(2,$lng);//from search location
$stmt->bindParam(3,$lat);// duplicate of parameter 1
matix是使用PHP函数
从allays生成的function distanceHaversine($lat1, $lon1, $lat2, $lon2) {
$deltaLat = $lat2 - $lat1 ;
$deltaLon = $lon2 - $lon1 ;
$earthRadius = 3959; // in miles 6371 in meters.
$alpha = $deltaLat/2;
$beta = $deltaLon/2;
$a = sin(deg2rad($alpha)) * sin(deg2rad($alpha)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin(deg2rad($beta)) * sin(deg2rad($beta)) ;
$c = asin(min(1, sqrt($a)));
$distance = 2 * $earthRadius * $c;
$distance = round($distance, 4);
return $distance;
}