PDA

View Full Version : سوال: ایجاد ارتباط



lord_viper
پنج شنبه 10 تیر 1389, 22:40 عصر
با سلام
من یک جدول دارم که 2 فیلد نام-حقوق دارند و جدول دیگری هم دارم که این 2 فیلد رو دارن میخواهم این 2 جدول رو به هم مرتبط کنم که در صورت تغییر نام یا حقوق در جدول اول جدول دوم به طور خودکار update بشه

L_eskandary
پنج شنبه 10 تیر 1389, 23:41 عصر
سلام دوست عزیز . اینکه شما تو دو جدول متفاوت دو مقدار مشابه دارین خوب یه ذره نرمال نیست . ولی در مورد ارتباط این دو جدول اگه خیلی به این نوع طراحی اصرار دارین ، کافیه دو تا ارتباط بین این دو فیلد در دو جدول ایجاد کنین . حالا با رفتن به property‌هر یک از این جداول خاصیت Insert Update‌ rules اونا رو به cascade‌تغییر بدین . در این صورت هر تغییری تو هر یک از دو جدول ایجاد بشه به دیگری هم اعمال خواهد شد .‌

lord_viper
جمعه 11 تیر 1389, 07:54 صبح
من این ارتباط رو بوجود اوردم اولین ارتباط رو روی Update Cascade تنظیم کردم ولی وقتی دومینارتباط رو میخواستم رو UpdateCascadeبزارم موقع ذخیره شدن ارور may cause cycles or multiple cascade paths میداد که باعث شد تا ارتباط دوم نتونم Rule برای Updateیا Deleteتنظیم کنم
در این شرایط ایا مشکلی در Updateپیش میاد؟یا ارتیاط دوم هم به طور خودکار UpdateCascadeمیشه؟

L_eskandary
جمعه 11 تیر 1389, 21:54 عصر
سلام دوست عزیز
خوب مشکل به این خاطر هستش که شما فرض کنین یکی از جداولتون رو update‌کردین در این صورت به خاطر Cascade‌ طبیعتا جدول دوم update‌میشه و حالا نکته قابل توجه اینه که چون ارتباط جداول شما درست نیست همان طور که در تاپیک قبلی گفتم ، الان باز به خاطر همان مسئله cascade‌این اتفاق الان برا جدول اول رخ میده و به این ترتیب تو یه حلقه تا بینهایت update‌ادامه پیدا میکنه ...
و بخاطر همین امر هم sql‌جلوی این کار رو می گیره ..
موفق باشین

lord_viper
شنبه 12 تیر 1389, 19:12 عصر
و یه سوال دیگه
من یه جدول دارم که یه فیلد بنام اشخاص داره یه جدول دیگه دارم که 2 فیلد با نامها نام گیرنده و نام فرستنده داره 2 فیلد جدول دوم اطلاعات خودشونو از فیلد اشخاص میگیرن

چطور میتونم یک رابطه بین فیلد اشخاص و نام گیرنده-نام فرستنده بوجود بیارم تا موقع updateشدن فیلد اشخاص فیلدهای نام گیرنده-نام فرستنده هم به طور خودکار بروز بشن؟

با تشکر

L_eskandary
شنبه 12 تیر 1389, 22:44 عصر
یعنی هم فرستنده و هم گیرنده تو یه جدول هستن؟
متاسفم ولی باید بگم انگار بازم کارتون صحیح نیست ...
اگه من جای شما بودم ،برا گیرندگان و فرستندگان جداول جدا طراحی می کردم . و اما تو این جدول ها یه ID‌مثلا با عنوان ID-f‌ برا فرستنده تو جدول فرستنده و همین کار رو برای جدول گیرنده انجام می دادم و Id شخص رو هم از جدول اشخاص برا این دو تا جدول بعنوان کلید خارجی تعریف می کردم .
و حالا اگه فرض کنم که شما برا یه موسسه پست این database‌رو طراحی می کنید و کالایی قرار هست مبادله بشه ، یه جدول با عنوان مثلا بسته های ارسالی ایجاد کرده و تو این جدول id بسته و id فرستنده و گیرنده رو قرار بدین . البته بازم فراموش نکنین که update delete rules رو به cascade تنظیم کنین.
یه پیشنهاد هم دارم موقع طراحی پایگاه داده حتما به نرمال کردن جداول توجه کنین وگرنه بعدا موقع نوشتن query‌با مشکل مواجه میشین .
موفق باشین.:لبخندساده:

lord_viper
یک شنبه 13 تیر 1389, 13:28 عصر
پایگاه از قبل طراحی شده و برنامه مورد نظر هم بر روی همین پایگاه به همین صورت نوشته شده و الان دادنش دست من

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

محمد سلیم آبادی
یک شنبه 13 تیر 1389, 15:26 عصر
ساختار دقیق تمام جداولی که در پست اول و پست 5 به آنها اشاره کرده این را در اینجا قرار بدین. برای این منظور کافیه از آنها script تهیه کنید.
روی جدول راست کلیک کنید و script table را انتخاب کنید.

وقتی که گفته می شود از تریگر استفاده کنید یعنی اینکه referential integrity باید توسط trigger (روشها ی رویه ای) پیاده بشه و دیگه قید کلید خارجی توسط دستورات تعریفی (Declarative) ایجاد نمی شوند.

البته باید بگم که همانطوری که ماکروسافت داره میگه شما نمی توانید برای هر دو قید خاصیت cascade داشته باشین و با این کار سبب ایجاد multiple cascading paths شوید. هیچ راه حلی هم نداره! پس یا ناچارین ساختار جداولتان را تغییر بدین یا اینکه از تریگر به جای کلید خارجی استفاده کنید.

من فعلا ترجیه می دم ساختار جداول را تغییر بدم. با این کار نه مشکل cascade پیش میاد و نه اینکه نیاز به trigger داریم.