PDA

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



majid_darab
دوشنبه 05 بهمن 1388, 22:34 عصر
با سلام و عرض خسته نباشید خدمت شما هموطنان گرامی :
فرض بفرمایید سه تا Table داریم که Table اوّل با Table دوم در ارتباط است و Table دوم با Table سوم

با یک Inner Join در select all مربوط به Table اول می توان به فیلدهای Table دوم دسترسی داشت ...
حال آیا همین جا در Select All مربوط به Table اول می شود به فیلدهای Table سوم نیز دسترسی پیدا کرد؟چگونه؟
با تشکر

محمد سلیم آبادی
سه شنبه 06 بهمن 1388, 00:45 صبح
سلام،
اگر درست منظورتون را متوجه شدم شما سه جدول دارید که جدول دوم به عنوان اتصال دهنده (Junction table) عمل می کند که با دو جدول اول و سوم ارتبط 1 به N دارد.

ببینید دستور select بطور پیشفرض تمام سطرها ازجمله سطرها با داده های تکراری را نیز بازیابی می کند یعنی select بدون distinct معادل select all است. حالا منظور شما هم از بکار بردن select all همین است؟

بدلیل اینکه هیچ رابطه ای نمی توان بین دو جدول اول و سوم بدست آورم طبعا نمی توان اتصالی بوجود آورد در نتیجه برای اتصال دو جدول اول و سوم باید از جدول واسط استفاده شود.

majid_darab
سه شنبه 06 بهمن 1388, 05:59 صبح
سلام ...
ببخشید منظورمو واضح بیان نکردم - شما حق دارید...

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

منظورم از select all یعنی select ی که توش همه ی فیلدهای جداول مربوطه نوشته شده شده باشند ...
به مثال زیر توجه فرمایید:
جدول a
id
b_id
DateOfAct

جدول b
id
c_id
UserName
FamilyName

جدول c
id
b_id
personelName

من اینجا جداولو خیلی خلاصه نوشتم و فیلدهای اضافی رو حذف کردم
حالا می خوام select ی داشته باشم که تمام فیلدهای 3 جدولو نشون بده (با ارتباط بیان شده)....
آیا شدنی است ؟(بدون تغییر در ساختار جداول)
select مزبور تا نیمه ی را ه اینطوری میشه :
select
a.[DateOfAct]
b.[UserName]
b.[FamilyName]
form a
inner join b on
a.[b_id]
=
b.[id]

حالا چه جوری شماره پرسنلی شخص مربوطه هم تو select بالا آورده شود.؟
من معمولا ار sp ها استفاده می کنم ...
آیا می شود sp ی داشت که دو select و یک جدول به عنوان خروجی داشته باشه ؟یعنی id جدول b رو از select اول بگیریم و به عنوان پارامتر به select دوم پاس بدیم تا شماره پرسنلی طرف در بیاد و نتیجه ی select اول و دوم رو تو یه جدول داشته باشیم...
اسم sp هم می ذاریم select all
با تشکر از همیاری شما دوستان عزیز و محترم

majid_darab
سه شنبه 06 بهمن 1388, 20:26 عصر
آیا مطالب عنوان شده کفایت می کنند؟
باتشکر

محمد سلیم آبادی
سه شنبه 06 بهمن 1388, 22:16 عصر
رابطه ی بین جداولتان منطقی به نظر نمیرسد.
چرا باید جدول b به جدول c ارجاعی داشته باشد؟ و دوباره جدول c به جدول b ؟
مطمئنا زمان فعالیت، مربوط به پرسنل می شود نه به مشخصات فردی. یعنی اگر ارجاع در جدول a به جدول c داده شود کار درست میشود. البته قضاوت درست زمانی اتفاق خواهد افتاد که به محیط عملیاتی شما پی برده و DDL جداول را پست کرده باشید.

اگر جداول استاندارد و صحیح طراحی شده باشند کافیست سه جدول با یکدیگر join شوند.

majid_darab
چهارشنبه 07 بهمن 1388, 01:55 صبح
با سلام:
جدول a مخصوص نوع فعالیت کاربران (UsersAct)می باشد
جدول b مخصوص این می باشد که آیا پرسنل یک شرکت دارای مشخصات لاگین هستند یاخیر(Users)
جدول c مخصوص پرسنل شرکت می باشد(personel)
جدول b با c ارتباط دارد چون می خوام علاوه بر مشخصات لاگین نیز شماره پرسنلی طرف هم درج شود
جدول c با b ارتباط دارد چون می خوام علاوه بر مشخصات پرسنلی نام کاربری فرد مزبور که مربوط به لاگین او می باشد درج گردد
برای این مهم در جدول پرسنل یک رکورد خالی دارم مخصوص مشخصات لاگینی که مشخصات پرسنلی ندارن ودر جدول users نیز یک رکورد خالی وجود دارد مخصوص پرسنلی که مشخصات لاگین ندارند

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

محمد سلیم آبادی
چهارشنبه 07 بهمن 1388, 12:11 عصر
از آنجایی که هر پرسنل یک لاگین دارد و دوباره هر لاگین مخصوص یک پرسنل است باید بین این دو جدول یک ارتباط یک به یک وجود داشته باشد. یعنی دو ستون id دو جدول b و c به همدیگر link شوند. پس نیاز است که دو قید موجود در دو جدول b و c تبدیل به یک قید شود.

و اگر ممکن باشد هر پرسنل چند لاگین داشته و هر لاگین مخصوص چند نفر باشد در این صورت باید یک جدول واسط برای این دو جدول b و c طراحی شود.

majid_darab
چهارشنبه 07 بهمن 1388, 16:57 عصر
از آنجایی که هر پرسنل یک لاگین دارد و دوباره هر لاگین مخصوص یک پرسنل است باید بین این دو جدول یک ارتباط یک به یک وجود داشته باشد. یعنی دو ستون id دو جدول b و c به همدیگر link شوند. پس نیاز است که دو قید موجود در دو جدول b و c تبدیل به یک قید شود.

و اگر ممکن باشد هر پرسنل چند لاگین داشته و هر لاگین مخصوص چند نفر باشد در این صورت باید یک جدول واسط برای این دو جدول b و c طراحی شود.

با سلام وعرض تشکر فراوان
من primary key های جداول b,c را به عنوان foreign key های دو جدول انتخاب کرده بودم که ازطریق یک جدول بتونم به اطلاعات جدول دیگه دسترسی داشته باشم
پرواضح است که ارتباط این دوجدول باید یک به یک باشد (چه از b به c و چه از c به b)
چون با ms sql server 2008 کار میکنم میشه راهنمایی بفرمایید که این ارتباط یک به یک توسط این دو جدول چگونه پیاده سازی می شود ؟
یعنی دو ستون id دو جدول b و c به همدیگر link شوند. پس نیاز است که دو قید موجود در دو جدول b و c تبدیل به یک قید شود.
درقسمت Relationship یک جدول فقط میشه primary key, foregn key روتعیین کرد و کجا باید تعیین کنم که این ارتباط یک به یک است؟
اگر مقدور است راهنمایی بفرمایید ساختار این سه جدول باید چه جوری بشه و اون sp_select all نیز چگونه خواهد بود؟
باتشکر

محمد سلیم آبادی
چهارشنبه 07 بهمن 1388, 21:30 عصر
برای ساخت قید کلید خارجی از طریق Diagram/Wizard باید مشخص کنید که داده ها اول در کدام از جدول b و c درج می شوند یعنی اول مشخصات پرسنل را درج می کنید یا لاگین. سپس ستون کلید جدولی که اول داده در آن درج می شود را Drag and Drop کنید روی ستون کلید جدول دوم.

در ارتباط یک به یک کلید اصلی دو جدول به هم متصل می شوند و به هر حال باید یکی به عنوان کلید اصلی و یکی به عنوان کلید خارجی در نظر گرفته شود.

راجب select: اگر اشتباه نکرده باشم شما دنبال join چنتایی (multiple joins) می گردین:


select *
from a
join b on a.b_id = b.id
join c on b.id = c.id

majid_darab
پنج شنبه 08 بهمن 1388, 02:51 صبح
حقیقتا دستتون درد نکنه
شما با صبر و حوصله ی کامل این تاپیکو رو دنبال کردید و پاسخگوی سوالات من شدید
با تشکر فراوان
من گیرم سر inner join برطرف شد و فکر نمی کردم اینطوری هم بشه join زد
اما درمورد پیاده سازی ارتباط یک به یک نحوه ی دسترسی به diagram/wizard برام مشخص نشد
تو sql sever 2008 قاطی فلدر های Database یک پوشه به نام database diagram وجود داره که اونجا پس از افزودن table های مزبور میشه عمل درگ اند درپو انجام داد و کلید خارجی درست کرد اما اینجا ظاهرا مثل access نیست که یک ستون خاصو به یک ستون خاص دیگه نسبت بدی و براش مهم نیست کدوم ستونی به کدوم ستون نسبت دادی ...
ظاهرا در sql server 2008 فقط ارتباط یک به چند داریمو بس ...
فعلن تا حدودی مشکلم حل شده ، فقط تو ورود اطلاعات باید مواظب باشم که اگه می شد ارتباطو یک به یک کرد این مشکلم حل میی شد.
همیشه شادو پیروز باشید

majid_darab
پنج شنبه 08 بهمن 1388, 03:37 صبح
حقیقتا دستتون درد نکنه
شما با صبر و حوصله ی کامل این تاپیکو رو دنبال کردید و پاسخگوی سوالات من شدید...
با تشکر فراوان
من گیرم سر inner join برطرف شد و فکر نمی کردم اینطوری هم بشه join زد
اما درمورد پیاده سازی ارتباط یک به یک نحوه ی دسترسی به diagram/wizard برام مشخص نشد
تو sql sever 2008 قاطی فلدر های Database یک پوشه به نام database diagram وجود داره که اونجا پس از افزودن table های مزبور میشه عمل درگ اند درپو انجام داد و کلید خارجی درست کرد اما اینجا ظاهرا مثل access نیست که یک ستون خاصو به یک ستون خاص دیگه نسبت بدی و براش مهم نیست کدوم ستون رو به کدوم ستون نسبت دادی ...
ظاهرا در sql server 2008 فقط ارتباط یک به چند داریمو بس ...
فعلن تا حدودی مشکلم حل شده ، فقط تو ورود اطلاعات باید مواظب باشم ...
که اگه می شد ارتباطو یک به یک کرد این مشکل هم حل می شد.
همیشه شادو پیروز باشید

محمد سلیم آبادی
پنج شنبه 08 بهمن 1388, 06:21 صبح
با فرض اینکه کلید اصلی این ارتباط داخل جدول پرسنل (c) باشد و کلید خارجی در جدول (لاگین) با اجراء کد زیر قید ساخته می شود:


alter table b
add constraint fk_id_0001
foreign key (id)
references c(id)

majid_darab
شنبه 10 بهمن 1388, 08:06 صبح
در مورد ارتباط یک به یک راهی به نظرتون می رسه؟
باتشکر

majid_darab
یک شنبه 11 بهمن 1388, 14:44 عصر
با سلام و خسته نباشید
در مورد برقراری ارتباط یک به یک در sql server 2008 میشه توضیح کامل تری مرقوم فرمایید
با تشکر