بهینه تر کردن کوئری ها به دیتابیس

سوال شده توسط: bzmind ‌

تاریخ ثبت: ۱۴۰۱/۰۳/۰۶

بازدید: 503

پاسخ: 10

تگ: Asp.net Core


سلام استاد اشرافی عزیز، خسته نباشید، استاد الان تو یه سایت فروشگاهی، وقتی طرف میاد یه محصول اضافه میکنه به سبدش، خب اینجا میایم سفارش رو واسش میسازیم، بعد طرف وقتی میاد مثلا تعداد اون آیتم رو زیاد میکنه، ما با هر کلیک باید بریم مثلا کنترلر IncreaseOrderItemCount رو صدا بزنیم، بعد این بره کوئری بزنه به دیتابیس، اول این سفارش رو بیاره، بعد inventory ئه اون آیتم رو هم بیاره، بعد ببینیم تو اینونتوری از این کالا چقد موجوده و اگر موجود داشتیم، تعداد اون آیتم رو یدونه زیاد کنه تو اون سفارش، خب الان طرف اگر چند بار هی کلیک کنه، ینی هی باید این کوئری ها برن و بیان دیگه درسته، خب این خیلی سنگینه فک کنم، چه راه دیگه ای وجود داره واسه بهینه تر کردن این کار؟ مثلا بار اول بره تعداد رو بیاره، بعد دیگه وقتی کلیک کردیم نره هی همون مقدار تکراری رو بیاره، یه همچین کاری مثلا …

پاسخ ها
user

محمد اشرافی

سلام سلامت باشید

خیلی حساس نشدید ، روال کار اینه نمیشه کاریش کرد  ، و اینکه این کارا خیلی سریع انجام میشه نمی خواد نگران باشید (من هم اوایل کار خیلی  از query زدن رو دیتابیس میترسیدم 🤣 ، اما در حقیقت نباید خیلی رو این موارد حساس شد وقتی لازمه کاری انجام بشه پس باید انجامش داد )

 حالا برای کم کردن فشار هم میتونید یه سری جاها که لازم باشه اطلاعات رو کش کنید 

user

bzmind ‌

درسته، منم کلا یه حس ترس دارم نسبت به این کوئری ها، بعد استاد، الان اگر بخوام کش انجام بدم، این لاجیک های خوندن و نوشتن توی کش کجا قرار میگیره؟ میره توی ریپوزیتوری؟ بعد راستی، میشه مثلا وقتی که مقدار موجودی اینونتوری تغییر کرد یه DomainEvent بفرستیم، بعد اون ایونت رو هندل که کردیم توش بنویسیم که بره مقدار موجودی داخل کش رو هم آپدیت کنه، همچین چیزی ممکنه؟ بدون اینکه اصول DDD و کلین آرکیتکچر رو بزاریم زیر پا، اینطوری دیگه همیشه اون مقدار موجودی اینونتوری داخل رَم میمونه درسته؟ این کار اشکالی هم داره؟ یعنی جنبه منفی ای داره؟

user

محمد اشرافی

توی فصل بعد درمورد کش صحبت میکنیم 

و اینکه بله می تونید ، ولی مقدار کش رو آپدیت نمی کنیم حذف اش میکنیم ( توی جاهای مختلف هم می تونید کش رو استفاده ، بستگی به خوتون داره) من بیشتر توی لایه facade انجامش میدم 

user

bzmind ‌

ممنون استاد،

بزارید از فرصت استفاده کنم و یه سوال فرعی دیگه هم بپرسم 🗿

استاد الان مثلا من توی یکی از ریپوزیتوری هام، نیاز دارم یه کوئری خاص بنویسم، یعنی میخوام یوزر رو همراه با سفارشش بگیرم بیارم، بعد این نیاز داره که یه نوع خاصی باشه، یعنی یه DTO باشه که هم یوزر باشه توش هم سفارش.

بعد الان باید چیکار کنم؟ باید توی لایه domain که ریپوزیتوری رو تعریف کردم، یه متد بزارم بعد نوع برگشتیش رو هم یه DTO بزارم؟ اصلا مجاز هست تو لایه domain، بیایم DTO بسازیم؟ فک کنم اشتباه باشه، نمیدونم…

در این شرایط چیکار کنم، ممنون

user

محمد اشرافی

اگر برای Query باشه ( یعنی قرار باشه یه چیزی به کاربر نمایش بدیم ) نباید این کار رو انجام بدین

ولی اگر برای انجام یه UseCase احتیاجش دارید باید توی DomainService تعریفش کنید ، مثلا توی یکی از متد های Order نیاز به یه سری اطلاعات کاربر دارید ، در این صورت توی IOrderDomainService یه متد مینویسید که اون اطلاعات رو به شما بده (dto شو هم توی همون Agg بسازید )

user

bzmind ‌

من اون کوئری رو داخل لایه application نیاز دارم، توی یکی از command های order، باز همین کاری که گفتید رو بکنم؟ ینی اون متد رو بزارم تو domain service و یه DTO هم تو لایه domain بسازم؟

user

محمد اشرافی

اگر توی لایه Application لازمش دارین ، خوب Repository مربوط به اون Entity رو inject کنید و اطلاعات رو ازش بگیرید

user

bzmind ‌

بله همین کار رو میخوام بکنم، ولی اون کوئری قراره یه انتیتی Order و یه Customer برگردونه، که میخوام 2 تاشو توی یه DTO جا بدم مثلا CustomerAndOrderDto، پس اون متُدِ ریپوزیتوری باید این dto رو برگردونه، و اینترفیس ریپوزیتوری هم توی لایه domain هست، پس ینی باید من این dto رو توی لایه domain بسازم، اینکار اشکالی نداره؟ ینی توی لایه domain ما dto داشته باشیم؟

user

bzmind ‌

بعد اینکه، استاد توی پروژه Api واسه سایت کتاب خوب، شما وقتی دیتابیس رو ساختید، بعدش چرا اومدید داخل یه مایگریشن رابطه بین جداول رو با SQL نوشتید و اجرا کردید؟ چرا رابطه ها رو داخل خود فایل های Configuration برای هر انتیتی ننوشتید؟ دلیلشو خلاصه گفتید ولی من درست متوجه نشدم، یکم توضیح بیشتر بدید خیلی ممنون میشم.

user

محمد اشرافی

اگر واقعا لازمه بسازیدش

----------------------------------------------------

توی Configuration نمی تونیم روی Entity هایی که OwnMany یا OwnOne  شده رابطه ایجاد کنیم Ef خطا میگیره

برای ثبت پاسخ باید خود شوید

محبوب ترین مقالات