PDA

View Full Version : ساخت یه جدول با یک یا چند کلید خارجی ؟



hdv212
سه شنبه 19 تیر 1386, 13:12 عصر
سلام و خسته نباشید
من چند تا جدول به نامهای zamin,khane,apartman , … دارم و حالا میخوام یه جدول بسازم که عکسهای مربوط به این جداول رو جداگانه نگه داره، فرض کنید میخوام جدول images رو بسازم، حالا fk این جدول رو چی قرار بدم ؟ zamin , khane , apartman ؟ (این قسمت منو گیج کرده، چون بعضی ها اصلا عکس ندارن یعنی fk باید null باشه)، اگه میشه یه نمونه از ساخت این جدول رو برام بنویسید، با شرایطی که گفتم.
مرسی

Hamid.Kad
سه شنبه 19 تیر 1386, 17:35 عصر
کلید خارجی اگه Null باشه مشکلی پیش نمیاد. اگه نمی خواهی که سرور عکس و اطلاعات از هم جدا باشند عکسها رو توی جداول مربوطه خودشون قرار بده. ولی اگه به هردلیلی
نمی خواهی از این روش استفاده کنی می تونی توی جدول عکسهات این فیلدها رو داشته باشی ("TableName" , "Id" , "Image" ) که فیلد Id میشه کلید خارجی به جدولی که مقدارش توی فیلد "TableName" قرار گرفته.(یعنی توی اون جدول Pk هست)

SYNDROME
سه شنبه 19 تیر 1386, 18:36 عصر
با سلام

کلید خارجی اگه Null باشه مشکلی پیش نمیاد. اگه نمی خواهی که سرور عکس و اطلاعات از هم جدا باشند عکسها رو توی جداول مربوطه خودشون قرار بده. ولی اگه به هردلیلی
نمی خواهی از این روش استفاده کنی می تونی توی جدول عکسهات این فیلدها رو داشته باشی ("TableName" , "Id" , "Image" ) که فیلد Id میشه کلید خارجی به جدولی که مقدارش توی فیلد "TableName" قرار گرفته.(یعنی توی اون جدول Pk هست)
روش دوستمان جالب است ولی شما در این حالت نمی توانید Relation بر قرار کنید و باید به وسیله همان TableName عکس ها را جدا گانه ذخیره کنید.
بهتر است از جداول جداگانه استفاده کنی تا راحتر کار شما انجام شود و مجبور به اضافه کردن فیلد Tablenameنباشید و این کار منطقی تر است.

AminSobati
سه شنبه 19 تیر 1386, 22:09 عصر
حامد جان علت جدا کردن تصاویر از جدول اصلی چیه؟ چون به تناسب نیاز شما، ممکنه راهکارهای دیگه (مثل Filegroup) هم قابل استفاده باشه

hdv212
سه شنبه 19 تیر 1386, 23:10 عصر
خب آقای ثباتی،هدف من برای جدا کردن تصاویر از بقیه ی اطلاعات یکی کارایی برنامه س، و یکی هم اینکه ممکنه یه رکورد چند تا عکس داشته باشه، ولی فکر نمیکنم نیازی به filegroup باشه، چون اونقدرها هم کارایی توی این قسمت مهم نیست، اصل اینه که در ساخت جدول تصاویر، منطقی ترین راه چیه که relation هم بین این جدول با جدولهای دیگه برقرار بشه؟

niksoft
سه شنبه 19 تیر 1386, 23:37 عصر
شما میتوانید جدول عکس رو برای مثال به 10 تا جدول دیگر متصل کنید و برای جدول Image فرقی نمیکنه که به چند تا جدول Foriegn key داشته باشه برای اینکه راحت این کار رو انجام بدید بهتره که تو Database diagrams این کار رو بکنید
در ضمن
هر کدام از این 10 تا جدول میتونن از Image_Id خودشون که با فیلد Id تو جدول Image Forign Key شده استفاده کنن
و برای اینکه Forign Key مقدار Image_Id نال قبول نمیکنه یک رکورد در جدول Image بسازید و به جای اینکه آدرس یا خود عکس رو توش بزارید یه مقدار خالی '' توش بزارید
و به رکوردهایی که عکس ندارن Id این Record از جدول Image رو اختصاص بدید

MajerajooyeKhallagh
چهارشنبه 20 تیر 1386, 08:49 صبح
خب آقای ثباتی،هدف من برای جدا کردن تصاویر از بقیه ی اطلاعات یکی کارایی برنامه س، و یکی هم اینکه ممکنه یه رکورد چند تا عکس داشته باشه، ولی فکر نمیکنم نیازی به filegroup باشه، چون اونقدرها هم کارایی توی این قسمت مهم نیست، اصل اینه که در ساخت جدول تصاویر، منطقی ترین راه چیه که relation هم بین این جدول با جدولهای دیگه برقرار بشه؟

دوست عزیز

شما کافیه که کلید اصلی جداول apartman و zamin و... را در جدول Images به عنوان FK قرار بدید و ارتباط بین این جداول با جدول Images را Enforce آن را False کنید تا مشکل Null بودن Fk هم حل شود به صورت زیر:
جدول مربوط به apartman و ... را modify کنید سپس بر روی جدول right click کرده و گزینه Relationships را انتخاب کنید,در پنجره باز شده بر روی Relation موردنظر کلیک کرده و سپس گزینه Enforce Foreign Key Constraint را No کنید و در آخر,جدول را هم ذخیره کنید تا تغییرات ذخیره گردد.
امیدوارم با این توضیحات,تونسته باشم بهتون کمک کنم

niksoft
چهارشنبه 20 تیر 1386, 10:00 صبح
دوست عزیز

شما کافیه که کلید اصلی جداول apartman و zamin و... را در جدول Images به عنوان FK قرار بدید و ارتباط بین این جداول با جدول Images را Enforce آن را False کنید تا مشکل Null بودن Fk هم حل شود به صورت زیر:
جدول مربوط به apartman و ... را modify کنید سپس بر روی جدول right click کرده و گزینه Relationships را انتخاب کنید,در پنجره باز شده بر روی Relation موردنظر کلیک کرده و سپس گزینه Enforce Foreign Key Constraint را No کنید و در آخر,جدول را هم ذخیره کنید تا تغییرات ذخیره گردد.
امیدوارم با این توضیحات,تونسته باشم بهتون کمک کنم

دوست عزیز در این حالت که شما میگید اگه بخاهیم View ای بسازیم که در آن دو جدول آپارتمان و عکس باشند این View فقط رکورد هایی را نشان میدهد که Image_Id آن درست باشد

فکر نمیکنید ارزش Forign Key فقط به جلوگیری از اشتباه وارد کردن Image_Id باشد در غیر این صورت بدون Forign Key هم میتوان دو جدول را توسط Image_Id به هم ربط داد

MajerajooyeKhallagh
چهارشنبه 20 تیر 1386, 10:26 صبح
دوست عزیز در این حالت که شما میگید اگه بخاهیم View ای بسازیم که در آن دو جدول آپارتمان و عکس باشند این View فقط رکورد هایی را نشان میدهد که Image_Id آن درست باشد

فکر نمیکنید ارزش Forign Key فقط به جلوگیری از اشتباه وارد کردن Image_Id باشد در غیر این صورت بدون Forign Key هم میتوان دو جدول را توسط Image_Id به هم ربط داد


دوست خوبم
به هنگام زدن View اگر نیاز به این باشد که آپارتمانهایی که دارای Image نمیباشند را هم نشان دهد کافیست به جای inner join از Left join یا right join (بر حسب نیاز) استفاده نمود در ضمن چگونه میتوان بدون تعریف FK دو جدول را توسط ImageId به هم ربط داد؟منظورتون اینه که Relation بینشون نزنیم و فقط فیلد ImageId را در جداول apartman و غیره قرار داد؟اگر منظورتون اینه باید خدمتتون عرض کنم که ارزش FK فقط به جلوگیری از اشتباه وارد کردن نیست چون با وجود Relation حتی از نوع غیر Enforce میتوان از آن برای Cascade کردن Delete و Update هم استفاده کرد.در ضمن تا زمانیکه image در جدول image وجود نداشته باشد شما نمیتونید از اون Image id ها در جدول apartman و غیره استفاده کنید,پس این Enforce را در جداول apartman و ... برداشتن هیچ مشکلی برای وارد کردن Image_Id اشتباه در دیتابیس ایجاد نمیکند مگر اینکه دستی در دیتابیس و در فیلد Imageid داده وارد گردد که دراینصورت نمیتوان از بروز این خطا جلوگیری کرد.

AminSobati
چهارشنبه 20 تیر 1386, 22:32 عصر
اگر چند جدول دارین که هر کدوم تصاویری نیاز دارند، اشکالش چیه که هر کدوم از جداول، جدول تصویر مخصوص به خودشون رو داشته باشند؟ این راه اصولی هست.