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-এ FULLTEXT ক্যাটাগরিতে একটি পূর্ণ-টেক্সট ইনডেক্স তৈরি করুন
    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 {
    // "nickname" ফিল্ড উপর অসম্পূর্ণ ইনডেক্স তৈরি করুন, যা "active" সত্য হলে মাত্র রো থাকবে
    return []ent.Index{
        index.Fields("nickname").
            Annotations(
                entsql.IndexWhere("active"),
            ),
    }
}

ইনডেক্স প্রিফিক্স বিশেষত ভাবে টেক্সট ফিল্ডগুলির জন্য দারুণভাবে ব্যবহার করা যায়, বিশেষতঃ MySQL-এ। এটি ইনডেক্স সৃষ্টির সময় সংক্ষেপণা করতে পারে, ইনডেক্স দ্বারা দখল স্থান হ্রাস করতে পারে, এবং সুতরাং ভাল পারফরম্যান্স সরবরাহ করতে পারে। নিচে দেখানো হয়, MySQL-এ আপনি প্রিফিক্স সহ ইনডেক্স সংজ্ঞায়িত করতে পারেন:

func (User) Indexes() []ent.Index {
    // প্রিফিক্স ব্যবহার করে ইন্ডেক্স সংজ্ঞায়িত করুন
    return []ent.Index{
        index.Fields("description").
            Annotations(entsql.Prefix(128)),
    }
}

5.3: ইনডেক্স এনোটেশন এবং কাস্টমাইজেশন

এন্টে, এনোটেশন হল একটি ফিচার যা ডেভেলপারদের ইনডেক্স কাস্টমাইজ করার অনুমতি দেয়। আপনি ইনডেক্সের ধরন সংজ্ঞায়িত করতে পারেন, বাছাই নির্দেশ সংজ্ঞায়িত করতে পারেন, এবং অন্যান্য কাস্টমাইজেশন করতে পারেন।

উদাহরণস্বরূপ, নীচের কোডটি কীভাবে একটি ইনডেক্সে কলাম প্রবন্ধন নিয়ে পুরস্কৃত করা শিখিয়ে দেয়:

func (User) Indexes() []ent.Index {
    return []ent.Index{
        // অ্যানোটেশন ব্যবহার করে ইনডেক্সের কলাম প্রবন্ধন নিয়ে স্থানান্তর নির্দিষ্ট করুন
        index.Fields("c1", "c2", "c3").
            Annotations(entsql.DescColumns("c1", "c2")),
    }
}

এনোটেশন ফিচার দ্বারা, ডেভেলপাররা ডেটাবেস পারফরম্যান্স এবং স্ট্রাকচার অপটিমাইজ করার জন্য ইনডেক্স কাস্টমাইজেশন করার জন্য সচয়তাপূর্ণভাবে কাস্টমাইজ করতে পারে।