0

我们应该创建一个 Web 应用程序,其中包含许多事件,每个事件都有一个位置(创建为用户生成的内容,因此事件的数量会越来越大)。任何事件之间的距离都应该可用,例如确定前 5 个最接近的事件等。用户可以更改事件的位置。

应该如何为此设计数据库/模型(以可扩展的方式)?

我正在考虑使用“距离表”(例如http://www.deutschland-tourist.info/images/entfernungstabelle.gif)。然后每次,如果位置发生变化,则必须重新计算一行和一列(这应该通过延迟工作来完成,因为立即进行更改并不重要)。缩放中可能出现的问题:数据库太大(n 个事件的 n² 项),需要进行的计算过多。例如,我们应该看看这是否适用于 10.000 个用户。如果每个人只创建一个事件,那么这将是 1 亿个整数......

你认为这是一个有效的好方法吗?怎么能用导轨模型实现这样的距离表?是否可以使用 SQL 数据库?你会开始其他方法吗?

4

4 回答 4

1

我会考虑使用图形数据库,因为它更适合您的问题。看看Neo4j。甚至还有一个不错的 ruby​​ 库可供使用:Neography

于 2012-12-13T11:01:45.593 回答
0

请通过以下链接。希望对您有所帮助。
https://github.com/jlecour/geokit-rails3

于 2012-12-13T11:01:34.547 回答
0

PostgreSQL 9.1+ 支持第 k 个最近邻索引。这样的事情可能会给您使用 SQL dbms 的最佳性能,并且不需要维护任何额外的表。

于 2012-12-13T11:22:43.990 回答
0

这可以使用带有纬度/经度坐标的 PHP/MySQL 来实现。Haversine公式用于使用这些坐标确定距离。

30 X 30 矩阵演示在 30 X 30 矩阵上显示距离,如您的示例,以及使用此演示在地图上显示火车站的演示。MySQL数据库结构是

id   | int(11)
name | varchar(200)
lat  | decimal(10,6)
lon  | decimal(10,6)

使用 Haversine 公式的 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;
}
于 2012-12-14T15:47:34.553 回答