Jadi, singkatnya,
- Apa yang harus menjadi tipe data lintang dan bujur?
- Apa perintah SQL yang harus saya panggil untuk mendapatkan 100 restoran terdekat pertama misalnya?
Detail:
Saya memiliki 100k catatan bisnis masing-masing dengan lattitude dan bujur. Saya melihat bahwa MySQL sebenarnya mendukung tipe data yang disebut point. Haruskah saya menggunakannya?
Apakah MySQL mendukung sistem penyimpanan KDTree http://en.wikipedia.org/wiki/File:KDTree-animation.gif
Apakah lebih baik menggunakan tipe data titik daripada tipe data float biasa untuk menyimpan latitutude dan bujur?
Akhirnya saya ingin menemukan hal-hal seperti 100 restoran pertama yang paling dekat dengan poin 105,6 misalnya dan database saya mengandung banyak biz dan poin. Jelas menghitung jarak satu per satu untuk setiap catatan dan untuk setiap poin akan menjadi O (n) dan karenanya menyebalkan.
Perhatikan bahwa saya mengetahui solusi yang lebih sederhana yang dijelaskan dalam Bagaimana Cara Aplikasi Seperti Yelp. Ambil informasi jarak dari basis data secara efisien dan akan mengimplementasikannya sendiri sebagai permulaan. Itu jawaban yang bagus.
Namun, saya pikir ada satu creme dari jawaban krop yang harus mengungguli itu kan? Bahkan, menyimpan lokasi berdasarkan lintang dan bujur dan menemukan barang-barang terdekat adalah masalah yang sangat umum. Saya berharap mysql memiliki pola desain khusus untuk itu. Apakah ada itu?
Di mana saya bisa belajar lebih banyak tentang itu? Terima kasih.
Jawaban:
Sejauh pola desain, pertanyaan Yelp adalah hal yang cukup standar.
Untuk jawaban yang lebih kompleks, Anda mungkin perlu jarak geospasial. Berikut ini adalah powerpoint yang menarik tentang topik itu (dan di sini juga ada versi pdf). Namun, matematika yang terlibat cukup jelek.
Dari slide mereka:
Ada jawaban yang lebih dalam dan lebih mendalam tentang jarak geospasial pada Stack Overflow .
Tetapi Anda masih ingin membatasi hasil dengan lintang dan bujur.
Pada akhirnya, saya akan menghindari datatype TITIK dan pergi dengan lintang / bujur. Saat ini tidak ada cara untuk menentukan jarak antara dua POINT, jadi Anda harus menyimpan lintang / bujur untuk perhitungan itu.
Satu tautan terakhir: Anda mungkin juga ingin memeriksa utas SO ini tentang mempercepat kueri menggunakan indeks spasial.
sumber
Tipe data titik OK; Anda bisa memanggil X (coord) / Y (coord) untuk mendapatkan nilai Lat / Lon.
Sebagai contoh:
sumber
Temukan 100 restoran terdekat dengan beberapa koordinat: Lihat kode efisien di http://mysql.rjweb.org/doc.php/latlng Ini mencakup fungsi tersimpan untuk menghitung jarak "cirle besar".
sumber