احمد
4 سال پیش توسط احمد مطرح شد
13 پاسخ

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

@mhyeganeh @hesammousavi @AliValinejad @ali.bayat @milad @Rp76 @mehdi.shahabbasian @mohaligateway @sina.it91 @arash.taghavi69 @roocketir
سلام دوستان . من در حال توسعه یه فروشگاه هستم. یه بخش از وب سایت رو نمیتونم روش درست پیاده سازی اون رو پیدا کنم. و اون بخشی است که با انتخاب رنگ و گارانتی محصول قیمت هم تغییر کنه. توضیح: فرض کنید که برای محصول گوشی شیائومی ردمی نوت 9 ما سه رنگ متفاوت و دو تا گارانتی متفاوت داریم و مثلا فقط از رنگ خاکستری با گارانتی ماکروتل 2 تا موجودی داریم و قیمت هم مثلا 4500000 هست و برای سایر رنگ ها با گارانتی ماکروتل موجودی نداریم. و از اون طرف برای گارانتی می هوم برای هر سه رنگ موجودی داریم ولی قیمت رنگ خاکستری و آبی از رنگ سفید گرونتره و موجودی هر رنگ هم متفاوته. برای طراحی دیتابیس و نوع رابطه یکم سردرگم شدم. اگه خواسته باشیم یه جدول جداگانه به نام producType بسازیم که رابطه یک به چند با جدول product داشته باشه و ما بیاییم تو جدول productType برای هر محصول بصورت جداگانه چندتا رنگ و گارانتی و قیمت رو اضافه کنیم به نظرم کار درستی نیست چون باید برای یک محصول 5 تا ویژگی رنگ و گارانتی و قیمت و موجودی متفاوت ایجاد کنیم و از طرفی باعث سنگین شدن دیتابیس میشه. برفرض اگه یکم قیمت ها نوسان پیدا کنه یا یک رنگ و گارانتی ناموجود بشه باید بیاییم و تک تک این ویژگی ها رو ویرایش کنییم، در این صورت اگه فروشگاه ما هزارتا محصول داشت چی؟ دوستان هرچی با خودم فکر می کنم روش درست و استانداردی برای این مسئله به ذهننم نمی رسه لطفا یه راهنمایی و روش درست این مسئله رو بیان بفرمایید


ثبت پرسش جدید
مهدی شاه عباسیان
تخصص : برنامه نویس
@shahabbasian 4 سال پیش مطرح شد
0

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

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


moha li
تخصص : توسعه دهنده لاراول و Vue
@mohaligateway 4 سال پیش مطرح شد
0

سلام دوست عزیز.
اولا شما یه productmeta درست کن که جدول product شلوغ نشه و در صورت نیاز اطلاعات ذخیره بشه. می تونی توی پنل مدیریت برای یه محصول یه ستون جدا درست کنی که در صورتی که مقدارش 1 بود به جدول meta مراجعه کنه و قیمت جدید رو از اونجا بخونه. اینجوری می تونی مدیریت خیلی خوبی رو محصولات داشته باشی.
یه راه دیگم هست که برای خواص مختلف جداول مختلفی رو درست کنی که به نظرم یه کم هزینه بر هستش از نظر پایگاه داده ای.
@mehdi.shahabbasian
@ahmad316948


احمد
@ahmad316948 4 سال پیش آپدیت شد
0

@mehdi.shahabbasian
@mohaligateway
سلام. من اومدم و یک جدول جداگانه به نام warranty که با جدول products رابطه چند به چند داره. ویک جدول دیگه به نام color که تو این جدول فقط نام کد رنگ ذخیره میشه که این جدول رابطه چند به چند با جدول products داره و تو جدول واسط colorproduct دوتا فیلد جدید به نام price و inventory اضافه کردم. تا موقعی که یک رنگ و قیمت و موجودی برای محصول ثبت میشه همچی اوکیه ولی اگه به خام چند تا رنگ با قیمت و موجودی متفاوت تو این جدول color و جدول رابط colorproduct ثبت کنم ارور میده و نمیشه این کارو انجام داد.
من از طریق pivot تو مدل product اون دوتا فیلد رو به رابطه معرفی کردم و تو کنتلر هم هنگام ایجاد محصول جدید رنگ و قیمت و موجودی رو از طریق متد attach ذخیره کردم. الان مشکل سر ذخیره چندتا رنگ و قیمت و موجودی هست

     $product->colors()->attach($data['colors'] ,['pricecolor'=>$request ->pricecolor , 'inventory'=>$request ->inventory]);

مدل products:

 public function colors() 
    {
        return $this->belongsToMany(Color::class)->withPivot('pricecolor', 'inventory');
    }

moha li
تخصص : توسعه دهنده لاراول و Vue
@mohaligateway 4 سال پیش مطرح شد
0

سلام @ahmad316948
به نظر مشکل شما در ساخت جدول ها است. مثلا برای رنگ نیازی نیست که یه جدول جداگانه ایجاد کنید. شما می تونید توی یک ستون برای یک محصول رنگ ها رو مشخص کنید به صورت یک آرایه. ضمنا یه راه حل دیگه هم که الان به ذهنم رسید اینه که می تونید توی همون جدول محصولات رنگ و قیمت رو به صورت آرایه پشت سر هم بنویسید. مثل زیر

['white', 'red', 'blue']
['15000', '2000', '3500']

به راحتی با برنامه نویسی می تونی به هم مربوطشون کنی
@mehdi.shahabbasian


مهدی شاه عباسیان
تخصص : برنامه نویس
@shahabbasian 4 سال پیش آپدیت شد
0

@mohaligateway @ahmad316948
به نظر من اگر جدول جدا برای ویژگی ها داشته باشن بهتره
به 2 دلیل
یک
چون ممکنه پروژه هزاران محصول داشته باشه و فقط 50 تاش ویژگی داشته باشه و حالا برای نمایش ویژگی ها باید بین همه اون محصولات کوئری اجرا بشه (هنگام ویرایش در مدیریت)
(یا اینکه نمیشه مدیریت خوبی روی ویژگی ها داشت)

و دوم ممکنه اکثر ویژگی ها مثل رنگ برای بیشتر محصولات به کار برن (پس عملا یک ردیف داریم برای چندین محصول)

جدول پیشنهادی من:

products:
id
name
price
----------------------
properties:
id
type
name
---------------------
product_property:
product_id
property_id

که در جدول ویژگی type نوع ویژگی رو مشخص میکنه (رنگ-سایزو...)


moha li
تخصص : توسعه دهنده لاراول و Vue
@mohaligateway 4 سال پیش آپدیت شد
0

تشکر از @mehdi.shahabbasian
بهتره price رو هم به properties منتقل کنن.

products:
id
name
----------------------
properties:
id
type
name
price
---------------------
product_property:
product_id
property_id

چون قیمت های محصولات براساس رنگ متفاوت هستن
@ahmad316948


مهدی شاه عباسیان
تخصص : برنامه نویس
@shahabbasian 4 سال پیش مطرح شد
1

@mohaligateway
همینطور که در بالاتر هم اشاره کردم ما نمیتونیم قیمت رو توی ویژگی بزاریم
اگر یک محصول ویژگی نداشته باشه پس تکلیف قیمت چی میشه ؟

بهترین روش اینه که محصول قیمت اصلی (پایه) را داشته باشه و اگر قراره بر اثر ویژگی قیمت تفاوت داشته باشه یک قیمت هم به جدول ویژگی اضافه میکنیم که مقدار هزینه ای رو به قیمت پایه اضافه و یا کم میکنه


احمد
@ahmad316948 4 سال پیش مطرح شد
0

@mohaligateway @mehdi.shahabbasian
ممنون دوستان. به نظر شما برای گارانتی اگه یک جدول جداگانه داشته باشم بهتر نیست؟ چون تو وب سایت فروشگاهی موبایل و لوازم جانبی معمولا چندتا گارانتی بیشتر نیست. و برای رنگ و کد رنگ یک جدول جداگانه داشته باشیم و برای قیمت و موجودی هر رنگ بیاییم توسط متد pivot دوتا سطر جداگانه در جدول واسط color_product برای قیمت و موجودی اضافه کنیم. دلیل این کار(ممکنه این تحلیل من درست نباشه دوستان و درقالب مشاوره بیان میکنم): شما فرض کنید یک فروشگاه موبایل داریم یا هرچی که هزار تا محصول داره اگه قرار باشه قیمت و موجودی و گارانتی رو تو یک جدول ذخیره کنیم باید بیاییم در پنل مدریت و تو همین جدول برای هر محصول چند تا رنگ و قیمت و موجودی تعیین کنیم و بعد هنگام ایجاد محصول این ویژگی ها رو بیاییم انتخاب کنیم. حالا مشکل این روش این هست که اولا زمان بر هست و دوما من میخام یکسری ویژگی مثل گارانتی و رنگ از قبل در جدول ایجاد شده باشه و فقط هنگام ایجاد محصول بیاییم اون ویژگی هارو انتخاب کنیم و در کنار این ها یک فیلد برای قیمت و یک فیلد برای موجودی هم باشه که این دوتا فیلد هنگام درج محصول مقدار دهی بشه و از همه مهمتر اینه که بشه چندتا از همین ویژگی ها رو برای محصول ثبت کرد.
حالا میخام دوستان نظرات خودشونو بیان کنند.


moha li
تخصص : توسعه دهنده لاراول و Vue
@mohaligateway 4 سال پیش مطرح شد
0

سلام خواهش می کنم. برای این قبیل طراحی ها به نظرم اگه یه flow chart داشته باشین خیلی راحت تر می شه نظر داد. (البته این نظر منه توی هر پروژه flow chart کشیدم راحت تر تونستم مسئله رو حل کنم 😁) بله این کار خیلی هم عالیه که جدول جدا داشته باشیم ولی اگه یه کم حجم کاربر ها بالا بره و درخواست ها زیاد بشه فکر کنم از منابع سرور خیلی استفاده بشه و یه جورایی کم بیاره البته از سیستم cache هم میشه استفاده کرد.
@ahmad316948


مهدی شاه عباسیان
تخصص : برنامه نویس
@shahabbasian 4 سال پیش مطرح شد
0

@ahmad316948
دوست عزیز ویژگی ها، گارانتی، تفاوت قیمت ها و ...
اینا همه نیاز به مدیریت جدا دارند در پروژه و خیلی هاشون یک بار تعریف بشن در کلی محصول ازشون استفاده میشه
رابطه ها در دیتابیس برای همین ساخته شدند.
با خیال راحت جداول جدا براشون درست کن و پروژت رو استارت بزن


احمد
@ahmad316948 4 سال پیش مطرح شد
0

@mehdi.shahabbasian @mohaligateway @mhyeganeh @ali.bayat
خوب من تصمیم گرفتم ویژگی های رنگ، کد رنگ، قیمت، و موجودی رو تو یک جدول ذخیره کنم و با رایطه چند به چند با جدول product به هم متصل کنم. خوب تا اینجای کار همچی اوکیه و تو صفحه جزئیات محصول هم در checkbox به نمایش در اوردم. فقط یه نکته مهم این وسط بوجود میاد، چجوری وقتی کاربر یک رنگ(با قیمت و موجودی متفاوت) رو انتخاب کرد و رویه باتن "افزودن به سبد خرید" کلیک کرد این ویژگی های انتخاب شده برای محصول ثبت بشه و در سبد خرید اون محصولی که کاربر با ویژگی مد نظر انتخاب کرده نمایش داده بشه؟ به نظرتون اگه بیام و تو جدول product دوتا فیلد(یکی برای رنگ و یکی برای گارانتی) قرار بدم که با انتخاب رنگ و گارانتی id اون ها در این دوتا فیلد ذخیره بشه و هنگام افزودن به سبد خرید این دوتا فیلد مقدار دهی بشه کار درستیه؟ روش بهتر و بهینه چی میتونه باشه؟


moha li
تخصص : توسعه دهنده لاراول و Vue
@mohaligateway 4 سال پیش مطرح شد
0

از دو تا حالت می تونین استفاده کنید :
1- به صورت پیشفرض تمامی اطلاعات محصول رو بگیرید و در html قرار بدید و با جاوا اسکریپت مدیریت کنید که توصیه نمی کنم چون صفحه سنگین میشه.
2- می تونید به صورت داینامیک اطلاعات رو دریافت کنید. اگر livewire بلد هستید با استفاده از livewire و اگر vue بلد هستید با axios و اگر جی کوئری می تونید از Ajax استفاده کنید.
@ahmad316948
@mehdi.shahabbasian


احمد
@ahmad316948 4 سال پیش آپدیت شد
0

@mehdi.shahabbasian @mohaligateway
@hesammousavi
ممنون دوستان. با راهنمایی های شما این مسئله رو یه جوری حلش کردم البته بصورت ابتدائی و آماتور. ولی شما فکر کنید که این مسئله رو نتونستم حل کنم. در کل برای پیاده سازی این سیستم بصورت کامل و اصولی الگو درست و حسابی وجود نداره و اگه بتونید یه آموزش در این رابطه ببینید خیلی تأثیر گذاره و از جناب موسوی میخام تا این مبحث مهم رو در یکی از دوره ها آموزش
بدن.


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

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