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 یونیک انڈیکس کی تعریف
ایک یونیک انڈیکس انڈیکس کالمز پر ڈیٹا کی یکتاؤ کو یقینی بناتا ہے۔ یہ فیلڈ میں یونیک
میتھڈ شامل کر کے بنایا جا سکتا ہے۔ نیچے دی گئی مثالات واحد اور متعدد فیلڈز کے لئے یونیک انڈیکس بنانے کا اظہار کرتی ہیں۔
ایک فرد فیلڈز کے لئے یونیک انڈیکس بنانا:
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 میں Street اینٹٹی کی سکیما کی تعریف ہوتی ہے۔
type Street struct {
ent.Schema
}
func (Street) Fields() []ent.Field {
// فیلڈز کی تعریف
return []ent.Field{
field.String("name"),
}
}
func (Street) Edges() []ent.Edge {
// City کے ساتھ تعلق کی تعریف، جہاں Street City کا حصہ ہوتی ہے۔
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 اور پوسٹگریس ڈیٹا بیس پورٹیکسٹ انڈیکس کو سپورٹ کرتے ہیں۔ مثلاً، MySQL میں آپ ایسے ایک پورٹیکسٹ انڈیکس تعریف کرسکتے ہیں:
// فائل ent/schema/user.go میں User اینٹٹی کی سکیما کی تعریف ہوتی ہے۔
func (User) Indexes() []ent.Index {
// MySQL میں FULLTEXT زمرے کا استعمال کرتے ہوئے پورٹیکسٹ انڈیکس بنائیں
return []ent.Index{
index.Fields("description").
Annotations(entsql.IndexTypes(map[string]string{
dialect.MySQL: "FULLTEXT",
})),
}
}
ہیش انڈیکس واقعیت میں برابری کی کوئیریز کے لیے خاصان موزوں ہوتا ہے اور سارٹنگ اور رینج کی کوئیریز کو سپورٹ نہیں کرتا ہے۔ پوسٹگریس میں، آپ ایک ہیش انڈیکس اس طرح سے استعمال کرسکتے ہیں:
func (User) Indexes() []ent.Index {
// HASH قسم کا ایک انڈیکس کی تعریف کریں
return []ent.Index{
index.Fields("c4").
Annotations(entsql.IndexType("HASH")),
}
}
5.2 پارشل انڈیکس اور انڈیکس پریفکس
پارشل انڈیکس وہ ایک قسم کا انڈیکس ہے جو صرف اس جدول میں روزانہ وہ صفیں انڈیکس کرتا ہے جو مخصوص شرائط پورا کرتی ہیں۔ SQLite اور پوسٹگریس میں، آپ WHERE
کلوز استعمال کرکے پارشل انڈیکس تعریف کرسکتے ہیں۔
مثال کے طور پر، پوسٹگریس میں پارشل انڈیکس کی تعریف:
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 انڈیکس انوٹیشنز اور ترتیب
ent میں، Annotations
ایک خصوصیت ہے جو ڈویلپرز کو انڈیکسز کو کسٹمائز کرنے کی اجازت دیتی ہے۔ آپ انڈیکس کی قسم کو تعین کر سکتے ہیں، سارٹنگ کے اصول متعین کرسکتے ہیں، اور مزید بہتری فراہم کرسکتے ہیں۔
مثال کے طور پر، مندرجہ ذیل کوڈ میں دکھایا گیا ہے کہ انڈیکس میں کالم سارٹنگ کے اصول کو کیسے مقرر کیا جاتا ہے:
func (User) Indexes() []ent.Index {
return []ent.Index{
// Annotations کا استعمال کرکے انڈیکس کے کالم سارٹنگ کے اصول مقرر کریں
index.Fields("c1", "c2", "c3").
Annotations(entsql.DescColumns("c1", "c2")),
}
}
انوٹیشنز کی خصوصیت کے ساتھ، ڈویلپرز انڈیکسز کو ڈیٹا بیس کی بہتری اور ساخت کے لیے مرتب کرنے کا مواد فراہم کر سکتے ہیں۔