PDA

View Full Version : تقاضای کمک برای عدم delete و یا update بصورت آبشاری (cascade)



sajad_3dmax
دوشنبه 03 آذر 1393, 11:10 صبح
با سلام خدمت تمامی دوستان عزیز
بنده نرم افزاری طراحی کردم که کد نویسیش رو با C# انجام دادم. بانک اطلاعاتیش دو تا مشکل داره.البته این معضل رو اینجا مطرح کردم چون بنظرم اومد حداقل یکیش از طریق کد نویسی حل بشه.
1- تو ارتباطات جداول نمیخوام حذف بصورت cascade باشه چون بنظرم غیر منطقیه. لزومی نداره که اگه مثلا کاربری حذف شد تمام سوابق کاریش حذف بشه. منتها اگه تو خواص ارتباطات بیام delete رو برابر no action قرار بدم موقع حذف کردن اطلاعات جدولی که کلید اصلی داره اگه این کلید تو جدول دیگه ای بکار برده شده باشه(بعنوان کلید خارجی )exeption رخ میده که conflict رخ داده که البته اگه بجای no action گزینه cascade رو انتخاب کنم مشکل conflict حل میشه. اما من میخوام تنظیم روی no action باشه و نه update. به همون دلیلی که توضیح دادم.که حتی خود همین update باعث معضل دیگه ای تو ارتباطات بانک میشه به نام cycle که مشکل دوم منه. چطور باید این گزینه no action رو بکار ببرم.
2- دوم اینکه بعضی ارتباطات باعث ایجاد cycle میشوند. چرا؟
مثلا من جدول کاربران رو دارم به اسم users. تو باقی جداولم (tbl_1,tbl_2,...) هم یه فیلدی گذاشتم بعنوان کاربر ثبت کننده که هر اطلاعاتی که ثبت بشه نام کاربر هم ثبت بشه.اگه تنظیم delete بصورت cascade باشه در تمام ارتباطات Cascade رخ میده. چرا؟ مشکل از کجاست؟

Mani_rf
دوشنبه 03 آذر 1393, 11:19 صبح
حذف کردن در دیتابیس یک عمل تقریبا بی معنی است. اگر میخواهید اطلاعاتی در دسترس نباشند باید آنها را با فلگ مشخص کنید نه این که حذف کنید.
برای مثل یک فیلد به اسم IsDeleted اضافه می کنید و موقع حذف شدن مقدار آن ر True می کنید و اطلاعات حذف شده را نمایش نمی دهید.

sajad_3dmax
دوشنبه 03 آذر 1393, 11:24 صبح
بله دوست عزیز بنده هم مشکلم همینه. میخوام وقتی از جدول اصلی اطلاعاتی حذف شد تو جداول دیگه که باهاش لینک هستند اطلاعات پاک نشه.
البته اینکه اطلاعات در کل هیچوقت پاک نشند به نظر بنده صحیح نیست. چون حجم بانک فوق العاده بالا میره.

sajadsobh
دوشنبه 03 آذر 1393, 15:42 عصر
منم با Mani_rf (http://barnamenevis.org/member.php?81144-Mani_rf) موافقم. تقریباً با چندتا پورتال که کار کردم همه به همین صورت پیکربندی شدند.
هیچ رکوردی حذف نمیشه فقط وضعیتش در جدول تغییر میکنه. برای مثال (ثبت موقت، ثبت دایم، ابطال شده، اصلاح شده) همه اینها یا باید بصورت flag باشند یا اینکه یه فیلد باشه که وضعیت رکورد رو مشخص کنه.

sajad_3dmax
سه شنبه 04 آذر 1393, 19:05 عصر
باسلام مجدد
پس با این تفاصیل باید موقع ثبت کردن یکبار هم چک کنم اگه اطلاعاتم از قبل ثبت شده بود فقط فلگ isDeleted رو از true به False تغییرش بدم. درسته؟

RIG000
سه شنبه 04 آذر 1393, 21:34 عصر
حذف کردن در دیتابیس یک عمل تقریبا بی معنی است. اگر میخواهید اطلاعاتی در دسترس نباشند باید آنها را با فلگ مشخص کنید نه این که حذف کنید.
برای مثل یک فیلد به اسم IsDeleted اضافه می کنید و موقع حذف شدن مقدار آن ر True می کنید و اطلاعات حذف شده را نمایش نمی دهید.

یعینی عملا در هر بار لود اطلاعات این idelete چک میشه تا اینکه اگه true بود اطلاعات نمایش در نیاد؟ ایا این روش درست در کل ساخت هر پروژه بزرگ و کوچک هستش؟؟؟
میخام یکی منو مطمن کنه

sajadsobh
سه شنبه 04 آذر 1393, 22:07 عصر
باسلام مجدد
پس با این تفاصیل باید موقع ثبت کردن یکبار هم چک کنم اگه اطلاعاتم از قبل ثبت شده بود فقط فلگ isDeleted رو از true به False تغییرش بدم. درسته؟

اگه از قبل بود؟! بله اگه چیزهای کوچیک باشه آره. (برای مثال گروه محصولات) چک کنه اگه توی کل دیتابیس بود دیگه دوباره رکوردی اضافه نشه فقط فعالش کنه.

sajadsobh
سه شنبه 04 آذر 1393, 22:09 عصر
یعینی عملا در هر بار لود اطلاعات این idelete چک میشه تا اینکه اگه true بود اطلاعات نمایش در نیاد؟ ایا این روش درست در کل ساخت هر پروژه بزرگ و کوچک هستش؟؟؟
میخام یکی منو مطمن کنه

فکر کنم آره، فقط یه شرط واسه فیلد موردنظر میذاری تا اون چیزی که ثبت شده و باطل نشده رو نشون بده.
بازم اگه از دوستان کسی هست تجربه کاری بیشتری دارن نظر بدن ممنون میشیم.