डेटाबेस में Yelp कुशलता से दूरी की गणना कैसे करता है?


9

उदाहरण के लिए, मान लें कि मेरे पास एक तालिका है:

Business(BusinessID, Lattitude, Longitude)

सभी निश्चित रूप से अनुक्रमित हैं। इसके अलावा 1 मिलियन रिकॉर्ड हैं

उदाहरण के लिए, मैं 106,5 के करीब व्यवसाय ढूंढना चाहता हूं, मैं ऐसा कैसे करूंगा?

यदि मैं करता हूँ

SELECT *
FROM Business
WHERE (Some formula to compute distance here) < 2000

उदाहरण के लिए, या अगर मैं करता हूँ

SELECT *
FROM Business
TOP 20

सिद्धांत रूप में कंप्यूटर को सभी बिज़ के लिए दूरी की गणना करनी होगी, जबकि अभ्यास में केवल एक निश्चित सीमा के भीतर अक्षांश और देशांतर वाले लोगों की गणना की जानी चाहिए।

उदाहरण के लिए, मैं पीएचपी, या एसक्यूएल में क्या कर सकता हूं?

मैं अब तक के जवाब के साथ आभारी हूं। मैं mysql का उपयोग कर रहा हूं और उनके पास स्पष्ट समाधान से अधिक कुशल कुछ भी नहीं है। MySQL स्थानिक में या तो दूरी समारोह की गणना नहीं है।

जवाबों:


8

यदि मैं प्रश्न को सही ढंग से समझता हूं (और मुझे यकीन नहीं है कि मैं ऐसा कर रहा हूं), तो आप "(Some formula to compute distance here)"हर बार क्वेरी करते समय तालिका में प्रत्येक पंक्ति के लिए कंप्यूटिंग के बारे में चिंतित हैं ?

इसे अनुक्रमणिका का उपयोग करके एक हद तक कम किया जा सकता है latitudeऔर longitudeइसलिए हमें केवल उन बिंदुओं के 'बॉक्स' के लिए दूरी की गणना करनी होगी, जिसमें हम वास्तव में चाहते हैं कि सर्कल वाले बिंदुओं के 'बॉक्स' के लिए दूरी की गणना करें:

select * from business
where (latitude>96 and latitude<116) and 
      (longitude>-5 and longitude<15) and 
      (Some formula to compute distance here) < 2000

जहाँ 96, 116 आदि को '2000' मूल्य की इकाई से मेल खाने के लिए चुना जाता है और उस बिंदु पर जो आप से दूरी की गणना कर रहे हैं।

यह इंडेक्स आपके RDBMS पर निर्भर करता है और इसके प्लानर द्वारा चुने गए विकल्पों का कितना सही उपयोग करते हैं।

सामान्य शब्दों में, यह एक प्रकार का निकटतम पड़ोसी खोज का अनुकूलन करने का एक प्राथमिक तरीका है । यदि आपका RDBMS GiST इंडेक्स का समर्थन करता है , जैसे पोस्टग्रैस तो आपको इसके बजाय उनका उपयोग करने पर विचार करना चाहिए।


मैंने mysql का इस्तेमाल किया। हालांकि, कुछ mysql इंजन जियोपैटियल का समर्थन करते हैं, हालांकि निर्दोष नहीं।
user4951

क्या मैं सही हूं कि आपके पास MySQL से बदलने का कोई विकल्प नहीं है? किस मामले में कृपया प्रश्न mysql
जैक का कहना है कि topanswers.xyz

वास्तव में मैं अब myisam की सहायक तालिका को जोड़ता हूं अब मैं इसे कुशलतापूर्वक कैसे करूं?
user4951

वैसे मैं मोंगोडब का उपयोग कर सकता हूं। मैंने यह तय नहीं किया है। हालांकि, मैं mysql से सबसे ज्यादा परिचित हूं।
user4951

1
मेरी सलाह होगी कि पोस्टग्रोज़ से परिचित हों, यदि सभी पॉसिबल पर हों - MongoDB की तुलना में यह MySQL के समान है और इसमें स्थानिक डेटा के साथ एक ठोस इतिहास है, और आपकी टिप्पणी कहीं और आपको 'मुक्त' पसंद करने का संकेत देती है।
जैक का कहना है कि topanswers.xyz

6

(प्रकटीकरण: मैं एक Microsoft SQL सर्वर आदमी हूँ, इसलिए मेरे उत्तर उसी से प्रभावित हैं।)

वास्तव में इसे कुशलतापूर्वक करने के लिए, दो चीजें हैं जो आप चाहते हैं: कैशिंग और देशी स्थानिक डेटा समर्थन। स्थानिक डेटा समर्थन आपको भूगोल और ज्यामिति डेटा को सीधे मक्खी पर गहन / महंगी गणना किए बिना डेटाबेस में संग्रहीत करने देता है, और आपको बहुत तेज़ी से अपने वर्तमान स्थान (या सबसे कुशल मार्ग या जो भी) के लिए निकटतम बिंदु खोजने के लिए अनुक्रमणिका बनाने देता है।

यदि आप स्केल करना चाहते हैं तो कैशिंग महत्वपूर्ण है। सबसे तेज़ क्वेरी वह है जिसे आप कभी नहीं बनाते हैं। जब भी कोई उपयोगकर्ता उससे निकटतम चीजों की मांग करता है, तो आप उसका स्थान संग्रहीत करते हैं और परिणाम कैश में सेट किया जाता है जैसे कि Redis या घंटों के लिए याद किया जाता है। व्यावसायिक स्थान 4 घंटे के लिए बदलने नहीं जा रहे हैं - ठीक है, यदि कोई व्यवसाय संपादित करता है, तो वे हो सकते हैं, लेकिन आपको जरूरी नहीं कि सभी परिणाम सेटों में तुरंत अपडेट किया जाए।


मैं आपके लिंक से काम नहीं कर सकता कि क्या SQL सर्वर वास्तव में स्थानिक डेटा को इस तरह से अनुक्रमित करता है जो पास के बिंदुओं की सूची प्राप्त करने के लिए उपयोगी है - क्या ऐसा है?
जैक का कहना है कि टॉपसान्वर्स .xyz


बात यह है कि मैं mysql का उपयोग कर रहा हूं और मैंने सत्यापित किया है कि उनके पास जैक डगलस द्वारा निर्धारित की तुलना में अधिक कुशल कोई एल्गोरिथ्म नहीं है। मुझे आश्चर्य है कि अगर mysql कैशिंग की तरह बात करेंगे। Microsoft SQL भुगतान किया है और mysql मुक्त है
user4951

1
व्यावसायिक स्थान हर समय नहीं बदलेगा, हालांकि लोगों का स्थान होगा।
user4951

0

Yelp संभावना जीआईएस का उपयोग करता है

PostgreSQL में GIS के लिए PostGIS के साथ संदर्भ कार्यान्वयन है । Yelp MySQL का उपयोग कर सकता है जो हर तरह से हीन है । येल्प जैसी किसी चीज़ के मामले में, वे लगभग निश्चित रूप से निर्देशांक रखते हैं,

  • उपभोक्ता
  • संभावित गंतव्य

वे निर्देशांक WGS84 में लगभग निश्चित रूप से हैं, और भूगोल प्रकार के रूप में संग्रहीत हैं। PostgreSQL और PostGIS में यह कुछ इस तरह दिखेगा,

CREATE TABLE businesses (
  id   int               GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  name text,
  geog geography(point)
);
CREATE INDEX ON businesses USING gist(geog);
.... fill table
ANALYZE businesses;

वे उस टेबल को भर देते थे। फिर वे आपके फोन से WGS84 निर्देशांक पकड़ते हैं और एक क्वेरी उत्पन्न करते हैं, जैसे SQL कीमिया (येल्प के मामले में),

SELECT *
FROM businesses AS b
WHERE ST_DWithin( b.geog, ST_MakePoint(userLong,userLat) );

अधिक जानकारी के लिए हमारे देखें , और भौगोलिक सूचना प्रणाली @ StackExchange की जाँच करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.