مهدی
3 سال پیش توسط مهدی مطرح شد
6 پاسخ

ایجاد جدول بهینه برای مقالات

سلام وقت بخیر
من میخوام بخش مقالات سایت رو بنویسم
بنظر شما این جدول بهینه هست یا نه؟

Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('user_id');
            $table->foreign('user_id')->on('users')->references('id');
            $table->string('image');
            $table->text('title');
            $table->longText('content');
            $table->string('tags');
            $table->string('category');
            $table->string('slug')->unique();
            $table->integer('viewCount')->default('0');
            $table->integer('commentCount')->default('0');
            $table->string('status')->default('1');
            $table->softDeletes();
            $table->timestamps();
        });

بنظرتون بهتره برای tag و category از pivot یا یک به چند استفاده کنم یا به همین شکل بالا بنویسم


ثبت پرسش جدید
محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 3 سال پیش مطرح شد
0

سلام

مواردی که به نظرم میاد:

خط3: اگر منظورتون نویسنده پست هست بهتره از نام author_id استفاده کنید. خوانایی کدتون بهتر میشه و رایج‌تره.

خط 4: تکیلف حالت های onUpdate و onDelete رو هم ترجیحا مشخص کنید تا اتفاق ناخواسته نیافته. به این معنا که باید تعیین بشه اگر نویسنده پست حذف شد یا اطلاعات آیدیش در دیتابیس تغییر کرد چه اتفاقی باید برای پست هاش بیفته.

خط 5: عنوانش ترجیحا بشه main_image یا featured_image جهت افزایش خوانایی کد. نوعش هم همین string باشه. (موردی که آقای قمی بالا اشاره کردند به نظرم صحیح نیست!)

خط 8: به هیچ وجه روش مناسبی نیست. اولا اگر قصد ذخیره چندین تگ داخل یک فیلد رو دارید باید نوع ستون رو مثلا json قرار بدید. ثانیا در اکثر مواقع رابطه پست و برچسب‌ها از نوع‌ Many-to-Many هست و اگر مثال‌های مستندات لاراول رو برای این بخش ببینید دقیقا همین مثال رو زده. به همین خاطر بهتره کلا این فیلد حذف بشه و دو تا جدول tags و post_tag ایجاد بشن.

خط 9: معمولا رابطه post و categor هم از نوع One-to_Many هست. (مگر اینکه خواسته باشید هر پستتون چندتا موضوع دسته بندی داشته باشه که چندان رایج نیست) به همین خاطر اسمش باید بشه category_id و وصل بشه به ستون id در جدول categories.

خط 11 و 12 و 13: مقدار پیش فرض رو بصورت رشته ای قرار ندید بلکه به شکل integer باشه default(1)

خط 12: این مورد اختلافیه. ولی به نظرم بهتره برای بدست آوردن تعداد کامنت‌ها یک کوئری به جدول commetns و از نوع count() بزنید. نهایتا برای افزایش بهره‌وری می‌تونید نتیجه رو cache کنید.

خط 13: برای تعیین وضعیت هر پست هم اولا بهتره بجای عدد مثلا 1 از عبارات با معناتری مثل draft یا published و ... استفاده کنید. خوانایی کد بیشتر میشه. ثانیا نوعش رو بجای string بروی enum تنظیم کنید. اگر هم کلا دو حالت دارید که مثلا منتشر شده و منتشر نشده میشه یک ستون از جنس boolean جایگزینش کنید با عنوان مثلا is_published.


محمدرضا قمی اویلی
تخصص : لاراول
@ghomi 3 سال پیش مطرح شد
0

سلام
نمیشه گفت این جدول بهینه نیست چون بسته به نیازت میای جداول خودتو میسازی
یه زمانی میخوای این مقاله مربوط به چند دسته بندی باشه اونجا میای از جدول واسط استفاده میکنی
در هر صورت نیاز به جدول دسته بندی جداگانه ای داری
یه مشکلی که الان میبینم اینه که اومدی مقدار image برابر با string قرار دادی که بهتر text کنی چون بهتره برای سایز های مختلف تصویر اندازه مخصوص اون سایز نمایش بدی
برای tag هم میتونی هم از این روش هم جدول واسط استفاده کنی این موارد سلیقه ای هست از نظر بنده و هیچ مشکلی ایجاد نمیکنه


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 3 سال پیش مطرح شد
0

سلام

مواردی که به نظرم میاد:

خط3: اگر منظورتون نویسنده پست هست بهتره از نام author_id استفاده کنید. خوانایی کدتون بهتر میشه و رایج‌تره.

خط 4: تکیلف حالت های onUpdate و onDelete رو هم ترجیحا مشخص کنید تا اتفاق ناخواسته نیافته. به این معنا که باید تعیین بشه اگر نویسنده پست حذف شد یا اطلاعات آیدیش در دیتابیس تغییر کرد چه اتفاقی باید برای پست هاش بیفته.

خط 5: عنوانش ترجیحا بشه main_image یا featured_image جهت افزایش خوانایی کد. نوعش هم همین string باشه. (موردی که آقای قمی بالا اشاره کردند به نظرم صحیح نیست!)

خط 8: به هیچ وجه روش مناسبی نیست. اولا اگر قصد ذخیره چندین تگ داخل یک فیلد رو دارید باید نوع ستون رو مثلا json قرار بدید. ثانیا در اکثر مواقع رابطه پست و برچسب‌ها از نوع‌ Many-to-Many هست و اگر مثال‌های مستندات لاراول رو برای این بخش ببینید دقیقا همین مثال رو زده. به همین خاطر بهتره کلا این فیلد حذف بشه و دو تا جدول tags و post_tag ایجاد بشن.

خط 9: معمولا رابطه post و categor هم از نوع One-to_Many هست. (مگر اینکه خواسته باشید هر پستتون چندتا موضوع دسته بندی داشته باشه که چندان رایج نیست) به همین خاطر اسمش باید بشه category_id و وصل بشه به ستون id در جدول categories.

خط 11 و 12 و 13: مقدار پیش فرض رو بصورت رشته ای قرار ندید بلکه به شکل integer باشه default(1)

خط 12: این مورد اختلافیه. ولی به نظرم بهتره برای بدست آوردن تعداد کامنت‌ها یک کوئری به جدول commetns و از نوع count() بزنید. نهایتا برای افزایش بهره‌وری می‌تونید نتیجه رو cache کنید.

خط 13: برای تعیین وضعیت هر پست هم اولا بهتره بجای عدد مثلا 1 از عبارات با معناتری مثل draft یا published و ... استفاده کنید. خوانایی کد بیشتر میشه. ثانیا نوعش رو بجای string بروی enum تنظیم کنید. اگر هم کلا دو حالت دارید که مثلا منتشر شده و منتشر نشده میشه یک ستون از جنس boolean جایگزینش کنید با عنوان مثلا is_published.


مهدی
تخصص : Backend Developer
@mahdidv 3 سال پیش مطرح شد
0

@mhyeganeh با تشکر از وقتی که گذاشتید بسیار مفید بود یک سوال دیگه جدول seo را از چه نوعی استفاده کنم one to many polymorphic ؟ مناسب هست ؟
ممنون


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 3 سال پیش مطرح شد
0

متوجه منظورتون از جدول seo نمی‌شم.
اگر مواردی مثل مقادیر تگ‌های title و description و ... رو می‌خواهید ذخیره کنید که منطقا از نوع one-to-many میشه و با post_id ارتباط برقرار میشه.
داخل خود جدول posts هم میشه ذخیره کرد بعنوان دو تا ستون.


مهدی
تخصص : Backend Developer
@mahdidv 3 سال پیش مطرح شد
0

@mhyeganeh خوب دسته بندیها تگها مقالات همه نیاز به سئو دارن title , description و ....
برای همین میخواستم از پلی مورف استفاده کنم


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 3 سال پیش مطرح شد
0

بله اگر برای بقیه موارد هم می‌خواهید استفاده کنید PolyMorphic One-to-Many بهترین انتخابه. 👍


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام