Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

आप SQL क्वेरी को कैसे प्रबंधित करते हैं

आपके लिए कार्रवाई का सबसे अच्छा तरीका इस बात पर निर्भर करेगा कि आप अपने डेटा एक्सेस तक कैसे पहुंच रहे हैं। आप तीन तरीके अपना सकते हैं:

  • संग्रहीत कार्यविधियों का उपयोग करें
  • प्रश्नों को कोड में रखें (लेकिन अपने सभी प्रश्नों को कार्यों में रखें और मापदंडों के लिए पीडीओ का उपयोग करने के लिए सब कुछ ठीक करें, जैसा कि पहले बताया गया है)
  • ओआरएम टूल का इस्तेमाल करें

यदि आप अपने स्वयं के कच्चे एसक्यूएल को डेटाबेस इंजन में पास करना चाहते हैं तो संग्रहीत प्रक्रियाएं जाने का तरीका होगा यदि आप केवल इतना करना चाहते हैं कि कच्चे एसक्यूएल को अपने PHP कोड से बाहर निकालें लेकिन इसे अपेक्षाकृत अपरिवर्तित रखें। संग्रहीत कार्यविधियाँ बनाम कच्ची SQL बहस एक पवित्र युद्ध का एक सा है, लेकिन K. Scott Allen एक उत्कृष्ट बिंदु बनाते हैं - भले ही वह एक फेंक हो - एक लेख में संस्करण डेटाबेस :

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

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

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

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

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

// UserManager.php:

class UserManager
{
    function getUsers()
    {
        $pdo = new PDO(...);
        $stmt = $pdo->prepare('
            SELECT       u.userId as id,
                         u.userName,
                         g.groupId,
                         g.groupName
            FROM         user u
            INNER JOIN   group g
            ON           u.groupId = g.groupId
            ORDER BY     u.userName, g.groupName
        ');
        // iterate over result and prepare return value
    }

    function getUser($id) {
        // db code here
    }
}

// index.php:
require_once("UserManager.php");
$um = new UserManager;
$users = $um->getUsers();
foreach ($users as $user) echo $user['name'];

हालाँकि, यदि आपके प्रश्न काफी समान हैं, लेकिन आपकी क्वेरी स्थितियों जैसे जटिल पेजिंग, सॉर्टिंग, फ़िल्टरिंग, आदि में बड़ी संख्या में क्रमपरिवर्तन हैं, तो संभवतः एक ऑब्जेक्ट/रिलेशनल मैपर टूल जाने का रास्ता है, हालांकि आपके मौजूदा कोड को ओवरहाल करने की प्रक्रिया उपकरण का उपयोग करना काफी जटिल हो सकता है।

यदि आप ORM टूल की जांच करने का निर्णय लेते हैं, तो आपको प्रोपेल को देखना चाहिए। , Yii का ActiveRecord घटक , या किंग-डैडी PHP ORM, सिद्धांत . इनमें से प्रत्येक आपको जटिल तर्क के सभी प्रकार के साथ अपने डेटाबेस में प्रोग्रामेटिक रूप से क्वेरी बनाने की क्षमता देता है। सिद्धांत सबसे पूर्ण रूप से चित्रित है, जिससे आप अपने डेटाबेस को नेस्टेड सेट जैसी चीज़ों के साथ टेम्पलेट कर सकते हैं। पेड़ का पैटर्न बॉक्स से बाहर।

प्रदर्शन के संदर्भ में, संग्रहीत कार्यविधियाँ सबसे तेज़ हैं, लेकिन आम तौर पर कच्चे sql से अधिक नहीं होती हैं। ओआरएम उपकरण कई तरीकों से महत्वपूर्ण प्रदर्शन प्रभाव डाल सकते हैं - अक्षम या अनावश्यक पूछताछ, प्रत्येक अनुरोध पर ओआरएम पुस्तकालयों को लोड करते समय विशाल फ़ाइल आईओ, प्रत्येक क्वेरी पर गतिशील एसक्यूएल पीढ़ी ... इन सभी चीजों का प्रभाव हो सकता है, लेकिन मैन्युअल क्वेरी के साथ अपनी खुद की डीबी परत बनाने की तुलना में ओआरएम उपकरण का उपयोग आपके लिए उपलब्ध शक्ति को बहुत कम मात्रा में कोड के साथ बढ़ा सकता है।

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

// optional
$attrs = array(PDO::ATTR_PERSISTENT => true);

// create the PDO object
$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "pass", $attrs);

// also optional, but it makes PDO raise exceptions instead of 
// PHP errors which are far more useful for debugging
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $pdo->prepare('INSERT INTO venue(venueName, regionId) VALUES(:venueName, :regionId)');
$stmt->bindValue(":venueName", "test");
$stmt->bindValue(":regionId", 1);

$stmt->execute();

$lastInsertId = $pdo->lastInsertId();
var_dump($lastInsertId);

चेतावनी:यह मानते हुए कि आईडी 1 है, उपरोक्त स्क्रिप्ट string(1) "1" . आउटपुट करेगी . PDO->lastInsertId() वास्तविक कॉलम एक पूर्णांक है या नहीं, इस पर ध्यान दिए बिना आईडी को एक स्ट्रिंग के रूप में लौटाता है। यह शायद आपके लिए कभी भी कोई समस्या नहीं होगी क्योंकि PHP स्वचालित रूप से पूर्णांकों के लिए स्ट्रिंग्स की कास्टिंग करता है।

निम्नलिखित आउटपुट bool(true) . होगा :

// regular equality test
var_dump($lastInsertId == 1); 

लेकिन अगर आपके पास कोड है जो मान के पूर्णांक होने की उम्मीद कर रहा है, जैसे is_int या PHP का "वास्तव में, वास्तव में, 100% बराबर है" ऑपरेटर:

var_dump(is_int($lastInsertId));
var_dump($lastInsertId === 1);

आप कुछ मुद्दों में भाग सकते हैं।

संपादित करें: संग्रहित प्रक्रियाओं पर कुछ अच्छी चर्चा यहां



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एक संख्या से शुरू होने वाले मानों का चयन करें

  2. केस असंवेदनशील फाइल सिस्टम के साथ MacOS पर MySQL केस सेंसिटिविटी टेबल का नाम

  3. MySQL उपनाम फ़ील्ड को एक साथ जोड़ना

  4. MySQL क्वेरी जहां जॉइन केस पर निर्भर करता है

  5. MySQL में किसी कॉलम के लिए अधिकतम मान वाली पंक्ति का चयन कैसे करें?