मुझे डेटाबेस का उपयोग कैसे करना चाहिए?


10

डेटाबेस एक्सेस को प्रबंधित करने के लिए उपयोग किए जाने वाले अच्छे वर्ग संरचनाओं के कुछ उदाहरण क्या हैं? मैं क्लास एनकैप्सुलेशन का प्रशंसक हूं और कंटेनर (जैसे कार) को डेटाबेस कार्यों को नहीं करना पसंद करूंगा।

मैं भविष्य में डेटाबेस कैश जैसी चीजों को आसानी से छोड़ने की क्षमता भी चाहूंगा।

मैं अक्सर कंटेनर कक्षाओं का पैटर्न लेता हूं, एक एकल एकल वर्ग द्वारा निष्पादित सत्यापन और डेटाबेस एक्सेस के लिए पूरा करता है। यह कहा जा रहा है, यह अक्सर दोनों के बीच घुलमिल जाता है और काफी भ्रमित हो जाता है।

क्षमा करें यदि मेरा प्रश्न समझना कठिन है; मैं डेटाबेस के संदर्भ में बिल्कुल निश्चित नहीं हूं। जरूरत पड़ने पर स्पष्टीकरण मांगने के लिए स्वतंत्र महसूस करें।


क्या आपने डेटाबेस से कक्षाओं को लिंक करने के लिए ORM का उपयोग करने पर विचार किया, जैसे Wt :: Dbo ?
user52875

जवाबों:


11

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

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

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


जब तक c ++ में इंटरफेस के बारे में अंतिम बिट को छोड़कर सभी अच्छे नहीं हो जाते (जब तक कि OP को c ++ टैग करने का मतलब नहीं है)। मैं C ++ में रिपॉजिटरी पैटर्न के कार्यान्वयन को देखने के लिए बहुत उत्सुक हूं क्योंकि मैं इसे क्यूटी के साथ उपयोग करना चाहता हूं। मैं हैरान हूँ कि वहाँ कुछ भी प्रयोग करने योग्य ऑनलाइन नहीं है [
johnildergleidisson

6

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

आप एक सर्विस लेयर भी बना सकते हैं जो डेटा एक्सेस और बिजनेस लॉजिक को एक साथ मिलाने के बजाय अधिक एप्लिकेशन विशिष्ट विवरणों को परिभाषित करने के लिए वर्तमान डेटा स्टोरेज स्ट्रैटिजी का उपयोग करता है।


तो, क्या आप प्रत्येक प्रकार के लिए एक एक्सेस क्लास या सभी के लिए एक बड़ा वर्ग जोड़ेंगे?
Will03uk

व्यक्तिगत रूप से मैं प्रत्येक डेटा के लिए स्पष्ट कास्टिंग को अपनाने पर भी विचार करूंगा जो जंगली से मेरे सर्वर / एप्लिकेशन में आता है।
user827992

+1 मुझे इस पैटर्न का लुक पसंद है, लेकिन मुझे लगता है कि (मेरे प्रोजेक्ट के पैमाने पर), डेटाबेस के लिए प्रत्येक एल्गोरिथ्म को अलग से प्रबंधित करना कठिन होगा; हालाँकि मैं अन्य अनुप्रयोगों में इसका उपयोग अवश्य करूँगा। लैम्ब्डा को इसे अच्छी तरह से पूरक करना चाहिए।
Will03uk

1

यह डेटाबेस फैक्टरी पैटर्न का एक उदाहरण है;

using System.Reflection;
using System.Configuration;

public sealed class DatabaseFactory
{
    public static DatabaseFactorySectionHandler sectionHandler = (DatabaseFactorySectionHandler)ConfigurationManager.GetSection("DatabaseFactoryConfiguration");

    private DatabaseFactory() { }

    public static Database CreateDatabase()
    {
        // Verify a DatabaseFactoryConfiguration line exists in the web.config.
        if (sectionHandler.Name.Length == 0)
        {
            throw new Exception("Database name not defined in DatabaseFactoryConfiguration section of web.config.");
        }

        try
        {
            // Find the class
            Type database = Type.GetType(sectionHandler.Name);

            // Get it's constructor
            ConstructorInfo constructor = database.GetConstructor(new Type[] { });

            // Invoke it's constructor, which returns an instance.
            Database createdObject = (Database)constructor.Invoke(null);

            // Initialize the connection string property for the database.
            createdObject.connectionString = sectionHandler.ConnectionString;

            // Pass back the instance as a Database
            return createdObject;
        }
        catch (Exception excep)
        {
            throw new Exception("Error instantiating database " + sectionHandler.Name + ". " + excep.Message);
        }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.