جشنواره عیدانه راکت | عضویت ویژه راکت برای آخرین بار | افزایش قیمت‌ها از سال جدید | و ...

مشاهده اطلاعات بیشتر...
ثانیه
دقیقه
ساعت
روز
developer
3 سال پیش توسط developer مطرح شد
1 پاسخ

تاثیر روابط در دیتابیس

سلام یه سوالی دارم

۳۰۰۰ تا یوزر داریم
و هر یوزر هم ۱۰۰۰ تا سوال

الان واسه پیاده سازی این چه پیشنهادی میدید؟

یه جدول یوزر پیاده کنم و یه جدول سوال و بعد بین هر یوزر با سوالش ریلیشن ایجاد کنم؟
یا اینکه توی یوزر یه فیلد بذارم و سوالاشو اونجا به صورت آرایه ذخیره کنم؟

بعد اگه راه اول رو برم، وقتی سوالای یک یوزر فراخوانی میشه mysql میره بین چند میلیون سوال سرچ میزنه یا چون ریلیشن دارن یک راست همه سوالا رو فراخوانی میکنه؟

در واقع سوال اصلیم اینه وقتی توی دیتابیس ریلیشن میسازیم این کار باعث واقعا باعث افزایش سرعت فراخوانی دیتا میشه یا نه؟

@mhyeganeh @ali.bayat @hesammousavi @Rp76 @milad @arash.taghavi69


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

اشاره نکردید که این سوال ها تکرار می‌شوند یا اینکه برای هر یوزر ۱۰۰۰ تا سوال یکتا وجود داره.

اگر برای هر یوزر ۱۰۰۰ تا سوال یکتا و متفاوت دارید منطقی ترین کارش برقراری رابطه از نوع One-To-Many هست. پس میشه دو تا جدول users و questions با یک فیلد بنام userid بعنوان FK.

اگر سوال ها ممکن هست بین یوزرها مشترک باشند، احتمالا بهترین کار استفاده از روابط Many-To-Many باشه. و میشه سه تا جدول بنام های users و questions و questionuser.

و معمولا به ندرت راهکار ذخیره در قالب یک فیلد بصورت Json یا آرایه پیشنهاد میشه.

توجه داشته باشید دیتابیس ها روش کارشون یکم خاصه. یعنی در خصوص دو راهکار اولی خیال نکنید که خیلی کار سنگینی برای دیتایبس محسوب میشه که از بین فرضا چند میلیون رکورد سوال، سوالاتی که مربوط به یک کاربر خاص هستند رو استخراج کنه. چون معمولا برای فیلد FK از نوع integer استفاده میشه و همچنین index هم میشه. پس به همین خاطر دسترسی بهشون خیلی سریع تر و راحت تر از چیزی هست که تصورش رو بکنید. اما جستجو یک کلمه متنی خاص در بین فرضا یک فیلد از نوع text داستانش متفاوت هست و ممکنه کوئری سنگینی محسوب بشه. (یکسری راهکارها و سرویس هایی وجود دارند بصورت خاص برای چنین مواقعی که داستانش جداست)
بعلاوه اینکه از بین چهار عملیات CRUD عملیات گرفتن اطلاعات یا همون select کردن یا Read سبک ترین و سریع ترینشون هست. تازه اگر فرض کنیم که شما نیاز داشته باشید که در یک کوئری تمام سوالات رو یکجا بگیرید. معمولا در فضای عملیاتی واقعی داده ها بصورت بخش بخش یا همون paginate شده گرفته می‌شوند.

پس نتیجه اینکه اگر طبق آموزش ها و مستندات خود لاراول migration ها و Model ها و Relation هاتون رو بسازید در هر دو حالت پیشنهادی اول، با مشکل خاصی روبرو نخواهید شد و طبیعی هست.


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

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