PDA

View Full Version : ساختار پیاده سازی یک فرزند که دارای چند والد باشد



اوبالیت به بو
یک شنبه 28 تیر 1394, 10:43 صبح
درود بر شما


یک سندی را در نظر بگیرید که مربوط به 2 مخاطب می باشد. یک جدول مخاطبین داریم که اسامی آنها ثبت شده است. حال میخواهیم بگوییم این سند هم برای دپارتمان الف است و هم دپارتمان د. ساختار سند هم به این صورت می باشد: کدسند، نام سند، کد دپارتمان که کلید خارجی است.

سوال 1) برای ثبت این سند در جدول بانک اطلاعاتی باید به ازا هر دپارتمان یک رکورد جدید ثبت شود؟
سوال 2) آیا این ساختار صحیح طراحی شده است؟ برای چنین موارد چه سناریویی وجود دارد؟

با تشکر

اوبالیت به بو
سه شنبه 30 تیر 1394, 08:00 صبح
به روز رسانی

SabaSabouhi
سه شنبه 30 تیر 1394, 09:22 صبح
درود بر شما


یک سندی را در نظر بگیرید که مربوط به 2 مخاطب می باشد. یک جدول مخاطبین داریم که اسامی آنها ثبت شده است. حال میخواهیم بگوییم این سند هم برای دپارتمان الف است و هم دپارتمان د. ساختار سند هم به این صورت می باشد: کدسند، نام سند، کد دپارتمان که کلید خارجی است.

سوال 1) برای ثبت این سند در جدول بانک اطلاعاتی باید به ازا هر دپارتمان یک رکورد جدید ثبت شود؟
سوال 2) آیا این ساختار صحیح طراحی شده است؟ برای چنین موارد چه سناریویی وجود دارد؟

با تشکر

سلام
پاسخ شما دو تا «نه» هست:
نه، نیاز به سطر جدید نداری
و نه، ساختار شما صحیح نیست.
و اما سناریوی صحیح: وقتی قرار هست که سند شما به بیش از یک مخاطب متصل باشد
نباید کلید خارجی به جدول دپارتمان داشته باشی. باید از یک جدول جداگانه برای این ارتباط استفاده کنی.

باید جدول جدیدی اضافه کنی مثلاً به نام «سند-دپارتمان» که کلید خارجی به دو جدول اسناد و دپارتمان‌ها داشته باشه.
طبعاً مدیریتش کمی پیچیده‌تر هست از حالتی که فقط یک ارتباط وجود داره، اما چاره‌ای نیست و باید ساختار صحیح رو رعایت کنی.

صبا صبوحی

اوبالیت به بو
سه شنبه 30 تیر 1394, 09:42 صبح
سلام
پاسخ شما دو تا «نه» هست:
نه، نیاز به سطر جدید نداری
و نه، ساختار شما صحیح نیست.
و اما سناریوی صحیح: وقتی قرار هست که سند شما به بیش از یک مخاطب متصل باشد
نباید کلید خارجی به جدول دپارتمان داشته باشی. باید از یک جدول جداگانه برای این ارتباط استفاده کنی.

باید جدول جدیدی اضافه کنی مثلاً به نام «سند-دپارتمان» که کلید خارجی به دو جدول اسناد و دپارتمان‌ها داشته باشه.
طبعاً مدیریتش کمی پیچیده‌تر هست از حالتی که فقط یک ارتباط وجود داره، اما چاره‌ای نیست و باید ساختار صحیح رو رعایت کنی.

صبا صبوحی

درود بر شما
ما یک جدول جدید درست کردیم که شامل 2 فیلد کلید اصلی کد سند و کد دپارتمان می باشد. حالا یک Select می زنیم تا ببینیم که این سند مربوط به کدام دپارتمان است. یک Join باید تهیه شود:



Select ... From Doc_To_Departments
Inner Join Documents On Documents.[DocId] = Doc_To_Departments.[Doc_Id]
Inner Join On Departments On Departments.[DepartmentId] = Doc_To_Departments.[Department_Id]


نتیجه هم آورده می شود. می خواهیم به جای چند رکورد، به صورت یک فیلد به من گفته شود این سند مربوط به کدام دپارتمان ها است و اینها را به کاما جدا کند.

SabaSabouhi
سه شنبه 30 تیر 1394, 12:46 عصر
درود بر شما
ما یک جدول جدید درست کردیم که شامل 2 فیلد کلید اصلی کد سند و کد دپارتمان می باشد. حالا یک Select می زنیم تا ببینیم که این سند مربوط به کدام دپارتمان است. یک Join باید تهیه شود:



Select ... From Doc_To_Departments
Inner Join Documents On Documents.[DocId] = Doc_To_Departments.[Doc_Id]
Inner Join On Departments On Departments.[DepartmentId] = Doc_To_Departments.[Department_Id]


نتیجه هم آورده می شود. می خواهیم به جای چند رکورد، به صورت یک فیلد به من گفته شود این سند مربوط به کدام دپارتمان ها است و اینها را به کاما جدا کند.

سلام
چند تا روش داری، می‌تونی از تابع استفاده کنی، می‌تونی Cursor بنویسی، می‌تونی به جدول سند یه ستون Description اضافه کنی و توی Trigger مربوط به جدول «سند-دپارتمان» فهرست دپارتمان‌ها رو به صورت varchar اونجا قید کنی، می‌تونی یه SP بنویسی و با یه Select مقدار
یک متغییر رو پر کنی و بعد برش گردونی، اگه با EF و LinQ کار می‌کنی که خیلی روش‌های شیک و قشنگی اونجا وجود داره برای این کار.

در هر صورت چیزی که نیاز داری یک نوع گزارش هست که می‌تونه در زمان تولید داده‌ها آماده بشه و تو دیتابیس هم ذخیره بشه و یا
در زمان نیاز محاسبه بشه.

صبا صبوحی