×

رابطه Many To Many در SQL Server

فصل دوازدهم :

رابطه Many To Many

دوباره به دیتابیس pubs باز میگردیم .
به ارتباط بین دو جدول نویسندگان authors و Titles دقت کنید. منطقا یک نویسنده می تواند بین یک تا بی نهایت عنوان کتاب بنویسد. علاوه بر ان یک عنوان کتاب هم می تواند بیش از یک نویسهده داشته باشد یعنی بین 1 تا بینهایت نویسنده. پس به یک رابطه بی نهایت به بی نهایت یا (many to many) رسیدیم . سوال این است که چگونه بتوانیم لیست نویسندگان و کتابهایشان را داشته باشیم. جواب اینست که نمی توانیم. ارتباط ما همانند مثال کلاس درس و شاکردان 1 به بی نهایت نیست.در آنجا یک کلاس داشتیم و بین 1 تا بی نهایت شاگرد می توانستند در آن قرار گیرند. در اینجا بینهایت کتاب داریم و بی نهایت نویسند. برای مدیریت ساختار های نظیر این مشکل جدولی ساخته می شود که بعنوان رابط بین دو جدول که ارتباط (many to many) دارند بکار میرود. به این جدول Bridgeو یا junction Table می گویند . پلی که ارتباط (many to many) را میشکند و اتصال صحیح را بر قرار میسازد این جدول شامل فیلد های مشترک بین دو جدول خواهد بود. به جدول titleauthor دقت کنید.در هر رکورد ان کلید اصلی نویسنده و کلید اصلی عنوان کتاب وجود دارد.اگر کتابی داشته باشیم که دو نویسنده دارد بازای ان 2 رکورد در این جدول درج میگردد . در هر دو کلید اصلی ان عنوان کتاب یکی خواهد بود ولی هر کدام کلید اصلی یک نویسنده دخیل در کتاب را در خود جا میدهد.
دقت کنید که یک کلید اصلی مرکب از این دو فیلد در این جدول وجود دارد.که هم عدم ورود اطلاعات تکراری را تضمین میکند و هم یک cluster index بروی آن وجود دارد که نتیجتا سرعت query کوئری ها را بسیار بالا میبرد.

ادامه مثالهای select
9 . لیست نام و نام خانوادگی نویسندگان و عنوان کتابی که نوشته اند را نمایش دهید. SELECT au_lname,au_fname,title
FROM authors
inner join titleauthor
ON authors.au_id = titleauthor.au_id
inner join Titles
ON titleauthor.title_id = Titles.title_id

نکات : استفاده از alias جهت جلوگیری از تایپ چند باره نام جداول
SELECT au_lname,au_fname,title
FROM authors as a
inner join titleauthor as t
ON a.au_id = t.au_id
inner join Titles as t1
ON t.title_id = t1.title_id

براحتی بین 3 جدول ارتباط برقرار کردیم.
دقت کنید بسادگی فیلد های مشترک جداول در عبارت on درج میشوند
با استفاده از فیلد های مشترک جدول نویسندگان (authors) را به جدول titleauthor و این جدول را به جدول عناوین کتابها titles متصل کردیم. پس در لیست ستونهایی که می خواهیم نمایش داده شوند فیلد هایی از هر کدام از این جداول را می توانیم درج نماییم.
نکته : دقت کنید هنگامی که دو جدول در join دارای فیلد های هم نام هستند اس کیو ال سرور پیام خطایی را نمایش میدهد .
Ambiguous column
یعنی ستون مبهم . چون هر دو جدول دارای فیلدی به این نام هستند اس کیو ال سرور نمی داند این فیلد به کدام جدول اختصاص دارد. بنابراین در این شرایط نام جدول را قبل از نام فیلد درج کرده و بین آنها یک “.” نقطه می گذاریم .

سلکتی بنویسید که نام و نام خانوادگی یک نویسنده بهمراه نام ناشر وی نمایش داده شود
SELECT au_lname,au_fname,pub_name
FROM authors as a inner join titleauthor as t
ON a.au_id = t.au_id
inner join Titles as t١
ON t.title_id = t١.title_id
inner join publishers as p
ON p.pub_id = t١.pub_id



مفاهیم و موضوعات این فصل عبارتند از :

  • رابطه Many To Many

  • Bridge یا Junction Table

vatantop
نظرات و سوالات درج سوال/ نظر