2009-02-09 12 views
6

मेरे पास मेरे डेटाबेस में रिकॉर्ड्स की एक सूची है और प्रत्येक रिकॉर्ड एक ज़िप कोड से जुड़ा हुआ है।ज़िप कोड के एन मील के भीतर रिकॉर्ड के लिए डेटाबेस से पूछताछ करने का सबसे अच्छा तरीका क्या है?

किसी अन्य ज़िप कोड के एन मील के भीतर सभी प्रविष्टियों को खोजने के लिए मेरे डेटाबेस में सभी रिकॉर्ड्स पूछने के लिए "सर्वोत्तम अभ्यास" क्या है?

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

ऐसा लगता है कि इस तरह की एक आम क्वेरी के लिए बेहद संगणकीय रूप से महंगा लगता है।

मैंने सभी जोड़ों को पूर्व-गणना करने पर भी विचार किया है लेकिन यह भी विचार करने के लिए बहुत बड़ा लगता है। अमेरिका में लगभग ~ 40,000 ज़िप कोड हैं। इसलिए, प्रत्येक ज़िप कोड के सभी जोड़े डेटाबेस (40,000)^2, या 1.6 बिलियन प्रविष्टियां होंगी।

मुझे पता है कि यह वेबसाइटों पर एक आम समस्या है इसलिए उम्मीद है कि कोई मुझे सही तरीके से सही दिशा में इंगित कर सकता है। मैं SQL सर्वर 2008 का उपयोग कर रहा हूं और यदि वहां पूर्व-निर्मित समाधान हैं तो महान, क्योंकि मैं वास्तव में इस उदाहरण में व्हील को फिर से आविष्कार नहीं करना चाहता हूं।


संबंधित प्रश्न: Getting all zip codes within radius (यह मेरी मदद नहीं की थी)
इसके अलावा, मैं इस SourceForge परियोजना के बारे में पता है, लेकिन यह परित्यक्त और अब उपयोग में है।

उत्तर

7

मैं एक प्रश्न है कि रेडियल खोज चक्र encompasing (minlat < अक्षां < maxlat और < लंबे < maxlong minlong), और फिर बाद प्रक्रिया इस के भीतर केवल अंक वापस जाने के लिए सभी रिकॉर्ड वर्ग लिफाफे में कोष्ठकों के भीतर वापस आ चल पाएंगे त्रिज्या सर्कल खुद। (सुनिश्चित करें कि आपके lat और long फ़ील्ड अनुक्रमित हैं)।

यदि आप फैंसी प्राप्त करना चाहते हैं, तो SQL सर्वर spatial indexes का समर्थन करता है।

+0

डांग: मुझे इसे हराएं! –

0

यह वास्तव में हल करने के लिए एक बहुत ही कठिन समस्या है। मैं आपको डेटाबेस बनाने से पहले कुछ धोखाधड़ी करने की सलाह दूंगा। आपको जो भी प्रकार की निकटता खोजने की आवश्यकता है, उसका ग्रिड बनाएं, उदाहरण के लिए, प्रत्येक दिशा में हर 10 मील लें, उस ग्रिड पॉइंट और दूरी के लिए प्रत्येक ज़िप के लिए डेटाबेस में एक प्रविष्टि जोड़ें, और फिर जब कोई क्वेरी आती है, तो आप पहले क्वेरी पॉइंट को अपने ग्रिड पॉइंट्स में से एक में अनुवाद करें। अब आप दूरी को आसानी से देख सकते हैं।

यह समाधान मूल रूप से समय के लिए व्यापार स्थान का मतलब है, ताकि आप जल्दी से एक बड़ा डेटाबेस प्राप्त कर सकें। अच्छी खबर यह है: यह सूचकांक के लिए बहुत आसान डेटा है।

+0

सभी जोड़े पूर्व-गणना एक प्रकार का बड़ा होगा। Aprox। 40,000 हमें ज़िप कोड, इसलिए प्रत्येक श्रेणी के लिए (40,000)^2 बहुत सारी डेटाबेस प्रविष्टियां होंगी। – mmcdole

+0

यह प्रत्येक श्रेणी के लिए लगभग 1.6 अरब प्रविष्टियां होगी ... मुझे नहीं पता कि यह एक विकल्प होगा या नहीं। – mmcdole

+0

असल में ओला बिनी का सुझाव है कि आप प्रविष्टियों की मात्रा को बहुत कम कर सकते हैं यदि आप ज़िप कोड (उसके उदाहरण में 10 मील) के बीच अधिकतम दूरी को सीमित कर सकते हैं – tehvan

3

मैं a site that needs to run this query about once per second per user चलाने के लिए, और यहाँ मैं क्या सीखा है है:

सबसे पहले, सुनिश्चित करें कि आपके स्थान तालिका अक्षांश और देशांतर पर अनुक्रमित है बनाते हैं। यदि आपके पास लाखों रिकॉर्ड हैं तो 20ms और 15s प्रतिक्रिया समय के बीच यह अंतर है।

साथ काम करने के लिए स्थानों का एक सेट प्राप्त करने के लिए बाउंडिंग-बॉक्स क्वेरी के साथ प्रारंभ करें। फिर उन पर दूरी की गणना करें, क्रमबद्ध करें, और यदि आप सटीकता के बारे में चिंतित हैं, तो कुछ बाहर फ़िल्टर करें।

सचमुच, मैं कुछ भी कंप्यूटिंग के बारे में चिंता नहीं करता।जैसे मैं कहता हूं, मैं 6,000,000 प्रविष्टियों के साथ एक स्थान तालिका के खिलाफ इस प्रकार की क्वेरी चलाता हूं, और यह आमतौर पर < 50ms में परिणाम देता है। आपकी जरूरतों के आधार पर, यह वास्तव में पर्याप्त तेज़ होने के लिए कुछ भी नहीं है।

शुभकामनाएं!

+0

इस मुद्दे पर आपकी व्यक्तिगत जानकारी के लिए धन्यवाद। मैं इसकी सराहना करता हूं। – mmcdole

0

आपको GeoNames.org पर देखना चाहिए। आप जो भी खोज रहे हैं उसके लिए आप उनके webservice से पूछ सकते हैं, या आप dl thier डेटाबेस कर सकते हैं।

संबंधित मुद्दे

 संबंधित मुद्दे