T.chegini
5 سال پیش توسط T.chegini مطرح شد
16 پاسخ

روابط بین جداول

سلام.
من پنج جدول دارم که به ترتیب با هم ارتباط دارن.

Country -> University ->Faculty ->Field -> Master

هر جدول از طریق کلید خارجی با جدول قبلی ارتباط داره. حالا میخوام مثلا از جدول master مستقیم به جدول country دسترسی داشته باشم و نام کشور رو داشته باشم. برای دسترسی مستقیم راهی وجود داره یا باید به ترتیب مدل ها رو فراخوانی کنم؟


ثبت پرسش جدید
داود خانی
تخصص : برنامه نویس لاراول و متخصص سئو...
@davoodkhany 5 سال پیش مطرح شد
2

سلام می تونید از پکیج زیر استفاده کنید :فکر نکنم لاراول همچین چیزی داشته باشه.می تونید از deep استفاده کنید...

https://github.com/staudenmeir/eloquent-has-many-deep

Alimotreb
تخصص : کانفیگ سرور و برنامه نویس
@Alimotreb 5 سال پیش مطرح شد
1

سلام
@t.chegini

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

فکر کنم بشه بر اساس پروژه شما هم مورد استفاده قرار داد
https://roocket.ir/discuss/6117

برادر @ali.bayat به نظر باید بشه نه؟
مال شما روی یه مدل کار میکنه یا با چند مدل هم میشه ارتباط برقرار کرد؟


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
1

@Alimotreb

درود
پکیج Categorizable روی چندین مدل قابل پیاده سازیه.. اگر جداولی که دوستمون اشاره کرد‌ (Country, University , ...) رو به عنوان دسته بندی در نظر بگیریم بله میشه ازش استفاده کرد.

@t.chegini
اگر به این شکل نگاه کنیم که هر رابطه در واقع یه کوئری SQL هست... ۴ مرحله از روابط برای دریافت یه فیلد میتونه فشار قابل توجهی روی سرور بیاره.

روابط بین جداول لاراول عالی هستند اما اگر مراقب نباشید دچار مشکل N + 1 میشید. (مثلا برای دریافت ۱۱ رکورد از دیتابیس دارید ۱۱ + ۱ کوئری میزنید) در حین توسعه با لاراول حتما پکیج زیر رو نصب کنید و تعداد کوئری ها رو بررسی کنید:
https://github.com/barryvdh/laravel-debugbar

بهترین روش برای شما، روشیه که با کمترین تعداد کوئری داده ها رو دریافت کنید

  • علاوه بر اینکه بین جدول Master و Field یه رابطه دارید .. یه رابطه مستقیم هم بین Master و Country تعریف کنید.
  • میتونید از Global Scope ها استفاده کنید.
  • حتی میتونید تمام مراحل روابط رو بوجود بیارید (از Country تا Master) و در حین دریافت اطلاعات Country سایر روابط مورد نیازتون رو Eager-load کنید.

webazin webazin
@webazin.org90 5 سال پیش مطرح شد
1

https://github.com/staudenmeir/eloquent-has-many-deep

از همین پکیجی که دوستمون بالاتر معرفی کردن به راحتی میتونید تا چندین جدول پیش برید، و برعکسشم با همین پکیج قابل انجام هست


T.chegini
@t.chegini 5 سال پیش مطرح شد
0

@ali.bayat
ممنون بابت راهنماییتون.
مشکل من اینجاست که بین جدول master و جدول country کلید مشترک ندارم که بتونم بینشون ارتباط برقرار کنم. هر جدول فقط کلید اصلی جدول قبلی رو داره.
سرچ که کردم خودم پکیج has- many- deep رو پیدا کردم. ولی تست که کردم فقط بین سه جدول جواب میداد. یعنی اولی رو با سومی ارتباط میده. برای مثال من که مجموعا حدود 9 تا جدول دارم که همشون به هم ارتباط یک به چند و چند به چند دارن، نتونستم روش بهتری پیدا کنم.
منظورتون از Global Scope چیه؟


T.chegini
@t.chegini 5 سال پیش مطرح شد
0

@webazin.org90
ممنونم.
اینو خودم تست کردم. تا سه تا جدول جواب میداد. البته شاید من نتونستم برای تعداد بیشتری جدول جواب بگیرم.
باید مجدد بررسی کنم.


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
1

گلوبال اسکوپ برای افزودن شرط های ویژه به یک مدل در حین دریافت داده ها به کار میره. مثلا برای دریافت University هایی که مختص به یه Country خاص هستند

https://laravel.com/docs/6.x/eloquent#global-scopes


یه نکته دیگه: شما نیازی به کلید مشترک بین master و country ندارید. میتونید اول Country رو به همراه University ایگر لود کنید و سپس University رو با Faculty و الا آخر.. به این شکل هروقت Country رو بگیرید تمام اطلاعات زیر مجموعه هاش رو هم دارید اما این حجم زیادی از اطلاعات میشه..

اگرم هم بتونید از پکیج has- many- deep بصورت مولتی لول استفاده کنید، خوبه


webazin webazin
@webazin.org90 5 سال پیش مطرح شد
1

@t.chegini

درود، توی مثالی که خودش گفته 4 تا جدول رو مثال زده، و بیشتر هم میشه، فقط شما باید کلید های خارجی رو به درستی تعریف کنید


داود خانی
تخصص : برنامه نویس لاراول و متخصص سئو...
@davoodkhany 5 سال پیش مطرح شد
1

سلام ولی بریم به تیلور بگیم واسه اینجور روابط هم یه چیزی پیاده کنه یا بیایید خودمون پیاده کنیم نظرتونه چیه ؟؟؟
@t.chegini شما که استادید....
@ali.bayat
@webazin.org90
@Alimotreb
حسام جان @hesammousavi شما هم لطف کن موقعی که میخوای با خالق لاراول یه بحث گفتگو داشته باشی این موضوع رو هم بهش بگو مرسی...


webazin webazin
@webazin.org90 5 سال پیش مطرح شد
1

@davoodkhany

اره، منم واسم عجیبه چرا از این پکیج هایی که لاراول رو قوی تر میکنه استفاده نمیکنن، این روابط به نظر من خوبه باشه


Alimotreb
تخصص : کانفیگ سرور و برنامه نویس
@Alimotreb 5 سال پیش آپدیت شد
1

سلام
@ali.bayat
پکیج شما اولین چیزی بود که به ذهنم رسید

این موضوع یه هوا پیچیده شد گویا ، زنگ بزنیم به این تیلور بگیم راه حلت چیه این جور موقع ها @davoodkhany :)))

ولی خب حرفت درسته برادر ، باید از دیباگر ، چیزی که کمترین کوئری رو میزنه پیدا کرد !
به نظر خودت بهترین کار چیه ، من گفتم به چشم دسته بندی ببینیمش تا بتونیم راحت تر پیاده سازیش کنیم...!


داود خانی
تخصص : برنامه نویس لاراول و متخصص سئو...
@davoodkhany 5 سال پیش مطرح شد
1

@Alimotreb
من تو یه همچین پروژه ای بودم واقعا رابطه ها گیج کننده و یکم که نه خیلی تو در تو ... شاید پروژه خانم @t.chegini شبیه پروژه ما بوده واقعا بزرگ و پیچیده از همه بدتر یه سرچ خیلی بزرگتر داشت ...


T.chegini
@t.chegini 5 سال پیش مطرح شد
0

@ali.bayat :
ممنونم. دقیقا الان همین کار رو کردم و صحیح جواب میده. اما موضوع تعداد زیاد کوئری ها و حجم زیاد داده های return شده است. هر جدول حدود 80 تا فیلد داره که تو هر سرچ، همه فیلدهای همه جدول های قبلی رو برمیگردونه.
@webazin.org90 :
ممنونم. من به جداول و روابط بینشون تسلط کامل دارم. مطمئنم که مشکلی توی تعریف کلیدها و ارتباطات جداول پروژم ندارم. اما نتونستم این پکیج رو جواب بگیرم. مجدد تست میکنم.
@davoodkhany :
ممنونم. یه کلک هم میشد زد که قطعا روش حرفه ای نیست اما جواب میده. اونم اینه که مثلا تو جدول Master کلید اصلی 4 جدول قبلی رو هم قرار داد. یعنی به جای اینکه هر جدول یه کلید خارجی داشته باشه، کلید خارجی تمام جدول های قبلی رو براش بزاریم. اینطور مثلا از جدول Master میشه مستقیم به جدول University دسترسی داشت. از نظر بحث افزونگی توی دیتابیس میدونم روش صحیحی نیست اما از اون همه کوئری های تودرتو که سیستم مجبوره اجرا کنه بهتره.


داود خانی
تخصص : برنامه نویس لاراول و متخصص سئو...
@davoodkhany 5 سال پیش مطرح شد
0

T.chegini
پس برید دیتا بیس رو از دوباره پیاده سازی کنید و پروژه رو از دوباره بیارید بالا منم کمکتون می کنم :)))))


T.chegini
@t.chegini 5 سال پیش مطرح شد
0

@davoodkhany
سخت ترین کار، تحلیل پروژه و ارتباط بین جداول بود که تا الان 32 تا جدول گذاشتم. اگر واقعا روشی پیدا کنم که کدنویسی ارتباطات چند به چند بین این جداول رو برام آسون کنه، حاضرم از اول پروژه رو بنویسم. فرم ها هم که همه آماده است. شما فقط یک روش حرفه ای پیشنهاد بده باقی حله.


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
2

بهینه بودن کوئری ها اولیت بیشتری داره نسبت به حجم داده برگشتی. در نهایت شمایید که باید داده برگشتی رو پیمایش کنید و موارد لازم رو نشون بدید یعنی سختیش برای توسعه دهنده هست و فشاری روی سرور نمیاره

راهی هم که گفتید که بین تمام جداول ارتباط مستقیم بوجود بیارید، گزینه بدی نیست فقط کمی شلوغ کاریش زیاد میشه. حالت های مختلف رو تست کنید و حتما از debugbar استفاده کنید


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

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