1. सूचक मानवता और अनुप्रयोग

1.1 सूचक क्या है

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

1.2 सूचकों के प्रकार

सूचकों के विभिन्न प्रकार होते हैं, प्रत्येक का अपना डिज़ाइन और विभिन्न अनुप्रयोग परिदृश्यों के लिए सुधार होता है:

  • एकलफ़ील्ड सूची: जो केवल एक फील्ड को शामिल करती है, जो शीघ्र प्रश्नों के लिए एक ही स्थिति पर निर्भर होने वाले परिदृश्यों के लिए उपयुक्त होती है।
  • संयुक्त सूची: जो विभिन्न फील्ड्स को शामिल करती है, जो उन परिदृश्यों के लिए अनुकूलन प्रदान करती है जिनमें ये फील्ड्स शामिल होते हैं।
  • अद्वितीय सूची: सूचक क्षेत्रों की अद्वितीयता को सुनिश्चित करती है, प्रतिलिपि मूल्यों की अस्तित्व को मना करती है। अद्वितीय सूचियां एकल-क्षेत्रीय या संयुक्त हो सकती हैं।

2. सूचक परिभाषा

2.1 फ़ील्ड सूची परिभाषा

एक एकल फ़ील्ड सूचक बनाने का मतलब होता है किसी डेटा तालिका के विशिष्ट स्तंभ पर एक सूचक स्थापित करना, जो Fields विधि का उपयोग करके प्राप्त किया जा सकता है। निम्नलिखित उदाहरण से दिखाया गया है कि User एंटिटी के phone फ़ील्ड पर सूचक कैसे बनाया जा सकता है।

func (User) Fields() []ent.Field {
    return []ent.Field{
        field.String("phone"),
    }
}
func (User) Indexes() []ent.Index {
    // एक एकल-फ़ील्ड सूचक बनाएं।
    return []ent.Index{
        index.Fields("phone"),
    }
}

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

2.2 अद्वितीय सूचक परिभाषा

एक अद्वितीय सूचक विन्यास द्वारा सूचक क्षेत्रों पर डेटा की अद्वितीयता सुनिश्चित करती है। इसे फ़ील्ड में Unique विधि जोड़कर बनाया जा सकता है। निम्नलिखित उदाहरण से व्याक्त की जा रही है कि एकल और एकाधिक फ़ील्डों के लिए अद्वितीय सूचक कैसे बनाया जा सकता है।

एकल फ़ील्ड के लिए अद्वितीय सूचक बनाना:

func (User) Fields() []ent.Field {
    return []ent.Field{
        field.String("email").Unique(),
    }
}

इस उदाहरण में, email फ़ील्ड को अद्वितीय बताया गया है, जिसके लिए सुनिश्चित किया जाता है कि प्रत्येक उपयोक्ता का email डेटाबेस में अद्वितीय है।

एकाधिक फ़ील्डों के लिए अद्वितीय सूचक बनाना:

func (User) Indexes() []ent.Index {
    return []ent.Index{
        // एकल फील्डस के लिए अद्वितीय सूचक बनाएं।
        index.Fields("first_name", "last_name").Unique(),
    }
}

इस कोड में, 'first_name' और 'last_name' फ़ील्ड की संयुक्त अद्वितीय सूचक का परिभाषित है, जो दोनों फ़ील्ड में समान मानों के रिकॉर्ड के उपस्थिति को रोकता है।

2.3 संयुक्त सूचक की परिभाषा

जब प्रश्न के शर्तों में कई फ़ील्ड शामिल होते हैं, तो संयुक्त सूचक प्रभाव में आ सकता है। संयुक्त सूचक निर्धारित सूचि में डेटा रखता है। सूचक के क्रम का निर्धारण प्रश्न कर्मक्षमता पर प्रभाव डालता है, तो संयुक्त सूचक का परिभाषण करते समय, सूची के क्रम को प्रश्न पैटर्न के आधार पर निर्धारित करना होता है।

यहां एक संयुक्त सूचक का उदाहरण है:

func (User) Indexes() []ent.Index {
    return []ent.Index{
        // विभिन्न फ़ील्ड्स के लिए संयुक्त सूचक बनाएं।
        index.Fields("country", "city"),
    }
}

इस उदाहरण में, country और city फ़ील्ड पर संयुक्त सूचक बनाया गया है। इसका मतलब है कि जब इन दोनों फ़ील्ड्स से संबंधित पूछताछ कार्य की जाती है, तो डेटाबेस त्वरित रूप से उन शर्तों को पूरा करने वाले डेटा को ढूंढ सकता है।

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

3. एज इंडेक्स

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

// फ़ाइल ent/schema/street.go सड़क एकाइ के स्कीमा को परिभाषित करती है।
type Street struct {
    ent.Schema
}

func (Street) Fields() []ent.Field {
    // फ़ील्ड को परिभाषित करें
    return []ent.Field{
        field.String("name"),
    }
}

func (Street) Edges() []ent.Edge {
    // शहर के साथ एज रिश्ते को परिभाषित करें, जहाँ सड़क एक शहर के लिए होती है।
    return []ent.Edge{
        edge.From("city", City.Type).
            Ref("streets").
            Unique(),
    }
}

func (Street) Indexes() []ent.Index {
    // समर्थन से समर्थन प्राप्त करने के लिए एक अद्वितीय इंडेक्स बनाएं, साथी शहर के भीतर सड़क के नाम की अद्वितीयता सुनिश्चित करने के लिए।
    return []ent.Index{
        index.Fields("name").
            Edges("city").
            Unique(),
    }
}

इस उदाहरण में, हम एक Street एन्टिटी बनाते हैं और इसे City एन्टिटी से जोड़ते हैं। Street एन्टिटी के Indexes विधि में एक एज इंडेक्स परिभाषित करके, हम सुनिश्चित करते हैं कि हर शहर के तहत प्रत्येक सड़क का नाम अद्वितीय है।

अध्याय 5: प्रगतिशील इंडेक्स विकल्प

5.1 पूर्ण-पाठ और हैश इंडेक्स

पूर्ण-पाठ इंडेक्स और हैश इंडेक्स MySQL और PostgreSQL में दो अद्वितीय इंडेक्स प्रकार हैं, और वे विभिन्न क्वेरी अनुकूलन स्थितियों के लिए प्रयोग किए जाते हैं।

पूर्ण-पाठ इंडेक्स आमतौर पर पाठिक डेटा के लिए प्रयोग किया जाता है, खासकर जब आपको विभिन्न खोज करने की आवश्यकता होती है, जैसे शब्द मिलान समीक्षा। MySQL और PostgreSQL डेटाबेस दोनों पूर्ण-पाठ इंडेक्सिंग का समर्थन करते हैं। उदाहरण के लिए, MySQL में आप एक पूर्ण-पाठ इंडेक्स इस प्रकार परिभाषित कर सकते हैं:

// फ़ाइल ent/schema/user.go उपयोगकर्ता एन्टिटी का स्कीमा परिभाषित करता है
func (User) Indexes() []ent.Index {
    // MySQL में पूर्ण-पाठ श्रेणी का उपयोग करके एक पूर्ण-पाठ इंडेक्स बनाएँ
    return []ent.Index{
        index.Fields("description").
            Annotations(entsql.IndexTypes(map[string]string{
                dialect.MySQL: "FULLTEXT",
            })),
    }
}

हैश इंडेक्स विशेष रूप से समानता क्वेरी के लिए उपयुक्त है और सॉर्टिंग और सीमा क्वेरी का समर्थन नहीं करता है। PostgreSQL में, आप एक हैश इंडेक्स इस प्रकार परिभाषित कर सकते हैं:

func (User) Indexes() []ent.Index {
    // HASH प्रकार का एक इंडेक्स परिभाषित करें
    return []ent.Index{
        index.Fields("c4").
            Annotations(entsql.IndexType("HASH")),
    }
}

5.2 आंशिक इंडेक्स और इंडेक्स प्रीफ़िक्स

आंशिक इंडेक्स एक प्रकार का इंडेक्स है जो केवल उन पंक्तियों को इंडेक्स करता है जो विशिष्ट शर्तों को संतुष्ट करते हैं। SQLite और PostgreSQL में, आप WHERE क्लॉज का उपयोग करके आंशिक इंडेक्स बना सकते हैं।

उदाहरण के लिए, PostgreSQL में एक आंशिक इंडेक्स की परिभाषा करना:

func (User) Indexes() []ent.Index {
    // "नामक" क्षेत्र पर एक आंशिक इंडेक्स बनाएं, जिसमें केवल "सक्रिय" सत्य होने की पंक्तियों को शामिल किया जाता है
    return []ent.Index{
        index.Fields("nickname").
            Annotations(
                entsql.IndexWhere("active"),
            ),
    }
}

इंडेक्स प्रीफ़िक्स पाठ फ़ील्ड के लिए विशेष रूप से उपयुक्त है, खासकर MySQL में। इससे इंडेक्स निर्माण समय को कम किया जा सकता है, इंडेक्स द्वारा द occupy किए गए स्थान को कम किया जा सकता है, और अच्छे प्रदर्शन भी प्रदान किया जा सकता है। निम्नलिखित अपवाद के साथ, MySQL के लिए, आप एक प्रीफ़िक्स के साथ एक इंडेक्स परिभाषित कर सकते हैं:

func (User) Indexes() []ent.Index {
    //  प्रीफ़िक्स का उपयोग करके एक इंडेक्स बनाएं
    return []ent.Index{
        index.Fields("description").
            Annotations(entsql.Prefix(128)),
    }
}

5.3 इंडेक्स एनोटेशन और कस्टमाइज़ेशन

ent में, Annotations एक सुविधा है जो डेवलपर्स को इंडेक्स को कस्टमाइज़ करने की अनुमति देती है। आप इंडेक्स प्रकार की परिभाषा कर सकते हैं, सॉर्टिंग नियम सेट कर सकते हैं, और अधिक।

उदाहरण के लिए, निम्नलिखित कोड द्वारा इंडेक्स में स्तंभ के सॉर्टिंग नियमों को निर्दिष्ट करने का तरीका दर्शाता है:

func (User) Indexes() []ent.Index {
    return []ent.Index{
        // इंडेक्स की स्तंभ सॉर्टिंग विन्यासों को निर्दिष्ट करने के लिए एनोटेशन्स का उपयोग करें
        index.Fields("c1", "c2", "c3").
            Annotations(entsql.DescColumns("c1", "c2")),
    }
}

एनोटेशन सुविधा के साथ, डेवलपर्स डेटाबेस प्रदर्शन और संरचना को बेहतर बनाने के लिए इंडेक्स को लचीला तरीके से कस्टमाइज़ कर सकते हैं।