PDA

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



sasanazizi
سه شنبه 15 مرداد 1387, 08:39 صبح
سلام به اساتید
میخواستم بدونم که ارتباط بین جدول Actor و جدول Film یک رابطه چند به چند است
ارتباط یک به چند یا ارتباط چند به چند

ممنون

DotNet_King
سه شنبه 15 مرداد 1387, 09:31 صبح
چند به چنده.
مثلا یه فیلم رو در نظر بگیر حداقل ده تا هنرپیشه داره پس هر فیلم لا اقل با ده تا سطر از جدول هنرپیشه در ارتباطه
از اون طرف هر هنرپیشه ای هم شاید چندین فیلم بازی کرده باشه. پس این هم همچین ارتباطی رو داره با جدول فیلم ها پس چند به چنده


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

مثلا این کار درسته
فیلد ای دی هنرپیشه رو تو جدول هنرپیشه رفرنس بدیم به آی دی فیلم
فیلد آی دی فیلم رو از جدول فیلم ها رو هم اینطور با ایندکس رفرنس بدیم بدیم به جدول هنرپیشه ها

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




CREATE TABLE [dbo].[actor_table] (
[actor_id] [int] NOT NULL Foreign KEY REFERENCES Film_Table(Film_id) ,
[actor_name] [char] (15) COLLATE Arabic_CI_AS ,
[other_information] [char] (15) COLLATE Arabic_CI_AS NULL

)
GO
insert actor_table values (421,'mohammadReza Golzar','xx')
insert actor_table values (321,'bahram Radan','xx')
insert actor_table values (221,'brad pit','xx')
insert actor_table values (422,'anjelina joly','xx')
insert actor_table values (452,'jim karry','xx')
insert actor_table values (444,'camron diaz','xx')
Go
CREATE TABLE [dbo].[Film_Table] (
[Film_id] [int] NOT NULL Foreign KEY REFERENCES actor_table(actor_id) ,
[actor_id] [int] Not Null,
[film_name] [varchar] (70) Not Null

)
GO
Insert Film_Table values (10002,421,'Film1')
Insert Film_Table values (10002,321,'Film1')
Insert Film_Table values (10002,221,'Film1')
Insert Film_Table values (10002,121,'Film1')
Insert Film_Table values (10007,421,'Film2')
Insert Film_Table values (10007,422,'Film2')
Insert Film_Table values (10007,444,'Film2')
Insert Film_Table values (10007,452,'Film2')
Go

sasanazizi
سه شنبه 15 مرداد 1387, 11:42 صبح
مرسی دوست عزیز
من یک مقاله از تو اینترنت ÷یدا کردم مشکلم حل شد اینجا میزارم تا بقیه هم بتونند ازش استفاده کنند

amin_alexi
سه شنبه 15 مرداد 1387, 12:16 عصر
در این مواقع رابطه n به n به دو دو رابطه 1 به n تبدیل میشه ...
یعنی یک جدول باید به این دو جدول اظافه بشه مثلا یک جدول به اسم "نقش" که کلید اصلی اون میتونه ترکیب کلید اصلی دو جدول باشه !
ولی حتما باید کد بازیگر و کد فیلم در این جدول بیاد و یه فیلد دیگه به اسم نقش ... (و چون احتمال داره هر نفر در یک فیلم چند نقش بازی کنه ترکیب 3 فیلد میشه کلید اصلی)

DotNet_King
سه شنبه 15 مرداد 1387, 21:10 عصر
در این مواقع رابطه n به n به دو دو رابطه 1 به n تبدیل میشه ...
یعنی یک جدول باید به این دو جدول اظافه بشه مثلا یک جدول به اسم "نقش" که کلید اصلی اون میتونه ترکیب کلید اصلی دو جدول باشه !
ولی حتما باید کد بازیگر و کد فیلم در این جدول بیاد و یه فیلد دیگه به اسم نقش ... (و چون احتمال داره هر نفر در یک فیلم چند نقش بازی کنه ترکیب 3 فیلد میشه کلید اصلی)

دوست عزیز

اگه ممکنه کد TSQL مناسب برای این موضوع رو اینجا بزارید تا افراد مبتدی مثه من گیج نشند:ناراحت:
برام مهمه بدونم این مدل بانک رو به چه صورتی میشه به بهترین نحو ممکن ایندکس دهی کرد.
ممنون

amin_alexi
چهارشنبه 16 مرداد 1387, 09:15 صبح
حالا پرا TSQL به راحتی برو و 3 تا جدول رو بساز ...
اگه تو فیلدهایی که باید هر جدول داشته باشه ابهامی داری بگو ...

DotNet_King
چهارشنبه 16 مرداد 1387, 11:02 صبح
حالا پرا TSQL به راحتی برو و 3 تا جدول رو بساز ...
اگه تو فیلدهایی که باید هر جدول داشته باشه ابهامی داری بگو ...


دوست عزیز
مشکل من تو ایندکس گذاری صحیحه ! نمی فهمم منظورتون چیه از ساختن سه جدول!
جدوال را فرض کنید ساختم حالا ارتباطات و ایندکس ها رو به چه صورت باید تعریف کرد که اصولی باشه ...:متفکر:

amin_alexi
چهارشنبه 16 مرداد 1387, 13:11 عصر
اگه از ارتباط منظورت کلید اصلی و خارجیه ... که قبلا اشاره کردم ... بازم میگم ...
جدول Film یه کلید اصلی به نام FilmCode
جدولActor یه کلید اصلی به نام ActorCode
جدول Naghsh یک کلید ترکیبی داره (نه لزوما ... که میشه خودی یک کلید AutoNumber بزاری)
این ترکیب شامل FilmCode,ActorCode,NaghshName که این 3 فیلد فیلدهای جدول Naghsh هستند و 2 فیلد FilmCode,ActorCode کلید خارجی که به ترتیب با جدول Film,Actor رابطه 1 به N دارند ...

تا اینجا اگه مشلی نیست بگو تا بریم سر اندکسها با هم بحث کنیم !!!

DotNet_King
پنج شنبه 17 مرداد 1387, 13:17 عصر
اگه از ارتباط منظورت کلید اصلی و خارجیه ... که قبلا اشاره کردم ... بازم میگم ...
جدول Film یه کلید اصلی به نام FilmCode
جدولActor یه کلید اصلی به نام ActorCode
جدول Naghsh یک کلید ترکیبی داره (نه لزوما ... که میشه خودی یک کلید AutoNumber بزاری)
این ترکیب شامل FilmCode,ActorCode,NaghshName که این 3 فیلد فیلدهای جدول Naghsh هستند و 2 فیلد FilmCode,ActorCode کلید خارجی که به ترتیب با جدول Film,Actor رابطه 1 به N دارند ...

تا اینجا اگه مشلی نیست بگو تا بریم سر اندکسها با هم بحث کنیم !!!



امین عزیز
ممنون از لطفت. من تو تعریف جداولم اشتباه بدی کرده بودم! حق با شماست 3 تاست نه دو تا :خجالت:

من کار خودم اصلاح کردم

حالا طبق فرمایشات شما ، دو تا کلید اصلی رو گذاشتم و همچنین دو تا خارجی رو با این کد tsql



alter table [dbo].[Film_Cast]
add CONSTRAINT Fk_NEW_Relate
Foreign key (actor_id) references actor_table (actor_id)
GO
alter table [dbo].[Film_Cast]
add CONSTRAINT Fk_NEW_Relate2
Foreign key (Film_id) references Film_Table(Film_id)
GO


اینهم یه تصویر از رلتیشن شیپ های بانکم . لطفا یه نگاه بکنید و بفرمایید تا اینجا رو درست اومده ام یا نه! یه سوال فقط این که یه سر رابطه کلیده یه سر دیگه چند تا حلقه چه مفهومی داره؟ بعضی وقتا هر دو سر این رابطه کلیده؟ اون یعنی چی ؟ تعریف این روابط به چه خاطر سرعت بانک رو بالا می بره! مثلا اگه کلید اصلی تعریف نشه و فقط فرعی ها باشند performence کارم میاد پایین؟
یعنی شما می گید رابطه چند به چند ترکیبی از روابط یک به چنده؟:متفکر:
من واقعا تو sql server تازه کارم و با مفاهیم مشکلات زبادی دارم:ناراحت:! کتاب ها اکثرا خیلی بد توضیح می دند . لطفا یکم ابتدایی تر مطالبتون رو بیان کنید:لبخندساده:

رضا جاسبی
پنج شنبه 17 مرداد 1387, 23:16 عصر
دوست عزیز اون علامت به قول شما چند تا حلقه در واقع شکل نمادین بی نهایته به معنای چند و اون کلید به معنای یک است. پس اون رابطه یک رابطه یک به چند است.
تقریبا درست گفتین. یک رابطه چند به چند ترکیبی از دو رابطه یک به چنده. یا به عبارت دیگه می تونه اینطوری تعریف بشه اما یک جدول واسط در میون میاد.
Elmasseri اگر اسمش رو اشتباه نکرده باشم قوانینی برای تبدیل نمودار (ER (Entitt Relationship به جداول داره :
1- هر Entity یک جدول نیاز دارد. کلید آن جدول بر اساس تعریف Data و نوع Entity تعریف می شود. معمولا یک فیلد ID می گیرند که اضافه بر Attributeهای خود Entity است. اما از خود Attribute ها هم میشه استفاده کرد اگر Unique بودنشان تضمین شده باشد. مثل کد ملی و یا شماره دانشجویی ولی نه نام و نام خانوادگی و شماره شناسنامه و مانند آن
2- هر رابطه یک به یک نیازی به جدول اضافه ندارد. کلید اصلی یکی از جدولها در جدول دیگر وجود خواهد داشت. در رابطه یک به یک معمولا رابطه از یک طرف محکم است به این معنا که رکوردهای یک جدول حتما در رابطه شرکت می کنند. رابطه یک به یک معمولا حالتی است که می خواهیم بخشی از اطلاعات مورد نیاز را که در عملیات نقش زیادی ندارند از اطلاعات اصلی که مراجعه زیادی دارند جدا کنیم. مثلا برای یک دانشجو دو دسته اطلاعات ذخیره می کنیم. شماره دانشجویی و نام و نام خانوادگی و سال ورود و ... و اطلاعاتی که همیشه مورد استفاده نیست مثل آدرس و تلفن منزل و عکس و .... در این رابطه یک به یک بین اطلاعات اصلی دانشجو و اطلاعات جانبی جدول اطلاعات اصلی در رابطه محکم است یعنی همیشه این اطلاعات باید باشد اما ممکن است عکس و آدرس و ... وجود نداشته باشد. معمولا کلید هر دو جدول یکی است. مگر اینکه به دلایلی خاص بخواهید در جدول نامحکم کلید دیگری داشته باشید. به هر حال کلید جدول اول در جدول دوم قطعا Unique است.
3- هر رابطه یک به چند نیازی به جدول اضافه ندارد. کلید اصلی جدول طرف "یک" به عنوان یک فیلد در جدول طرف "چند" اضافه می شود. ( و طبیعتا باید کلید خارجی تعریف شود)
4- هر رابطه چند به چند نیاز به یک جدول جدید دارد. کلید اصلی هر دو جدول در جدول جدید خواهند بود و ترکیب آنها بعلاوه فیلدهایی احتمالی از جدول جدید (یا Attribute مربوط به خود رابطه) کلید اصلی جدول جدید خواهند بود. در جدول جدید ممکن است صفت خاصی موجود نباشد اما در حالت کلی اینطور نیست. مثلا همین جدول نقش که دوستمون اشاره کردند. البته اگر خاصیت نقش رو نخواهیم در نظر بگیریم و صرف شرکت در فیلم مد نظر باشد ، یک تا چند نقش (مثل دیدی و ارثیه خانوادگی) در این صورت ترکیب همون دو تا فیلد جدولهای اصلی کلید اصلی جدول جدید رو می سازند. یا مثلا جدول Supplier و Product یا همون S و P که جدول رابطه مورد نظر یا همان "تولید می کند" فقط یک تعداد داشت. بنابراین کلید اصلی جدول SP ترکیب #S و #P می بود. اما اگر مثلا تاریخ هم داشتیم ترکیب #S و #P و تاریخ کلید می شد. بدیهی است که #S و #P باید کلید خارجی تعریف شوند.