🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ پویا پارسایی
مفهوم index و constrained چیست؟
جامعه لاراول ایجاد شده در ۰۷ تیر ۱۴۰۱

سلام و عرض ادب

چند تا سوال داشتم:

۱- وقتی توی دیتابیس فلان ستون رو index میکنیم، این index چه کاری انجام میده؟ منظور از index گذاری چیه؟

۲- یک نکته ای که تا الان چند بار شنیدم اینه که index گذاری زیادیش خوب نیست، دلیلش چیه؟

۳- چه جاهایی رو باید index گذاری کنیم توی دیتابیس؟

۴- وقتی توی migration میایم یک ستونی رو constrained میکنیم، این چه کاری انجام میده؟ فرقش با حالتی که نمیذاریم چیه؟

۵- فرض کنید که توی همین پروژه میخوایم اگر badgeی رو حذف کردیم که یک user قبلا اون رو بدست اورده و به عبارتی توی جدول badge_user از این badge رکورد وجود داره، توی لیست badgeهای یوزر پاک نشه و یوز بتونه badge رو ببینه. اگر بیایم migrationمون رو به این حالت تعریف کنیم:

Schema::create('badge_user', function (Blueprint $table) {
    $table->foreignId('badge_id');
    $table->foreignId('user_id')->constrained()->cascadeOnDelete();
});

خب وقتی badge رو حذف کردیم، دیگه توی جدول badge_user حذف نمیشه، ولی توی جدول badges حذف میشه. تو این حالت باید چطوری badge رو به user نمایش بدیم؟ آیا تو این حالت استفاده از soft delete کار درستیه؟

1- ببینید index کردن یک راهی هستش برای سریع‌تر پیدا کردن یک رکورد ... زمانی که شما ایندکس میکنید یک فیلد رو یک data structrue ایجاد میشه که مقدار اون فیلد رو داخل اون DS نگه میداره تا زمانی که شما بهش نیاز داشتید و خواستید سرچ کنید خیلی بهتر بتونه نتایج رو به شما برگردونه. این لینک رو بخونید حتما.

https://en.wikipedia.org/wiki/Database_index

2- به خاطر اینکه یک دیتا استراکچر دیگه ایجاد میکنه طبیعتا زیاد ایندکس کردن باعث میشه که حجم دیتابیس و همچنین سرعت اون هم بیاد پایین.

3 - جاهایی که میخواید سرچ کنید داخلش ..

4- constrains برای مدیریت بهتر دیتابیس هستش ... مثلا شما یک جدول دارید که با جدول دیگه رابطه داره .. به عنوان مثلا author و post .. داخل post شما آی دی author رو نگه میدارید .. زمانی که author رو پاک کنید چه اتفاقی میوفته؟‌ طبیعتا زمانی که میخواد post رو نمایش بده میره اون auhtor رو پیدا کنه تا مشخصات اون رو نمایش بده ولی چون پاک شده پس برنامه شما به ارور میخوره .. این موضوع به این خاطر هستش که شما محدودیت ایجاد نکردید که مثلا اگر author پاک شد Post‌های اون نیز پاک بشه ... constrains‌ها دقیقا همین کار رو انجام میدن .. مثلا شما میتونید تعریف کنید که زمانی که author پاک شد post‌ها هم پاک بشن .. یا اینکه فیلد author_id نال بشه .. همون cascadeOnDelete که میذاریم دقیقا همین کار رو انجام میده. برای اینکه بیشتر متوجه بشید این مقاله رو بخونید.

https://vertabelo.com/blog/database-constraints-types/#:~:text=Database%20constraints%20are%20a%20key,or%20deleted)%20in%20a%20database.


5 - سناریو آخری که میگید سناریوی اشتباهی هست .. چون شما میخواید فیلدی رو پاک کنید از داخل دیتابیس و همزمان به کاربر هم نشون بدید .. و خب طبیعتا این ۲ مورد با هم تناقض داره .. ولی به هر حال میتونید با archive کردن این کار رو انجام بدید .. یعنی در واقع badge رو ارشیو کنید که دیگه به کسی اون badge رو ندید ولی بتونید به کاربرها بگید که شما فلان badge رو دارید .. برای این موارد از soft delete نباید استفاده کنید. چون کوئری‌های پیش فرض soft delete رو نمایش نمیده ..

بهترین پاسخ
مهرداد سامی ۱۸ تیر ۱۴۰۱، ۱۲:۵۰