Amir m
5 سال پیش توسط Amir m مطرح شد
10 پاسخ

پرفرمنس روابط در MongoDB

سلام.
از لحاظ ریلیشن ها مونگو به چه شکل عمل میکنه؟
البته خودش که نداره اما توی داکیومنت دو روش embedded و reference رو پیشنها داده
روش اول میگه بیا دایکومنت ها مرتبط رو تو همون دایکومنت سیو کن که هیچی، به دلایلی نمیتونم.
اما روش دوم میگه بیا مثلا object id از دایکومنت رو ذخیره کن. که خب هدف منه.

ساده سازی بخوام بکنم، فرض کنید من یه پست دارم (وبلاگ)
هر پست وبلاگ من بین یک کامنت تا 800 کامنت داره (به طور میانگین و اغلب بین 20 تا 150 کامنت)
در کل هم نزدیک 10 میلیون پست تو وبلاگ دارم.
بازدید روزانه سایت هم حدود 200 تا 600 هزار بازدیده.

و میخوام با یه کوئری کل کامنت های یه پست رو بگیرم.
حالا پرفرمنس چی میشه؟ چون مونگو رابطه ای نیست خیلی افتضاح نمیشه؟

Mysql چون یکم پیاده کردن دیتاببسم داخلش سخته میخوام فقط وقتی مجبور بشم استفاده کنم
چون اون کامنت ها یکم ساختار تو در تو دارن، یعنی یه کامنت میتونه مثلا یه عددی بین 1 تا سه نوع متن مختلف داخلش باشه، و مثلا پست A ممکنه با متن 1 از کامنت X در ارتباط باشه و پست B با متن 2 از کامنت X در ارتباط باشه.
شاید هم یه کامنت کلا یه متن داشته باشه فقط.
به خاطر همین که مشخص نیست یه کامنت، یه متن داره یا 2 متن یا 3 متن، مجبور میشم از مونگو استفاده کنم
@hesammousavi
@khanzadimahdi


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

سلام دوست عزیز
من خیلی به این روشی که می خوام بگم مطمئن نیستم ولی خودم توی یه موقعیت شبیه به شما از این روش استفاده کردم :
شما توی کالکشن مثلا posts برای هر داکیومنت یه ارایه تعریف میکنید مثلا به اسم comments بعد توی اون قرار نیست کل کامنت ها رو ذخیره کنید.
کاری که می کنید یک کالکشن دیگه به اسم comments هم تعریف می کنید و کامنت ها رو میزارید اونجا و توی ارایه comments که توی کالکشن posts هست فقط ایدی کامنت های مربوط به اون پست رو ذخیره می کنید و با یه لوپ می تونید همه کامنت ها رو بگیرید.
البته این موقعیت شما یه خورده با اونی که من داشتم فرق می کنه برا همین فکر نمی کنم روش درستی باشه چون تعداد کوئری ها خیلی زیاد میشه.

یه راه دیگه هم که به نظر من میرسه اینه که کلا حالت همون sql ذخیرش کنید یعنی هیچی امبدد نداشته باشید این وسط که البته من توی خود داکیومنتیشن MongoDB هم همین مورد رو دیدم که این روش رو پیشنهاد کرده بود
https://docs.mongodb.com/ecosystem/use-cases/storing-comments/
اینم لینکش
@proamirm

به نظر من روش دوم خیلی بهتره چون همونطور که خودتون گفتین تعداد کامنت هاتون خیلی زیاده و البته به نظر من اصلا اون چند هزار تا کامنت رو یکجا دریافت نکنید یعنی یا حالت pagination یا حالت infinite loader براش بزارید حتما


mahdi khanzadi
تخصص : Software engineer
@khanzadimahdi 5 سال پیش مطرح شد
0

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


Amir m
تخصص : برنامه نویس
@proamirm 5 سال پیش مطرح شد
0

@mamaliosezar
ممنون ازتون
روش اول رو که نه، خیلی کوئری میشه.
سایت مونگو رو الان دارم نگاه میکنم ببینم چی به چیه اما اون هم احتمالا میخواد روش embedded رو پیشنهاد بده.


Amir m
تخصص : برنامه نویس
@proamirm 5 سال پیش مطرح شد
0

@khanzadimahdi
ممنون ازتون، احتمالا باید از همون sql استفاده کنم چاره ای نیست. اما خیلی پیاده سازیش واسم سخته به دلیلی که تو پست اول گفتم شاید ممکن نباشه.

اون قسمتی که گفتید استفاده کردن از مونگو برای کارهای رابطه ای به معنی اینه که به زور میخوای یه وظیفه ای که مرتبط با مونگو نیست رو بهش بدی تا برات انجام بده و بازده پایینی خواهد داشت. خب، پس مونگو به چه درد میخوره.
چون فکر نمیکنم پروژه ای باشه که توش حداقل یه رابطه کوچیک نباشه (یه وبلاگ، یه فروشگاه اینترنتی یا...)
پس عملا مونگو و همه دیتابیس های nosql یه دیتابیس بی کاربرد هستن که فقط به درد ذخیره کردن log میخورن!


Reza Jashnsaz
تخصص : مهندس نرم افزار
@rezajashnsaz0011 5 سال پیش مطرح شد
0

@proamirm
ببین کاربرد اصلی nosql تو سیستم چت و این مدلی هست .. بطور مثال شما یه فروشگاه داری که میخوای یه بخش چت بین خریدار و فروشنده بذاری .. خب nodejs در کنار mongodb اینجاها عالی عمل میکنه
یا یه سایت خرید و فروش مث esam و divar که میخوای بخش چت بذاری توش ... میای کل سایت رو بطور مثال با laravel mysql میزنی بعد اون بخش چت رو با nodejs mongodb


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

@proamirm
فکر می کنم روش دومی که گفتم و توی سایت مونگو هم بود بتونه کمکتون کنه
https://docs.mongodb.com/ecosystem/use-cases/storing-comments/one-document-per-comment
این رو بخونید.
نوشته که One Document Per Comment
یعنی برای هر کامنت یک داکیومنت تعریف کرده و یک فیلد discussion_id هم داره که مربوط میشه به اون بحثی که کامنت براش گذاشته شده.
این توضیح رو هم برای اون فیلد داده
the discussion_id field that references the discussion parent


Amir m
تخصص : برنامه نویس
@proamirm 5 سال پیش مطرح شد
0

@rezajashnsaz0011
بله فکر میکنم واسه منم مناسب نباشه مونگو اما این که ساختار نداره خیلی کار رو راحت میکنه.
خیلی دیتابیس عالی میشد اگه روابط توش قدرتمند میشد.

@mamaliosezar
بله درسته؛ من روش پیاده سازی رو بلدم. بحثم سر پرفرمنسه که فکر میکنم مونگو کم بیاره وقتی رابطه میاد تو کار.


mahdi khanzadi
تخصص : Software engineer
@khanzadimahdi 5 سال پیش مطرح شد
0

@proamirm

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


میسانو
تخصص : تازه کار
@mir.sobhan.n 3 سال پیش مطرح شد
0

یه موردی هم هست
دیتابیس مونگو داکیومنشن هست دیگه
وقتی همچین فرمتی داره ( که میشه تو در تو کار کرد )
شما میتونی موجودیت های مختلفی رو به جای اینکه کلی مجموعه جدا بسازید توی یک مجموعه ایجاد کنید

برای همین میشه خیلی از رلیشن ها دوری کرد توش


محمد حیدری
تخصص : برنامه نویس فول استک جاوااسکری...
@pezhmanheidaryrostamy1373 3 سال پیش مطرح شد
1

با سلام .
بنده با دیتا بیس مونگو تجربه کار زیادی دارم . و به شما تضمین میدم.که خیلی خوب از پس پروژه که گفتید برمیاد.و نتنها افتضاح نمیشه بلکه تا حد زیادی با دیتاهایی کمتر حتی با برقراری رابطه پرفورمنس بهتری میگیرید.(دیتابیس ها را دست کم نگیریم :) )


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

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