راکت

طراحی دیتابیس سیستم ارتقا دوره

4 پاسخ

سلام دوستان
من یه جدول دیتابیس دارم که شامل اطلاعات دوره‌هاست به اینصورت:

    public function up()
    {
        Schema::create('courses', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->string('status');
            $table->string('type');
            $table->string('price');
            $table->timestamps();
        });
    }

این دوره‌ها هر کدوم دارای محتوای ویدئویی و همچنین میتونند آزمون و تکلیف و ... یکسری آپشن‌های دیگه داشته باشند. دوره‌هایی که فقط محتوا دارند رو افراد میتونند رایگان ثبتنام کنند. ولی ما الان میخوایم برای بعضی ازین دوره‌ها آزمون تعریف کنیم و به یه قیمتی به فروش برسونیم. الان من توی طراحی جداول دیتابیسش مشکل دارم که چطور فردی رو که قبلا توی دوره ثبتنام کرده رو با گرفتن یه هزینه‌ای دسترسی آزمون بدم. شبیه سایت مکتبخونه.

    public function up()
    {
        Schema::create('orders', function (Blueprint $table) {
            $table->id();
            $table->string('course_id');
            $table->string('user_id');
            $table->string('status');
            $table->string('price');
            $table->timestamps();
        });
    }
نگار
نگار
@Negaram
ثبت پرسش جدید

پاسخ‌ها

4
محمد رضا
محمد رضا
@salar.mohammad2013

تخصص: Full Stack Developer

سلام دوست عزیز
موضوع خیلی ساده هست فقط نیازمند اینه که شما موضوع رو برای خودت خیلی واضح کنی
شما یک سری درس داری که اشخاص یا دسترسی بهش دارند یا ندارند کاری بهش نداریم
یک سری ازمون داری که لازمه ی اون دادن هزینه هست
خب خیلی راحت یک جدول رابط بین اشخاص و ازمون ها میزاری و رابطه چند به چند هم هست
یعنی یک شخص میتونه هزینه n آزمون رو داده باشه و یک ازمون میتونه توسط n شخص هزینش پرداخت شده باشه و در دسترسشون باشه

منطق این کار مثل سطح دسترسی و Role و Permission هست از نظر پیاده سازی دیتابیسی (اگر دوره پروژه محور لاراول راکت رو دیده باشید )
در کل شما بر اساس نیاز میتونی جدول درس شخص داشته باشی (course_user) و دیگ جدول قبلی و یا واسط دیگری نیازت نشه.
مثلا بگی شخص به درس دسترسی داره ؟ به ازمون مربوط به این درس چطور ؟ به تکلیفش چطور ؟
در صورتی که این کار رو بکنی با یک جدول همه ی این موارد راحت چک میشه
مثلا جدول زیر

        Schema::create('course_user', function (Blueprint $table) {
            $table->id();

            $table->unsignedBigInteger('user_id');
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

            $table->unsignedBigInteger('course_id');
            $table->foreign('course_id')->references('id')->on('cource')->onDelete('cascade');

            $table->boolean('has_access_to_exam')->default(false);
            $table->boolean('has_access_to_practice')->default(false);
            $table->boolean('has_access_to_x')->default(false);
            $table->boolean('has_access_to_y')->default(false);

            $table->timestamps();
        });

البته نیاز به id و timestamps هم نیست معمولا توی جدول واسط رابطه ای و کلید اصلی میشه ترکیب دو کلید خارجی

شما با جدول واسط مربوط به درس و شخص همه ی دسترسی ها رو هم بررسی و نگهداری میکنی
کلا بستگی به مکانیزم منطقی و پیاده سازی شما داره که چی بخواید و چیکار کنید وگرنه راه حل که زیاد داره باید ببینید کدوم بهتره براتون

نگار
نگار
@Negaram

تخصص: توسعه دهنده بک اند

خیلی ممنون.🙏
من همش تو فکر یه جدول جدید برای آپشن‌های دوره بودم ولی انگار راه حل شما مناسبتره.
در موردش فکر میکنم اگر مشکلی داشتم مزاحمتون میشم.😁

شاید پاسخ شما همین‌جا باشد

مهدی نظری
مهدی نظری
@mahdi.nazari

تخصص: توسعه دهنده Front End

سلام نگار🖐
امیدوارم حالت خوب و عالی باشی✨

دیتابیسی که شما طراحی کردی تا حدودی درسته ، اما چند تصحیح کوچک نیاز داره .

  1. جدول courses:

    • در جدول courses شما یک ستون به نام status دارید که به طور احتمالی برای نشان دادن وضعیت دوره مانند "فعال" یا "غیرفعال" استفاده می‌شود. اگر وضعیت‌های متفاوتی برای دوره‌ها دارید (مثلاً "فعال", "غیرفعال", "در حال برگزاری" و غیره)، می‌توانید از یک مقدار عددی استفاده کنید (مثلاً 1 برای فعال و 0 برای غیرفعال) و یک جدول جداگانه برای وضعیت‌ها ایجاد کنید.
  2. جدول course_user:

    • در جدول course_user شما ستون‌های has_access_to_exam, has_access_to_practice, has_access_to_x, و has_access_to_y داری این روش مناسب نیست زیاد چرا چون که اگع تعداد آپشن‌ها زیاد باشه، تعداد ستون‌ها زیاد میشه و قیمه میره تو ماستا . به جای این روش، میتونی از یک جدول جدید به نام course_options استفاده کنی.
  3. جدول course_options:

    • این جدول بهت امکان می‌ده تا آپشن‌های مختلفی را برای هر دوره تعریف کنی. میتونی ستون‌های زیر را در این جدول قرار دهید:
      • id (شناسه یکتا)
      • course_id (کلید خارجی به جدول courses برای ارتباط با دوره مربوطه)
      • option_name (نام آپشن، مثلاً "آزمون" یا "تکلیف")
      • price (قیمت مربوط به آپشن اگر قابل خرید است، در غیر این صورت 0 یا null)
    • با این روش، میتونی به راحتی برای هر دوره تعداد نامحدودی آپشن ایجاد کنی و قیمت هر آپشن را مدیریت کنی.

با این تغییرات، می‌توانید به راحتی کاربرانی که به دوره‌ها ثبت‌نام کرده‌اند را با گرفتن هزینه‌های مرتبط با آپشن‌هایی که انتخاب کردن ، مدیریت کنی و تمام 👌.

امیدوارم پاسخم بهت کمک کرده باشه ❤️
موفق و پیروز باشی 🤘🌹

نگار
نگار
@Negaram

تخصص: توسعه دهنده بک اند

ممنون.
با این طراحی باید از کجا بفهمم که کاربر به کدوم آپشن دسترسی داره و پولشو پرداخت کرده؟
@mahdi.nazari

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

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