2013-09-24 14 views
7

मैं एक डेटाबेस डिजाइन है कि यहाँ सरलीकृत संस्करण में इस दिखता हैPHP/MySQL: भारी SQL क्वेरी या कई छोटे प्रश्न?</p> <p>टेबल <code>building</code>:</p> <ul> <li>आईडी</li> <li>attribute1</li> <li>attribute2</li> </ul> <p>डाटा में वहाँ की तरह है:

  • (1, 1, 1)
  • (2, 1, 2)
  • (3, 5, 4)

और टेबल, attribute1_values और attribute2_values, के रूप में संरचित:

  • आईडी
  • मूल्य

कौन सा की तरह जानकारी होती है:

  • (1, "विकल्प 1 का शाब्दिक वर्णन")
  • (2, "विकल्प 2 का शाब्दिक वर्णन")
  • ...
  • (6, "विकल्प 6 का शाब्दिक वर्णन")

मुझे यकीन है कि यह सबसे अच्छा सेटअप है या नहीं, लेकिन यह मेरे प्रोजेक्ट मैनेजर की प्रति आवश्यकताओं के अनुसार किया जाता है। इसमें निश्चित रूप से कुछ सच्चाई है क्योंकि आप आसानी से टेक्स्ट को संशोधित कर सकते हैं बिना आईडी के गड़बड़ किए।

हालांकि अब मैं एक ऐसे पृष्ठ पर आया हूं जहां मुझे विशेषताओं को सूचीबद्ध करने की आवश्यकता है, तो मैं वहां कैसे जा सकता हूं? मुझे दो प्रमुख विकल्प दिखाई देते हैं:

1) एक बड़ी क्वेरी बनाएं जो building से सभी मान एकत्र करती है और साथ ही attribute{x}_values तालिका से सही टेक्स्ट प्रस्तुतिकरण चुनती है।

2) एक छोटी सी क्वेरी बनाएं जो building तालिका से सभी मान एकत्र करती है। फिर उसके बाद एक समय में प्रत्येक विशेषता का पाठपरक प्रतिनिधित्व मिलता है।

चुनने का सबसे अच्छा विकल्प क्या है? विकल्प 1 के रूप में विकल्प 1 भी तेज है? यदि हां, तो क्या रखरखाव से संबंधित अतिरिक्त परेशानी के लायक है?

+6

एक एकल डाटाबेस क्वेरी आम तौर पर कई प्रश्न तुलना में बहुत अधिक कुशल है, और कम कोड के साथ-साथ –

+0

@MarkBaker होना चाहिए 20 गुण हालांकि अप करने के लिए हो सकता है ... एक अलग राय तो है करने के लिए किसी भी कारण? – skiwi

+0

अधिक विशेषताओं, 20 व्यक्तिगत प्रश्नों के बजाय एक प्रश्न का उपयोग करने का अधिक कारण - एक क्वेरी निष्पादित करने के लिए समय लागत परिणाम परिणामों के माध्यम से लूप के समय की तुलना में बहुत अधिक है, इसलिए 20 प्रश्न जो प्रत्येक 1 परिणाम लौटाते हैं लगभग अनिवार्य रूप से 1 क्वेरी से बहुत धीमी है जो 20 परिणाम –

उत्तर

-1

कभी भी एक बार पूछे जाने वाले प्रश्नों में से कोई एक नहीं, उन्हें एक साथ जोड़ने की कोशिश करें।

MySQL आपकी क्वेरी को कैश करेगा और यह बहुत तेज़ होगा। पीएचपी loops डेटाबेस के लिए कई अनुरोध करने से तेज हैं।

क्वेरी कैश क्लाइंट को भेजे गए संबंधित परिणाम के साथ एक SELECT कथन का पाठ संग्रहीत करता है। यदि बाद में एक समान कथन प्राप्त होता है, तो सर्वर फिर से स्टेटस को पार्स करने और निष्पादित करने के बजाय क्वेरी कैश से परिणाम पुनर्प्राप्त करता है।

http://dev.mysql.com/doc/refman/5.1/en/query-cache.html

0

आप गुण तालिका में पंक्तियों की एक छोटी संख्या है, तो मैं उन्हें पहले लाने के लिए सुझाव देते हैं, उन सभी को लाने! सरणी में इंडेक्स कुंजी के रूप में आईडी का उपयोग करके उन्हें कुछ सरणी में स्टोर करें।

तो फिर तुम इमारत डेटा के साथ आगे बढ़ सकते हैं, अब तुम सिर्फ संबंधित सरणी का उपयोग करने के विशेषता मान

0

मैं कुछ के बीच की सिफारिश करेंगे देखने के लिए है। Php में पहली तालिका के परिणाम को पार्स करें, और यह पता लगाएं कि प्रत्येक विशेषता [x] _values ​​तालिका से आपको कितने विशेषताओं को चुनने की आवश्यकता है।

फिर आप प्रत्येक क्वेरी प्रति एक क्वेरी का उपयोग करके थोक में विशेषताओं का चयन कर सकते हैं, प्रति प्रति एक क्वेरी या एक प्रति क्वेरी।

1

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

+0

एक दृष्टिकोण को एक दक्षता दृष्टिकोण से 1 प्रश्न में लिखने से अलग कैसे होगा? –

+0

डेटा को एक दृश्य में एकत्र करें और फिर उस से पूछताछ करें ताकि आपको डेटा खींचने के लिए हर बार जुड़ने से भरा लंबे प्रश्नों को लिखना न पड़े। यह किसी भी चीज़ से अधिक कोड कुशल है। यह डेटाबेस में डेटा देखने का एक और अधिक प्रस्तुत करने योग्य तरीका भी देता है क्योंकि यह कई तालिकाओं में है। मैं वास्तव में कल्पना नहीं कर सकता कि आप एक दृश्य क्यों नहीं चाहते हैं, जब तक कि आपके पास कोई कारक न हो कि मैं विचार नहीं कर रहा हूं। – dsimer

0

यहाँ एक PHP समाधान है:

$query = "SELECT * FROM building"; 
$result = mysqli_query(connection,$query); 
$query = "SELECT * FROM attribute1_values"; 
$result2 = mysqli_query(connection,$query); 
$query = "SELECT * FROM attribute2_values"; 
$result3 = mysqli_query(connection,$query); 
$n = mysqli_num_rows($result); 
for($i = 1; $n <= $i; $i++) { 
    $row = mysqli_fetch_array($result); 
    mysqli_data_seek($result2,$row['attribute1']-1); 
    $row2 = mysqli_fetch_array($result2); 
    $row2['value'] //Use this as the value for attribute one of this object. 
    mysqli_data_seek($result3,$row['attribute2']-1); 
    $row3 = mysqli_fetch_array($result3); 
    $row3['value'] //Use this as the value for attribute one of this object. 
} 

ध्यान रखें कि यह समाधान जरूरी है कि टेबल attribute1_values ​​और attribute2_values ​​1 हर एक पंक्ति द्वारा पर 1 और वृद्धि शुरू करते हैं।

0

ओरेकल/Postgres/MySql यहाँ डीबीए:

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

इष्टतम परिणाम इसे 1 क्वेरी के रूप में चलाने के लिए होगा, और एक बार में परिणाम 1 लाएगा, प्रत्येक को आवश्यकतानुसार प्रदर्शित करेगा और इसे छोड़ देगा, जो एमवीसी ढांचे के साथ विनाश को तब तक कर सकता है जब तक कि आप या तो आरामदायक मॉडल कोड नहीं कर रहे हों अपने विचार में, या छोटे दृश्य टुकड़े चलाएं।

0

आपका प्रश्न बहुत सामान्य है और मुझे लगता है कि एक उत्तर पाने के लिए आपको यह संकेत देना चाहिए कि यह पृष्ठ कैसा दिखता है और डेटासेट कितना बड़ा है। आप सभी इमारतों को उनके गुणों के साथ प्राप्त करेंगे या सिर्फ एक समय में? क्योंकि आपकी डेटा संरचना बहुत सरल दिखती है और रास्पबेरीपी से कहीं ज्यादा कुछ इसे बहुत अच्छी तरह से संभाल सकता है।

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

$att1[1]='description1' 
$att1[2]='description2' 
.... 
संबंधित मुद्दे