PDA

View Full Version : سوال: مشکل در بر قراری ارتباط بین جداول در یک مثال ساده



DotNet_King
دوشنبه 20 خرداد 1387, 13:14 عصر
با سلام به دوستان عزیز

من تازه شروع به کار با sql server 2005 کردم. با مبانی و مفهومات این بانک آشنایی مختصری پیدا کردم ولی مشکل اینجا است که هر بار که می خوام بین جداول بانک ارتباط برقرار کنم خطا می ده و ازتباط ساخته نمیشه و خطا های زیر رو میده.

من قصد دارم یه پروژه آزمایشی دفترچه تلفن درست کنم که شامل دو جدوله
اولی مشخصات فرد( آی دی ، نام کوچک ، نام خانوادگی،شغل طرف ، توضیحات اضافی)
دومی شامل ( آی دی ، شماره ثابت ، شماره همراه، ایمیل)
دیاگرامش رو تو ضمیمه ها می زارم
این ارور را می گیرم

'ContactMainProperty' table saved successfully
'ContactDetail' table
- Unable to create index 'IIX_ContactDetail'.
CREATE UNIQUE INDEX terminated because a duplicate key was found for object name 'dbo.ContactDetail' and index name 'IIX_ContactDetail'. The duplicate key value is (0).
Could not create constraint. See previous errors.
The statement has been terminated.

گاه گداری هم به forign key گیر میده یا به ایندکس و کلید ها گیر میده

ممنون میشم که بگید اشکالم کجاست و به چه صورت باید این ارتباط رو برقرار کنم.
باز هم عذر می خوام از اینکه سوالم اولیه و پیش پا افتاده است خیلی جستجو کردم ولی فقط گیج تر شدم:ناراحت: تو رو خدا کمکم کنید خیلی خیلی قاطی کردم! البته تا حالا برای این کار از محیط گرافیکی استفاده کنم ، T-Sql مشکلم رو حل میکنه

ASKaffash
دوشنبه 20 خرداد 1387, 15:42 عصر
با سلام
- رابطه PK و FK را یک به یک تعریف کرده اید باید Id و C_Id یک به چند باشند
-فیلد id را با خودش ارتباط PK و FK داده اید چرا؟

DotNet_King
دوشنبه 20 خرداد 1387, 21:00 عصر
سلام و با تشکر از لطف تون، حتما روی پیشنهادات شما، کار می کنم
آقای کفاش، من تو این زمینه واقعا تازه کارم واقعا گیج شدم. رابطه pk , fk رو میشه توضیح بدید چیه؟

اگه لطف کنید یه کم ابتدایی تر توضیح بدید و یا یه مثال ساده در همین زمینه برام بزنید که مراحل رو به تفکیک نشون بده، ممنون میشم

AminSobati
دوشنبه 20 خرداد 1387, 22:33 عصر
دوست عزیزم از پیغام اینطور پیداست که در جدول ContactDetail روی فیلدی که دارین Unique Key ایجاد میکنین، در حال حاضر مقدار تکراری داره

DotNet_King
دوشنبه 20 خرداد 1387, 23:47 عصر
ممنون از راهنماییتون آقای ثباتی! مشکل ام حل شد ، اگه میشه به عکس ضمیمه یه نگاه بندازید

به نظرتون چه کار هایی رو باید برای بالا بردن عملکرد سرعت در این بانک آزمایشی انجام بدم
یک unique key در هر جدول بیشتر نداشتم ولی همونطوری که حدس زدید روی ایندکس هام ارور می داد

این یک به یک و یک به چند که دوستمون عنوان کردند به چه صورتی اعمال میشه؟
اگه نکته ای هست لطفا عنوان کنید. اصلا خودتون اگه بخواهید این بانک رو بسازید ،چه جوری رابطه میدید و ایندکس گذاری می کنید؟ نمومه t-sql هم اگه در این رابطه دارید لطفا بزارید

AminSobati
سه شنبه 21 خرداد 1387, 12:13 عصر
- بالا بردن سرعت بانک، بعد از اینکه تمام Queryها مشخص شد قابل بحثه. تمام ایندکس گذاری ها هم همینطور
- وقتی فقط یک سر Relation کلید باشه، یعنی رابطه میتونه یک-به-چند باشه. اما اگر هر دو سرش کلید باشه، طبیعتا یک-به-یک خواهد بود

DotNet_King
سه شنبه 21 خرداد 1387, 16:36 عصر
آقای ثباتی اجازه هست تو کامل کردن این زمینه پیش برم و مشکل هام رو تو همین تاپیک از شما بپرسم؟

ASKaffash
سه شنبه 21 خرداد 1387, 16:56 عصر
سلام دوست من
PK به فیلد منحصر به فرد که کلید در جدول شماست گفته میشود مثلا در یک سیستم پرسنلی شماره کارمندی میتواند بعنوان کلید انتخاب شود.
حالا اگر شما درهمین سیستم پرسنلی بخواهید اطلاعات افراد تحت تکفل فرد را نگهداری کنید یک جدول دوم ایجاد میکنید ویک فیلد شماره کارمندی هم جنس فیلد شماره کارمندی در جدول پرسنل را تعریف میکنید این فیلد در این جدول کلید خارجی یا FK نامیده میشود. امیدوارم خوب توضیح داده باشم.

AminSobati
سه شنبه 21 خرداد 1387, 17:14 عصر
آقای ثباتی اجازه هست تو کامل کردن این زمینه پیش برم و مشکل هام رو تو همین تاپیک از شما بپرسم؟
اگر مربوط به همین مسئله باشه مانعی نداره، اما سوالهای متفاوت رو در تاپیک جدا پست کنید

DotNet_King
چهارشنبه 22 خرداد 1387, 07:41 صبح
سلام دوست من
PK به فیلد منحصر به فرد که کلید در جدول شماست گفته میشود مثلا در یک سیستم پرسنلی شماره کارمندی میتواند بعنوان کلید انتخاب شود.
حالا اگر شما درهمین سیستم پرسنلی بخواهید اطلاعات افراد تحت تکفل فرد را نگهداری کنید یک جدول دوم ایجاد میکنید ویک فیلد شماره کارمندی هم جنس فیلد شماره کارمندی در جدول پرسنل را تعریف میکنید این فیلد در این جدول کلید خارجی یا FK نامیده میشود. امیدوارم خوب توضیح داده باشم.


پس با این حساب id تو بانک من pk است و کلیه آی دی هایی که تو جداول دیگه تعریف می کنم fk است؟ میشه بگید به چه صورتی باید این pk , fk رو با دستورات t-sql به جداوالم نسبت بدم؟

ASKaffash
چهارشنبه 22 خرداد 1387, 10:18 صبح
با سلام
درست است . درضمن شما نسبت داده اید کافی است استفاده کنید مثلا :


Select M.*,
Cnt=(Select Count(*) From ContactDetail Where id=M.id)
From ContactMainProperty M
Where ....


در ضمن بهتراست id را مثلا به Cid تبدیل کنیدچون id کلمه کلیدی است