0

それぞれが場所を持つ多数のイベントを持つ Web アプリを作成する必要があります (ユーザー生成コンテンツとして作成されるため、イベントの数はますます多くなります)。たとえば、上位 5 つの最も近いイベントなどを決定するために、イベント間の距離が利用可能である必要があります。ユーザーはイベントの場所を変更できます。

このためのデータベース/モデルをどのように設計する必要がありますか (スケーラブルな方法で)?

「距離表」でやろうと思っていました(http://www.deutschland-tourist.info/images/entfernungstabelle.gifのように)。次に、場所が変更されるたびに、1 つの行と 1 つの列を再計算する必要があります (変更を即座に行うことは重要ではないため、これは遅延ジョブで行う必要があります)。スケーリングで考えられる問題: データベースが大規模 (n 個のイベントに対して n² アイテム)、実行する計算が多すぎます。たとえば、これが 10.000 人のユーザーにとって問題ないかどうかを確認する必要があります。それぞれが 1 つのイベントのみを作成した場合、これは 1 億の整数になります...

これは効率的に行うための良い方法だと思いますか? Railsモデルでこのような距離テーブルを実現するにはどうすればよいでしょうか? SQLデータベースで可能ですか? 他のアプローチを開始しますか?

4

4 に答える 4

1

あなたの問題により自然に適合するので、私はグラフデータベースの使用を検討したいと思います。Neo4jを見てください。使用できる素敵なルビーライブラリもあります:Neography

于 2012-12-13T11:01:45.593 に答える
0

これは、緯度/経度座標でPHP / MySQLを使用して実現できます。HaversineFormula、これらの座標を使用して距離を決定するために使用されます。

30X30マトリックス 例のように30X30のマトリックスに距離を表示するデモと、これを使用して地図上に駅を表示するために使用するデモ。MySQLデータベースの構造は

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

HaversineFormulaを使用したSQLSELECTステートメントは次のとおりです。

$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関数を使用して路地から生成されます

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 に答える
0

次のリンクをご覧ください。それがあなたを助けることを願っています。
https://github.com/jlecour/geokit-rails3

于 2012-12-13T11:01:34.547 に答える
0

PostgreSQL 9.1+ は、kth Nearest Neighbor Indexing をサポートしています。このようなものは、おそらくSQL dbms を使用して最高のパフォーマンスを提供し、追加のテーブルを維持する必要はありません。

于 2012-12-13T11:22:43.990 に答える