PDA

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



ali_autumnal
پنج شنبه 04 اسفند 1390, 08:41 صبح
باسلام و خسته نباشید

من نزدیک به 20 تا جدول دارم. اطلاعات رو وارد دیتابیس میکنم موقعی که میخوام از اون ها کوری بگیرم به مشکل بر میخورم. کمی شرح میدم تا بهتر متوجه بشید.

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

این 19 تا جدول تقریبا به این شرح هستند:
1-سوابق
2- مرخصی ها
3-تشویق ها
4- غیبت ها
5- تنبیه ها
6- تاخیر
7- وام
8-مشخصات عائله
9- والی...

تا اینجا مشکلی نیست.

مشکل زمانی رخ میده که من بخوام این 20تا جدول رو باهم innerjoin کنم تا اطلاعات رو طبقه بندی شده ببینم.

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

یعنی اگه بخواییم وضعیت یک پرسنل رو نمایش بدیم: باید بعداز ثبت مشخصات تک تک جدول هارو مقدار دهی کنیم. چون innerjoin زدیم

اگه فرض کنید یه پرسنلی اصلا غیبت نکرده وضعیت این شخص تو این کوری نمایش داده نمیشه. چون رکوردی تو جدول غیبت نداریم.

لطفا راهنمایی کنید من چطور این اطلاعات رو بکشم بیرون؟

از طرفی از این کوری در گزارشات استفاده خواهم کرد.

باتشکر
علی پاییزی

یوسف زالی
پنج شنبه 04 اسفند 1390, 12:25 عصر
سلام.
اول عرض کنم که شما باید طبق قوانین لینک ها رو هم از پست هم از امضا حدف کنید. لطفا در اولین فرصت این کار رو انجام بدید.
اما مشکل:
صرف نظر از اینکه طراحی یا کوئری درست هست یا نه، شما می تونید از left join استفاده کنید.
جدول پایه رو پرسنل می گیرید و بقیه باهاش left join می شند.
اطلاعات بیشتر در رابظه با انواع JOIN (http://barnamenevis.org/showthread.php?290608-راهنمایی-درباره-join&p=1277843&viewfull=1#post1277843)

ali_autumnal
پنج شنبه 04 اسفند 1390, 22:08 عصر
متشکرم از گوشزد تون و هم از پاسختون.

یه راه حل دیگه صبح بعداز ایجاد تایپیک به ذهنم رسید این بود که پس از ثبت مشخصات هر پرسنل یک رکورد خالی (با شماره پرسنلی موجود که کلید خارجی هست)یا با مقدار پیش فرض در تک تک جدول ها insert کنم.
در این صورت ما تو کلیه جدول ها یک رکورد واسه هر پرسنل داریم در نتیجه اگه innerjoin بزنیم به مشکل بر نمیخوریم.

حالا نمیدونم این راه حل محسوب میشه یا دور زدن صورت مسئله!

شما به طراحی با کوئری اشاره کردید که اشتباه هست.
یعنی راه حل اصولی واسه تهیه گزارشات ریختن اطلاعات مورد نظر در جدولی خاص و نمایش این اطلاعات در گزارشات. آیا درست منظور شما رو درک کردم؟

در این صورت ساختن جدول واسه این نوع گزارش سخت هست. چرا؟ چون ما تو اکثر جدول ها مون(منظور همین پروژه) واسه هر پرسنل رکورد های متعددی داریم. یعنی پرسنلی 5 تا شغل مختلف داره. پرسنلی 3بار غیبت کرده و الی...
ساختن همچین جدولی کمی واسم سخته.!

ممنون میشم کمی بیشتر راهنمایی کنید
با تشکر
علی پاییزی

Galawij
پنج شنبه 04 اسفند 1390, 22:41 عصر
سلام،

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

یعنی راه حل اصولی واسه تهیه گزارشات ریختن اطلاعات مورد نظر در جدولی خاص و نمایش این اطلاعات در گزارشات. آیا درست منظور شما رو درک کردم؟نه، لزومی به ایجاد جدول نیست...
Left join و Right Join ها برای مواردی هستند که کلید خارجی شما می تواند مقادیر NULL را قبول کند در این صورت مثلاً اگر جدول مربوط به مرخصی های پرسنلی خالی باشد، مشخصاتش در خروجی نمایش داده می شود.

یوسف زالی
پنج شنبه 04 اسفند 1390, 22:44 عصر
منظور من این نبود که حتما طراحی مشکل داره.
در حقیقت به همین سرعت نمی شه نتیجه گرفت.
برای این گزارشات معمولا در هر صفحه از UI یکی از نتایج رو نمایش می دند.
اما اگر واقعا همه اطلاعات رو یکجا نیاز داشته باشید و تعداد بسیاری از رکوردها داشته باشید استفاده از ویو می تونه تاثیر خوبی در سرعت داشته باشه.
اگر حجم دیتا از چند ده گیگ گذشت راه های دیگه ای هم وجود داره.
استفاده از روشی که اشاره کردید هم ضعف بزرگی داره که اصول طراحی رو زیر سوال می بره.
اولین شرط نرمال سازی درج کمترین داده با بیشترین بازدهی هست. شما در گزارشاتتون مجبورید برای هندلینگ کد گزارش اضافه نویسی کنید، برای درج مدت زمان بیشتری صرف کنید، حتما از تریگر یا تراکنش استفاده کنید، هنگام حذف همین طور، حجم داده هم بالا تر می ره.
روش مناسب استفاده صحیح از Join مناسبه.
موفق باشید.

ali_autumnal
پنج شنبه 04 اسفند 1390, 22:56 عصر
متشکرم از پاسختون.

مشکل اینجاست که همه فیلد ها در کلیه جدول هارو یکجا در یک صفحه الی در 2 صفحه میخوان. و بعداز این گزارشات تفکیکی رو هم میخوان.

Galawij
پنج شنبه 04 اسفند 1390, 23:20 عصر
مشکل اینجاست که همه فیلد ها در کلیه جدول هارو یکجا در یک صفحه الی در 2 صفحه میخوان. و بعداز این گزارشات تفکیکی رو هم میخوان.
پس نیاز دارید اطلاعات خروجی را بر اساس شماره پرسنلی گروه بندی کنید و سعی کنید فیلدهای مهمتر و ضروری تر را در خروجی SELECT بیارید و در صورت امکان از Join های اضافی اجتناب کنید.

ali_autumnal
جمعه 05 اسفند 1390, 09:30 صبح
متشکرم از راهنمایی هاتون.

باز اگه به مشکلی بر خوردم پست میزارم.

موفق باشید
علی پاییزی