Mohammad Jawad Barati
Mohammad Jawad Barati
خواندن ۲ دقیقه·۴ سال پیش

مشکل n + 1 توی دیتابیس

https://www.sharpecho.com/microservices-and-the-n1-problem/
https://www.sharpecho.com/microservices-and-the-n1-problem/

این مشکل زمانی رخ میده که 1 کوئری برای کشیدن دیتا از جدول اصلی و N تا کوئری برای کشیدن دیتا های مرتبط (از جداول دیگه) داریم.

برای دریافت اطلاعات از دیتابیس دو روش داریم Lazy loading و Eager loading

توی روش اول میایم یه دیتا رو میگریم و بعدا اگه لازم شد میایم دیتا های مرتبط با اون رو هم میگریم.

توی روش دوم میایم یه دیتا رو به همراه دیتا هایی که با اون دیتا relation داره رو میگریم.

مشکلی که در حقیقت مشکل نیست. بلکه وقتی تعداد یوزرای سایت زیاد میشه خودش رو نشون میده. معنی n + 1 رو تو این حالت بهتون توضیح میدم که شما بجای یه کوئری به دیتابیس برای CRUD مورد نیازت چند تا ریکوئست میزنی.

فرض کنید که شما تو یه وبلاگ میخوای پست رو به همراه تمام تگ هاش و دسته بندی هاش به کاربر نمایش بدی، چکار میکنی؟ Lazy loading یا Eager loading. چیزی که مشخصه اینه که شما اگه بخوای Lazy loading بکنی باید ۳ تا ریکوئست بزنی تا پست ها، دسته بندی ها و تگ های اون پست رو از دیتابیس بگیری. و این عملیات IO خیلی وحشتناک خودش رو تو یه چیزی مثل فیس بوک خودش رو بخوبی نمایش میده.

کامنت های تو در تو

در این حالت روی پست کامنت گذاشته می شود و روی کامنت هم کامنت گذاشته می شود. برای دریافت تمام کامنت ها می توان گفت تمام کامنت هایی را بده که برای پست X هستند و بعد از آن تمام reply هایی را که هر پست خورده است به صورت جداگانی دریافت کرد.

ولی راه بهتر این است که در همان لحظه دریافت کامنت ها تمام کامنت هایی را برای این پست است دریافت کرد و بعد از آن تمام reply ها را هم دریافت کرد


البته همین مسئله توی میکروسرویس خودش رو یجور دیگه نشون میدهد. اون جا جداول دیگه یکی نیستن و شما نمی تونید join بزنید. پس راه حل چیه؟ آیا باید به هر API یه ریکوئست زد و بعدش جواب ها رو بر اساس چیزی که خودت میخوای یک بکنی.

روش دیگه پترن Command Query Responsibility Segregation (CQRS) هست. توی این روش دیتا کشیده میشه و بعدش به صورت read only توی سرویس های مورد نظر اون رو propagate می کنیم. هنوز این بخش کامل نشده است

یه پست از یه دوست در مورد N + 1 problem

یه پست توی سکان آکادمی

رفرنس

n 1 problemnodejsdatabasearchitectureanti patterns
برنانه نویس، مدرس، محقق. عاشق انیمه هستم و دنبال چالش ها جدید.
شاید از این پست‌ها خوشتان بیاید