1. মডেল এবং ফিল্ড বিস্তারিত

1.1. মডেল সংজ্ঞার পরিচিতি

ORM ফ্রেমওয়ার্কে, একটি মডেলের এবং ডাটাবেস টেবিলের মধ্যে একাধিকতা অনুরূপতা বর্ণিত করতে ব্যবহৃত হয়। মডেলটি তার বৈশিষ্ট্য এবং সম্পর্কগুলি এবং তাদের সাথে যুক্ত ডাটাবেস-বিশেষ কনফিগারেশন বর্ণনা করে। ent ফ্রেমওয়ার্কে, মডেলগুলি সাধারণত গ্রাফে একাধিকতা ধরে মান ধরে উল্লেখ করার জন্য ব্যবহার করা হয়, উদাহরণস্বরূপ User বা Group

মডেলের সংজ্ঞা সাধারণত বিশেষ্যগুলির (বা বৈশিষ্ট্যগুলির) এবং গোনাগুলির (বা সম্পর্কগুলির) বর্ণনা করে, এবং কিছু ডাটাবেস-বিশেষ অপশন। এই বর্ণনা সাহায্য করতে পারে মানের কাঠামো, বৈশিষ্ট্যের এবং গোনার সম্পর্ক, এবং মডেলের উপর ভিত্তি করে সেই সাথে সাম্প্রতিক ডাটাবেস টেবিলের কাঠামো তৈরি করার জন্য ব্যবহার করা যেতে পারে।

1.2. ফিল্ড বিস্তারিত

ফিল্ডগুলি মডেলের এটা অংশ যা একাধিকতার বৈশিষ্ট্য প্রতিনিধিত্ব করে। এগুলি বৈশিষ্ট্যের বর্ণনা করে, উদাহরণস্বরূপ নাম, বয়স, তারিখ, ইত্যাদি। এেন্ট ফ্রেমওয়ার্কে, ফিল্ড ধরণগুলির মধ্যে বিভিন্ন মৌলিক ডেটা টাইপ যেমন integer, string, boolean, time ইত্যাদি রয়েছে, এবং কিছু SQL-বিশেষ tímus[[[]]র জন্যঃ UUID, []byte, JSON ইত্যাদি।

নীচের টেবিলে en੿t فرেতnারkoতীতা বলা হয়েছে

টাইপ বর্ণনা
int পূর্ণসংখ্যা ধরণ
uint8 অপসারিত 8-বিট পূর্ণসংখ্যা টাইপ
float64 ফ্লোটিং পয়েন্ট টাইপ
bool বুলিয়ান টাইপ
string স্ট্রিং টাইপ
time.Time সময় টাইপ
UUID UUID টাইপ
[]byte বাইট অ্যারে টাইপ (SQL মাত্র)
JSON JSON টাইপ (SQL মাত্র)
Enum Enum টাইপ (SQL মাত্র)
অন্যান্য অন্যান্য ধরণগুলি (উ।ঃ Postgres Range)

2. ফিল্ড বৈশিষ্ট্য বিস্তারিত

2.1. ডেটা টাইপ

একটি অবজেক্টের বা ফিল্ডের ডেটা-টাইপ মডেলের সংজ্ঞাতে যেমন অংশগুলি ধরে থাকে, তার মধ্যে যেরকম ডেটা সংরক্ষণ করা যাবে নির্ধারণ করে। এটি এটার ent ফ্রেমওorkর্কের মডেল সংজ্ঞাতে একটি গুরুত্বপূর্ণ অংশ। নীচে ent ফ্রেমও‌য়ার্কে অনেকগুলি ব্যবহৃত ডাটা টাইপের কিছু উদাহরণ দে৷

import (
    "time"

    "entgo.io/ent"
    "entgo.io/ent/schema/field"
)

// User schema.
type User struct {
    ent.Schema
}

// Fields of the User.
func (User) Fields() []ent.Field {
    return []ent.Field{
        field.Int("age"),             // পূর্ণসংখ্যা টাইপ
        field.String("name"),         // স্ট্রিং টাইপ
        field.Bool("active"),         // বুলিয়ান টাইপ
        field.Float("score"),         // ফ্লোটিং পয়েন্ট টাইপ
        field.Time("created_at"),     // টাইমস্ট্যাম্প টাইপ
    }
}
  • int: পূর্ণসংখ্যা মান নিয়ে কাজ করে, যা int8, int16, int32, int64 ইত্যাদি হতে পারে।
  • string: স্ট্রিং ডেটা নিয়ে কাজ করে।
  • bool: সাধারণত পতাকা হিসাবে ব্যবহৃত হয়৷
  • float64: ফ্লোটিং পয়েন্ট নাম্বারগুল৷
  • time.Time: সময়, সাধারণত সময়চিহ্ন বা তারিখের ডাটার জন্য ব্যবহৃত হয়৷

এই ফিল্ড ধরণগুলি মূলত ডেটা‌বেসের নিম্নলিখিতগুলির মধ্যে ম্যাপ করা হবেॷ অনুশীলন ডাটাবেসের সুতরাং ent এবং UUID এবং সাপেক্ষ ডাটাবেস ধরণের []byte (SQL মাত্র) এবং অন্যান্ সহ প্রাসঙ্গিক ডাটাবেস ধরণের জন্য Enums ইত্যাদি সমর্থন করে।

2.2. ডিফল্ট মানগুলি

ফিল্ড ডিফল্ট মানের সাথে কনফিগার করা যেতে পারে। যদি ইচ্ছা করা হয় নতুন এবং মান নির্ধারণ করা না হয় তাহলে ডিফল্ট মানটি ব্যবহৃত হবে। ডিফল্ট মান স্থির একটি মান বা একটি কার্যকরীতা থেকে পক্ষসিদ্ধ মান হতে পারে। একটি স্থির মূল্য নির্ধারণ করতে .Default মেথড ব্যবহার করুন, অথবা একটি গতিপ্রদানকে স্থিতিশীল ডিফল্ট মান হিসেবে নির্ধারণ করতে .DefaultFunc ব্যবহার করুন।

// User স্কিমা।
func (User) Fields() []ent.Field {
    return []ent.Field{
        field.Time("created_at").
            Default(time.Now),  // time.Now এর একটি স্থির ডিফল্ট মান
        field.String("role").
            Default("user"),   // একটি স্থির স্ট্রিং মান
        field.Float("score").
            DefaultFunc(func() float64 {
                return 10.0  // ফাংশন দ্বারা তৈরি একটি মানগুলি জেনারেট করা ডিফল্ট মান
            }),
    }
}

2.3. ফিল্ড ঐচ্ছিকতা এবং শূন্য মান

ডিফল্ট ভাবে, ফিল্ডগুলি প্রয়োজনীয়। একটি ঐচ্ছিক ফিল্ড ঘোষণা করতে, .Optional() মেথডটি ব্যবহার করুন। ডেটাবেসে ঐচ্ছিক ফিল্ডগুলি সাধারণভাবে নালাবল ফিল্ড হিসেবে ঘোষণা করা হবে। Nillable অপশন ক্ষেত্র কে সোজা মান এবং অসেট অবস্থা দিয়ে নিলে সেট করায় বিভিন্ন করা হতে দেয়।

// ব্যবহারকারী স্কিমা।
func (User) Fields() []ent.Field {
    return []ent.Field{
        field.String("nickname").Optional(), // ঐচ্ছিক ফিল্ড প্রয়োজন নেই
        field.Int("age").Optional().Nillable(), // Nillable ফিল্ড কে নিল না থাকায় সেট করা যায়
    }
}

উপরোক্ত ডিফাইনড মডেল ব্যবহার করার সময়, age ফিল্ডটি অপরিষ্কৃত অবস্থা নির্দিষ্ট করার জন্য সে পারে না-নিল মান গ্রহণ করে।

2.4. ফিল্ড অননুযায়িতা

একক ফিল্ডগুলি দেখে নেয়া আছে বাস্তব তালিকায় ডুপ্লিকেট মান নেই তা নিশ্চিত করবে। একটি অননুযায়ী ক্ষেত্র সংজ্ঞা করার জন্য Unique() মেথডটি ব্যবহার করুন। ব্যাবসাত্যবিধি ভাবে ডাটা সংগঠন স্বাভাবিক প্রয়োজনগুলির মধ্যে তেমন ব্যবহৃত হতে পারে, যেমন ব্যবহারকারীর ইমেল বা ইউজারনেম এর জন্য অদ্ভুত ক্ষেত্রগুলি ব্যবহার করা উচিত।

// ব্যবহারকারী স্কিমা।
func (User) Fields() []ent.Field {
    return []ent.Field{
        field.String("email").Unique(),  // ডুপ্লিকেট ইমেল ঠিক রাখার জন্য অননুযায়ী ক্ষেত্র
    }
}

এটি ডুপ্লিকেট মান ঢুকানো বাড়ানোর জন্য অন্তর্নিহিত ডাটাবেসে একটি অননুযায়ী বাধ্যতার প্রতিরোধ তৈরি করবে।

2.5. ফিল্ড ইনডেক্স করা

ফিল্ড ইনডেক্স ব্যবহার করা হয় ডেটাবেস কুয়েরির কার্যক্ষমতা সুধারতে, সাধারণভাবে বড় ডাটাবেসে সর্বনিম্ন পাতা কষ্ট pandra. ent ফ্রেমওয়ার্কে, .Indexes() মেথড ইনডেক্স তৈরি করার জন্য ব্যবহার করা যায়।

import "entgo.io/ent/schema/index"

// ব্যবহারকারী স্কিমা।
func (User) Indexes() []ent.Index {
    return []ent.Index{
        index.Fields("email"),  // 'email' ফিল্ড টি একটি ইনডেক্স তৈরি করুন
        index.Fields("name", "age").Unique(), // একটি অননুয়াী কোম্পোজিট ইনডেক্স তৈরি করুন
    }
}

ইনডেক্স প্রায়ই অবদান যান প্রতি সার্চ ফিল্ডরোগুলির জন্য, তবে গমতহন করার অংশগুলি কম বিষয় হয়ে যায়। সেকারণে, নিশ্চিত স্থিতিতে ভিত্তি করে ইনডেক্স তৈরি করার সিদ্ধান্ত নিতে হবে।

2.6. কাস্টম ট্যাগ

ent ফ্রেমওয়ার্কে, আপনি জেনারেটেড এন্টিটি স্ট্রাক্ট ফিল্ডে কাস্টম ট্যাগ যোগ করতে StructTag মেথড ব্যবহার করতে পারেন। এই ট্যাগগুলি খুব দরকারী JSON ইনকোডিং এবং XML ইনকোডিং লাগলে অপারেশন বাস্তবায়ন করার জন্য। নীচের উদাহরণে, আমরা এই নাম ফিল্ডের জন্য কাস্টম JSON এবং XML ট্যাগ যুক্ত করব।

// ব্যবহারকারী এর ফিল্ড।
func (User) Fields() []ent.Field {
    return []ent.Field{
        field.String("name").
            // StructTag মেথড ব্যবহার করে কাস্টম ট্যাগ যুক্ত করুন
            // এখানে, নাম ফিল্ডটির জন্য JSON ট্যাগকে 'উজমানে' ও যদি ক্ষেত্রটি খালি থাকে তাহলে হতে চলে সেট করুন
            // সাথে সাথে, এক্ষেত্রে ভর্মরপ্তির আকার বজায় দেয়া আছে 'নাম'
            StructTag(`json:"ইউজারনাম,উঞ্জ্জমিপ্তি" xml:"নাম"`),
    }
}

JSON বা XML ইনকোডিং করার সময়, omitempty অপশন বোঝায় যে, যদি নাম ফিল্ড খালি থাকে, তবে এই ফিল্ডটি ইনকোডিং মূল্যায়ন থেকে বাদ দেওয়া হবে। এটা আপিত যোগ সারে হস্প তৈরি করার জন্য ব্যাপার বহন করা নয়। JSON ট্যাগ ব্যবহার করে json কী ব্যবহার করে, XML ট্যাগ ব্যবহার করে এক্সেমল কী ব্যবহার করে, এবং এগুলি স্পেস দ্বারা পৃথক করা। ভেবের লাইব্রেরি ফাংশনগুলির সাথে,encoding/json এবং encoding/xml এর মতো পরিস্থিতি ডিকোড বা ইনকোডিং জন্য ব্যবহার করা হবে।

3. ফিল্ড বৈধতা এবং বাধাবহুলাকর করা

ফিল্ড বৈধতা ডাটাবেস নকশা গুরুত্বপূর্ণ দিক যে, ডাটা সাবলাম্যতা ও বৈধতা নিশ্চিত করার জন্য। এই বিভাগে, আমরা অংতর্নিহিত সমর্থক, কাস্টম সমর্থক, এবং বিভিন্ন বাধাবহুলাকর ব্যবস্থা ব্যবহার করার জন্য প্রবেশ করব।

3.1. অংকের মান্যতা যাচাইকারক

ফ্রেমওয়ার্কটি বিভিন্ন ধরণের ক্ষেত্রে সাধারণ ডেটা মান্যতা পরীক্ষা করার জন্য একাধিক নির্মিত ভেলিডেটর সরবরাহ করে। এই নির্মিত ভেলিডেটর ব্যবহার করা ডেভেলপমেন্ট প্রসেস সহজ করে তুলে এবং ক্ষেত্রের জন্য মান্য ডেটা ব্যাপন করা সহজ করে।

এখানে কিছু উদাহরণ নির্মিত ফিল্ড ভেলিডেটর দেখানো হল:

  • অংকের জন্য ভেলিডেটর:
    • Positive(): ফিল্ডের মান যাচাই করে যে তা ধনাত্মক সংখ্যা হল।
    • Negative(): ফিল্ডের মান যাচাই করে যে তা নেতিবাচক সংখ্যা হল।
    • NonNegative(): ফিল্ডের মান যাচাই করে যে তা অননেতিবাচক সংখ্যা হল।
    • Min(i): ফিল্ডের মান যাচাই করে যে তা নির্ধারিত সর্বনিম্ন মান i এর চেয়ে বড় হল।
    • Max(i): ফিল্ডের মান যাচাই করে যে তা নির্ধারিত সর্বাধিক মান i এর চেয়ে কম হল।
  • string টাইপের জন্য ভেলিডেটর:
    • MinLen(i): স্ট্রিংয়ের সর্বনিম্ন দৈর্ঘ্য যাচাই করে।
    • MaxLen(i): স্ট্রিংয়ের সর্বাধিক দৈর্ঘ্য যাচাই করে।
    • Match(regexp.Regexp): যাচাই করে যে স্ট্রিংটি নির্ধারিত নিয়মিত অভিবিধানের সাথে মেলে।
    • NotEmpty: যাচাই করে যে স্ট্রিংটি খালি নয়।

একটি বাস্তব কোড উদাহরণ দেখা যাক। এই উদাহরণে, একটি User মডেল তৈরি করা হয়েছে, যা অধিকতম সাম্জন্য পূর্ণসংখ্যা টাইপের age ফিল্ড এবং একটি নির্ধারিত ফরম্যাটের email ফিল্ড সহিত:

func (User) Fields() []ent.Field {
    return []ent.Field{
        field.Int("age").
            Positive(),
        field.String("email").
            Match(regexp.MustCompile(`^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$`)),
    }
}

3.2. কাস্টম ভেলিডেটর

নির্মিত ভেলিডেটরগুলি অনেক সাধারণ যাচাইকারী প্রয়োজনীয়তা প্রণালী করতে পারে, কিন্তু কিছু সময় আপনার সাধারণ ভ্যালিডেশন লজিকের জন্য আপনার নিজস্ব যাচাইয়ার প্রয়োজন হতে পারে। এই ধরণের ক্ষেত্রে, আপনি বিশেষ ব্যবসা নিযামক সাধারণত মিটায় আনতে কাস্টম ভেলিডেটরগুলি লেখতে পারেন।

একটি কাস্টম ভেলিডেটর হল একটি ফাংশন যা একটি ফিল্ডের মান গ্রহণ করে এবং একটি error রিটার্ন করে। যদি প্রত্যাবর্তন ক্ষেত্রে error ফাঁকা না হয়, তাহলে এটি যাচাই ব্যর্থতা নির্দেশ করে। কাস্টম ভেলিডেটরের সাধারণ ফরম্যাট নিম্নলিখিত হল:

func (User) Fields() []ent.Field {
    return []ent.Field{
        field.String("phone").
            Validate(func(s string) error {
                // যাচাই করুন যে ফোন নম্বর প্রত্যাশিত ফরম্যাট পূরণ করে
                matched, _ := regexp.MatchString(`^\+?[1-9]\d{1,14}$`, s)
                if !matched {
                    return errors.New("ভুল ফোন নম্বর ফরম্যাট")
                }
                return nil
            }),
    }
}

উপরে দেখানো হয়েছে, আমরা একটি ফোন নম্বরের আকারের জন্য একটি কাস্টম ভেলিডেটর তৈরি করেছি।

3.3. বাধাগুলি

বাধা হল নির্দিষ্ট নিয়মগুলি বাড়িয়ে তথ্যের উপর নির্দিষ্ট নিয়মগুলি অগ্রাহ্য করার নিয়ম। এটি অবৈধ তথ্যের ইনপুট প্রতিরোধ করা বা তথ্যের সম্পর্কের স্পষ্টতা নির্ধারণ করার জন্য ব্যবহৃত হতে পারে।

সাধারণ ডাটাবেজ বাধাগুলিতে অন্তর্ভুক্ত হয়:

  • প্রাথমিক কী বাধা: নিশ্চিত করে যে প্রতিটি রেকর্ড টেবিলে অদ্ভুত থাকে।
  • অনন্দেয় বাধা: নিশ্চিত করে যে টেবিলে একটি কলাম বা কলামের একটি কম্বিনেশন অনন্দেয় থাকে।
  • পারদর্শি কী বাধা: টেবিল মধ্যে সঠিকভাবে দৃশ্য করা একটি অন্য টেবিলের সাথে এডজ সম্পর্ক সৃষ্টি করে রেখে।
  • চেক বাধা: নিশ্চিত করে যে একটি ফিল্ডের মান নির্দিষ্ট শর্ত পূরণ করে।

এন্টিটি মডেলে, আপনি ডেটা সংগতি বজায় রেখের জন্য বাধা পরিভাষা করতে পারেন নিম্নলিখিত প্রকারে:

func (User) Fields() []ent.Field {
    return []ent.Field{
        field.String("username").
            Unique(), // ইউনিক বাধা যাচাই করার জন্য অনন্য বাধার মধ্যে নন।
        field.String("email").
            Unique(), // ইউনিক বাধা যাচাই করার জন্য অনন্য বাধার মধ্যে নন।
    }
}

func (User) Edges() []ent.Edge {
    return []ent.Edge{
        edge.To("friends", User.Type).
            Unique(), // পারদর্শী কী বাধা, একটি অনন্য ব্যবহারকারীর সাথে একটি অনন্য ইজ সম্পর্ক সৃষ্টি করে।
    }
}

সারাংশঃ ফিল্ড ভ্যালিডেশন এবং বাধাগুলি ভাল ডেটা গুণগতি ও অপ্রত্যাশিত ডেটা ভুল থেকে বাঁচার জন্য অত্যন্ত গুরুত্বপূর্ণ। ent ফ্রেমওয়ার্ক দ্বারা সরবরাহকৃত সরঞ্জাম ব্যবহার করে এই প্রসেস সহজ করা এবং বিশ্বস্ত করা সম্ভব।