PDA

View Full Version : یک فیلد جدول کلید خارجی چند جدول



wolf_majid
جمعه 14 تیر 1392, 07:38 صبح
سلام
فرض کنید جدولی داریم که یکی از فیلدهای آن به کلید اصلی چند جدول دیگر اشاره دارد
من در اینجور موارد یک فیلد کمکی در نظر میگیرم که مشخص می کنه که مقدار اون فیلد به کدامیک از جداول اشاره میکنه

اما مشکل اینه که توی دیتاگرام جداول مورد نظر را به این جدول ربط نمیده

دوستان لطف کنند جواب بدند :
1- اصلا" روشی که انجام میدم درسته ؟ (روش بهتری وجود نداره)
2- چطور میتونم کاری کنم که توی اون فیلد مقدار نا معتبر وارد نشه (به عبارتی کلید خارجی تمام اون چند جدول باشه)
3-آیا ارتباط نمایش داده نشده در دیتاگرام باعث گیج شدن برنامه نویس نمیشه ؟

wolf_majid
شنبه 15 تیر 1392, 22:39 عصر
سلام دوباره
جدول payment رو ببینید دو کلید docCode در فیلد paydocCode ثبت میشن و reason مشخص می کنه از کدام جدوله
واقعا" روش بهتری وجود نداره ؟

mahan.2002
پنج شنبه 20 تیر 1392, 08:11 صبح
سلام
من از توضیحاتتون استنباط میکنم طراحی تو اشتباست!

reason مشخص می کنه از کدام جدوله
فکر نمکنم این روش صحیحی باشه.
شما توضیح بدید چه برنامه ای طراحی می کنید .. اینطور فکر میکنم بهتر میشه راهنمایتون کرد ..

wolf_majid
پنج شنبه 20 تیر 1392, 20:06 عصر
پایگاه دادم یک مجتمع تجاری است
جدول Payment جدول پرداخت هاست , پرداخت هایی که اعضای مجتمع برای هزینه ها و یا پرداخت حقوق کارمندان مجتمع پرداخت کردند
Reason مشخص میکنه که پرداخت برای هزینه است یا حقوق

master13111
پنج شنبه 27 تیر 1392, 16:57 عصر
وقتی شما میگی که یکی از فیلداتون کلید خارجی چند تا جدول دیگه س و با کلید اصلی اونا ارتباط داره, یعنی اینکه اون جدولا همشون با هم ارتباط یک به یک دارن. در اینصورت شما یه جدول رو به عنوان مرکز در نظر بگیر با بقیه جدولا ارتباط یک به یک بده و با این جدولت ارتباط یک به چند بده. در این صورت مشکل اعتبار سنجی ورود اطلاعاتت حل میشه و هم توی دیاگرام نشون میده

mahan.2002
پنج شنبه 27 تیر 1392, 17:33 عصر
با سلام
من نظرم اینکه شما اولا این دو جدول رو از هم سوا کن .. برای راحتی کار هم کم شدن هزینه Join و هم راحتی کار برنامه نویستون .. یعنی بیخود بپچیده میکنی کارو...
ثانیا : اگر میخواین این کارو کنین اولا باید ببینید پایگاه این اجازه رو به شما میده که از دو جدول یک فیلد کلید خارجی دیگه تعریف کنید... که تازه باید مقادیر اونارو متفاوت در تعیین کنید .. اونم با برنامه نویسی..
ثالثا: اگر هم دوفیلد جدا تعریف کنید پس القاعده یک فیلدون نال میشه .. البته مشکلی نداره ..

Reason مشخص میکنه که پرداخت برای هزینه است یا حقوق
تا اونجایی میدونم شما وقتی Join میکنید لازم نیست تعیین کنید از کدوم جدول چون در حالت Join طبق کلید خارجی اتوماتیک اینکار خود پایگاه داده انجام میده.. ( البته من زمانی رو میگم که شما دوفیلد مجزا تعیین کردید)
حالت یک فیلید خارجی برای دو جدول بعید میدونم عملی باشه و انجام پذیر باشه ..یعنی فکر میکنم پایگاه داده اجازه چنین کاری رو بده .
البته بنظرم یه راهی برای این که کارو بکنید هستو ولی اصلا استاندارد نیست فقط از لحاظ اینکه بتونیم فرضیه و تئوریرو عملی کنیم بنظرم میرسه که شما اصلا به وسیله پایگاه داده کلید خارجی تعریف نکنین
وخودتو با کوئری نویسی جداول رو بهم Join کنید.. البته من این کارو انجام ندادم.. ولی دوستان شاید بتونن چنین کوئری رو بنویسند.. البته فقط برای فرضیه و تئوری ..!! درعمل خیلی مقروم بصرفه نیست که هزینه و زمان برای اون صرف کرد..

wolf_majid
سه شنبه 01 مرداد 1392, 16:50 عصر
وقتی شما میگی که یکی از فیلداتون کلید خارجی چند تا جدول دیگه س و با کلید اصلی اونا ارتباط داره, یعنی اینکه اون جدولا همشون با هم ارتباط یک به یک دارن. در اینصورت شما یه جدول رو به عنوان مرکز در نظر بگیر با بقیه جدولا ارتباط یک به یک بده و با این جدولت ارتباط یک به چند بده. در این صورت مشکل اعتبار سنجی ورود اطلاعاتت حل میشه و هم توی دیاگرام نشون میده

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

wolf_majid
سه شنبه 01 مرداد 1392, 16:58 عصر
با سلام
من نظرم اینکه شما اولا این دو جدول رو از هم سوا کن ..
سلام
کدوم دو جدول ؟ (جدول سند پرداخت هزینه و سند پرداخت حقوق از هم جداست)

ثانیا : اگر میخواین این کارو کنین اولا باید ببینید پایگاه این اجازه رو به شما میده که از دو جدول یک فیلد کلید خارجی دیگه تعریف کنید... که تازه باید مقادیر اونارو متفاوت در تعیین کنید .. اونم با برنامه نویسی..
امتحان کردم اجازه نمیده
مشکل اینه که نمیشه یک فیلد رو کلید خارجی چند جدول کرد و همچنین نمیشه فیلدی که کلید خارجی شده null باشه (برای اینکه دو فیلد تعریف کنم)

ثالثا: اگر هم دوفیلد جدا تعریف کنید پس القاعده یک فیلدون نال میشه .. البته مشکلی نداره ..
اگر کلید خارجی باشه نمیشه

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


ممنون از پاسختون

araelectronic@ymail.com
سه شنبه 01 مرداد 1392, 20:15 عصر
با سلام

در دیاگرام مشکلی برای ارتباط یک جدول با چند جدول دیگر بوسیله یک FK وجود ندارد

107791

بهزاد علی محمدزاده
سه شنبه 01 مرداد 1392, 22:23 عصر
در دیاگرام مشکلی برای ارتباط یک جدول با چند جدول دیگر بوسیله یک FK وجود ندارد

آره مشکل نداره . ولی این برای ارث بری خوبه که اتفاقا اینجا لازمش داریم . ایشون تا اونجا که من فهمیدم , پرداخت رو دارند اما به دو حالت : یا این پرداخت برای هزینه است . یا برای حقوق . فکر می کنم این روش مناسب باشه اگر : مشترکات بین این دو نوع پرداخت رو توی یه جدول بذارید و بعد دو جدول هم داشته باشید برای پرداخت هزینه و پرداخت حقوق . اونوقت هرکدام مشخصات خودشون رو دارند , مثلا پرداخت کارمند باید کد کارمند و نگهداری کنه و مشخصات دیگه ایی که مد نظر طراح باشه . جدول هزینه هم می تونه شماره فاکتور و ... رو نگهداری کنه .

این دیاگرام (http://www.databaseanswers.org/data_models/tracking_multiple_job_payments/index.htm)برای پرداخت ماهیانه و ساعتی هست شاید به درک بیشتر کمک کنه .

wolf_majid
چهارشنبه 02 مرداد 1392, 20:14 عصر
آره مشکل نداره . ولی این برای ارث بری خوبه که اتفاقا اینجا لازمش داریم . ایشون تا اونجا که من فهمیدم , پرداخت رو دارند اما به دو حالت : یا این پرداخت برای هزینه است . یا برای حقوق . فکر می کنم این روش مناسب باشه اگر : مشترکات بین این دو نوع پرداخت رو توی یه جدول بذارید و بعد دو جدول هم داشته باشید برای پرداخت هزینه و پرداخت حقوق . اونوقت هرکدام مشخصات خودشون رو دارند , مثلا پرداخت کارمند باید کد کارمند و نگهداری کنه و مشخصات دیگه ایی که مد نظر طراح باشه . جدول هزینه هم می تونه شماره فاکتور و ... رو نگهداری کنه .

این دیاگرام (http://www.databaseanswers.org/data_models/tracking_multiple_job_payments/index.htm)برای پرداخت ماهیانه و ساعتی هست شاید به درک بیشتر کمک کنه .
درست متوجه نشدم اما فکر میکنم همینکار رو کردم
جدول پرداخت ها نشون میده کد پرداخت متعلق به کدام جدول و بقیه اطلاعات رو میشه از اون جدول بیرون کشید
پرداخت کارمند و پرداخت هزینه هم جدول خودشون رو دارند این جدول پرداخت اعضای مجتمعه (tblPayment) که نشون میده به چه دلیل و به چه میزان دارند شارژ پرداخت میکنند

ممنون از پاسخهاتون

wolf_majid
چهارشنبه 02 مرداد 1392, 20:36 عصر
با سلام

در دیاگرام مشکلی برای ارتباط یک جدول با چند جدول دیگر بوسیله یک FK وجود ندارد

107791

اینطور که من فهمیدم یکبار میگیم فیلد z با جدول x ویکبار با جدول y به عنوان کلید خارجی در نظر گرفته بشه
مثال:
create table tblTest(code int,
foreign key(code) references tblPayrollDocuments
,foreign key(code)references tblCostPayDocuments)
درسته ؟
اگر اینطور باشه کد وارد توی فیلد کلید خارجی باید در هردو جدول وجود داشته باشه نه یکی از اون ها

wolf_majid
چهارشنبه 02 مرداد 1392, 20:54 عصر
چطور میشه کاری کرد جلوی references اسم دو جدول رو با هم بنویسم ؟
ممنون از همه دوستانی که کمک می کنند

araelectronic@ymail.com
چهارشنبه 02 مرداد 1392, 23:26 عصر
اگر اینطور باشه کد وارد توی فیلد کلید خارجی باید در هردو جدول وجود داشته باشه نه یکی از اون ها

بله حتما باید وجود داشته باشه و الا رابطه ای برقرار نمیشه

wolf_majid
چهارشنبه 02 مرداد 1392, 23:53 عصر
اگر فیلد کلید خارجی ارتباطش با جداول مورد نظر بصورت اجتماع باشه نه اشتراک چیکار میشه کرد ؟
در این سناریو هم بهمین صورته
فرض کنید سند پرداخت هزینه داریم ولی سند پرداخت حقوق نداریم (و یا حتی کدشون با هم فرق کنه) در اینصورت (در روش بالا_ اشتراک) هیچ رانژی را نمیشه ثبت کرد

مهدی هادیان2
پنج شنبه 03 مرداد 1392, 00:38 صبح
بسم الله الرحمن الرحیم
با سلام

ثالثا: اگر هم دوفیلد جدا تعریف کنید پس القاعده یک فیلدون نال میشه .. البته مشکلی نداره .. اگر کلید خارجی باشه نمیشه
مشکلی نداره.
البته بنده منظورم منحصرا SQL است؛ چون فکر میکنم اوراکل اجازه نده.
شما در SQL فیلدی رو به عنوان کلید خارجی در نظر بگیرید و اون رو NULL قرار بدید مسئله ای پیش نمیاد.
موفق باشید.

wolf_majid
پنج شنبه 03 مرداد 1392, 09:00 صبح
بسم الله الرحمن الرحیم
با سلام

مشکلی نداره.
البته بنده منظورم منحصرا SQL است؛ چون فکر میکنم اوراکل اجازه نده.
شما در SQL فیلدی رو به عنوان کلید خارجی در نظر بگیرید و اون رو NULL قرار بدید مسئله ای پیش نمیاد.
موفق باشید.

حق با شماست
پس مشکل حل شد (باید دو فیلد تعریف کنم)
ممنون

مهدی هادیان2
پنج شنبه 03 مرداد 1392, 11:41 صبح
بسم الله الرحمن الرحیم

حق با شماست
پس مشکل حل شد (باید دو فیلد تعریف کنم)
ممنون
خداروشکر که مسئله مرتفع شد.
خواهش می کنم

مهدی هادیان2
یک شنبه 06 مرداد 1392, 19:30 عصر
بسم الله الرحمن الرحیم
با سلام
فقط نکته ای باقی می مونه و اون اینکه چه جوری باید این نکته رو برای برنامه نویس یا توسعه دهنده تشریح کرد؟