何百万ものレコードを持つ可能性のあるユーザーを表すデータベース テーブルがあるとします (希望的観測)。このテーブルには、ユーザーの場所に関する情報を含む、各ユーザーに関するさまざまな情報が含まれています。
- 街
- 郡/州など
- 国
- 緯度
- 経度
- 緯度/経度の値に基づくジオハッシュ。
ログインしたユーザーが近くにいる他のユーザーを検索できる機能を実装したいと思います。
理想的には、ユーザーに地理的に最も近い 20 人のユーザーを取得し、次の 20 人、次の 20 人などを取得したいと考えています。したがって、基本的に、特定のポイントからの距離でユーザー テーブルを注文できるようにしたいと考えています。 .
アプローチ1
私は、ある点と他の数百点の間の距離を計算するために使用した hasersine 式の以前の経験があります。このアプローチは、比較的小さなレコード セットでは理想的ですが、そのような大規模なレコード セットでは信じられないほど遅くなることが懸念されます。
アプローチ 2
さらに、ジオハッシュについていくつかの調査を行い、ハッシュがどのように計算されるかを理解し、それが場所を表す方法と、解像度が短いと精度が失われる方法の背後にある理論を理解しました。もちろん、geohash の開始点が似ているユーザーを取得することで、ユーザーの地理的エリアの近くにいるユーザーを取得できます (指定した精度に基づいて、近隣の地域を調べる可能性があります)。しかし、それでは問題は解決しません。場所ごとに並べ替える必要があります。このアプローチは、2 人のユーザーが互いに非常に近くにいる可能性があるが、geohash で表される 2 つの領域の端に近いエッジ ケースにも適していません。
アプローチに対するアイデア/提案は大歓迎です。特にコードを探しているわけではありませんが、良い例やリソースへのリンクは役に立ちます。
ありがとう、ジョナサン
編集
アプローチ 3
しばらく考えた後、考慮すべき別の潜在的な解決策を思いつきました。各ユーザーの位置情報を受け取ると、その位置に関する情報 (町/都市、地域、国、緯度、経度、ジオハッシュなど) を別のテーブル (たとえばlocations
) に格納します。次に、外部キーによってユーザーをその場所に接続します。これにより、作業するデータセットがはるかに小さくなります。近くのユーザーを見つけるには、ユーザーの場所に近い他の場所を見つけて、その ID を使用して他のユーザーを見つけることができます。おそらく、各場所の近くの場所 ID のリストを保存することで、何らかのキャッシングを実装できます。