PDA

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



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

یک سیستم مدیریت کتاب ساده رو تصور کنید. یک جدول نویسندگان داریم (شامل کد نویسنده و نام نویسنده) و یک جدول کتاب (شامل کد کتاب و نام کتاب). می خواهیم مشخص کنیم نویسندگان کتاب چه کسانی هستند. یک کتاب ممکن است یک یا چند نویسنده داشته باشد.


یک مثال دیگر:

یک جدول دسته بندی کالا داریم (شامل کد دسته و نام دسته) و یک جدول کالا (شامل کد کالا و نام کالا) می خواهیم بگوییم کالای تلویزیون هم در دسته "لوازم خانگی" است و هم در دسته "لوازم برقی" و هم در دسته "لوازم دیجیتالی"

چطور این رو پیاده سازی می کنید؟

Mahmoud Zaad
سه شنبه 30 تیر 1394, 11:53 صبح
سلام
در هر دو مورد به یک جدول سوم نیاز داریم برای ثبت ارتباط ها.
مثلاً

جدول کتاب

کد --- عنوان
1 --- کتاب الف
2 --- کتاب ب

جدول نویسندگان

کد ---- نام نویسنده
1 ---- علی
2 ---- رضا
3 ---- محمود

جدول ارتباط ها

id --- کد کتاب ---- کد نویسنده
1 ------1----- 1
2 -------1 -----2
3 -------1----- 3
4 -------2 -----1
الان کتاب 1 دارای 3 نویسنده هست. و کتاب 2 دارای یک نویسنده هست.

اوبالیت به بو
سه شنبه 30 تیر 1394, 13:51 عصر
سلام
در هر دو مورد به یک جدول سوم نیاز داریم برای ثبت ارتباط ها.
مثلاً

جدول کتاب

کد --- عنوان
1 --- کتاب الف
2 --- کتاب ب

جدول نویسندگان

کد ---- نام نویسنده
1 ---- علی
2 ---- رضا
3 ---- محمود

جدول ارتباط ها

id --- کد کتاب ---- کد نویسنده
1 ------1----- 1
2 -------1 -----2
3 -------1----- 3
4 -------2 -----1
الان کتاب 1 دارای 3 نویسنده هست. و کتاب 2 دارای یک نویسنده هست.

تا اینجا اوکیه، یک Select برای جدول Books می خوام که فهرست کتابها رو بیاره شامل 3 ستون نام کتاب، کد کتاب، نویسندگان که با خط تیره جدا شده باشند.

xsbehx
سه شنبه 30 تیر 1394, 15:17 عصر
شما نیازه که اول یک jon بزنی بین جداولت
بعدش لازمه که اون فیلد هایی که قرار با _ یا هر علامت دیگه ای جدا کنی و تو یه ستون نمایش بدی رو مشخص کنی
یه مثال می زنم :


select fldBookName+','+fldUserName as 'fldNew'
from tblUsers
inner join tblBooks
on tblBooks.fldUserId = tblUsers.fldUserId

تو نمونه کد بالا من دوتا جدول رو join زدم. شما اگر 100 تا جدول هم داشته باشی مثل بالا می شه

Mahmoud.Afrad
سه شنبه 30 تیر 1394, 21:38 عصر
با فرض جداول book , author و جدول واسطه BookAuthors به صورت زیر عمل کنید

Select BA.bookID ,
book.Name as [BookName] ,
(Select author.name + ','
From BookAuthors
join author on BookAuthors.authorID = author.id
Where BookAuthors.bookID = BA.bookID
For XML Path('') ) as Authors
From BookAuthors BA
join book on book.id = BA.bookID
group by BA.bookID , book.name

MMR_1234
چهارشنبه 31 تیر 1394, 05:17 صبح
با سلام

جدول کتاب

کد --- عنوان
1 --- کتاب الف
2 --- کتاب ب

جدول نویسندگان

کد ---- نام نویسنده
1 ---- علی
2 ---- رضا
3 ---- محمود

جدول ارتباط ها

id --- کد کتاب ---- کد نویسنده
1 ------1----- 1
2 -------1 -----2
3 -------1----- 3
4 -------2 -----1
الان کتاب 1 دارای 3 نویسنده هست. و کتاب 2 دارای یک نویسنده هست.
این روش خوبه ولی برای تعداد کم
مثلاً اگر بخواهیم کتاب رو بر اساس تعداد نویسندگان اون و تعداد ناشران اون به این ترتیب معرفی کنیم ارتباطات زیادی رو براش نیاز خواهیم داشت
آیا راهکار بهتری برای اون وجود نداره
با سپاس

اوبالیت به بو
چهارشنبه 31 تیر 1394, 07:47 صبح
با فرض جداول book , author و جدول واسطه BookAuthors به صورت زیر عمل کنید

Select BA.bookID ,
book.Name as [BookName] ,
(Select author.name + ','
From BookAuthors
join author on BookAuthors.authorID = author.id
Where BookAuthors.bookID = BA.bookID
For XML Path('') ) as Authors
From BookAuthors BA
join book on book.id = BA.bookID
group by BA.bookID , book.name


ممنونم

در این کوئری الان ما روی BA اومدیم Select زدیم. فهرست کتاب ها رو کجا مشخص کردید؟

Mahmoud Zaad
چهارشنبه 31 تیر 1394, 08:52 صبح
با سلام

این روش خوبه ولی برای تعداد کم
مثلاً اگر بخواهیم کتاب رو بر اساس تعداد نویسندگان اون و تعداد ناشران اون به این ترتیب معرفی کنیم ارتباطات زیادی رو براش نیاز خواهیم داشت
آیا راهکار بهتری برای اون وجود نداره
با سپاس
یک کتاب مگه چند ناشر داره؟ بفرض که برای یک کتاب، ناشر پس از چند نوبت چاپ عوض بشه، مگه چندتا از کتابها این اتفاق براشون می افته؟
برای این مورد هم میشه یک کد ناشر هم به جدول ارتباط ها اضافه کرد. فکر نمی کنم مشکلی پیش بیاد، به هر حال در خیلی از برنامه ها در جدول های اصلی چندین کلید خارجی از جدول های مختلف وجود داره که در صورت نیاز باید برای دسترسی به فیلد اصلی باید از join استفاده بشه. ولی نکته ای که هست اینه که همیشه ما نیاز نداریم که از همه کلیدهای خارجی و اطلاعاتشون استفاده کنیم. و یا به عبارت بهتر باید در طراحی نرم افزار کاری کنیم که اگر کاربر به این نوع گزارشها نیاز داشت به نحوی موضوع رو مدیریت کنیم که فشار کمی روی سرور باشه. مثلاً اگر بخواهیم اطلاعات رو در یک گرید نشون بدیم میشه از یک لینک استفاده کرد تا اگر کاربر خواست روی اون کلیک کنه و لیست ناشران رو ببینه و ...

اوبالیت به بو
چهارشنبه 31 تیر 1394, 10:28 صبح
یک کتاب مگه چند ناشر داره؟ بفرض که برای یک کتاب، ناشر پس از چند نوبت چاپ عوض بشه، مگه چندتا از کتابها این اتفاق براشون می افته؟
برای این مورد هم میشه یک کد ناشر هم به جدول ارتباط ها اضافه کرد. فکر نمی کنم مشکلی پیش بیاد، به هر حال در خیلی از برنامه ها در جدول های اصلی چندین کلید خارجی از جدول های مختلف وجود داره که در صورت نیاز باید برای دسترسی به فیلد اصلی باید از join استفاده بشه. ولی نکته ای که هست اینه که همیشه ما نیاز نداریم که از همه کلیدهای خارجی و اطلاعاتشون استفاده کنیم. و یا به عبارت بهتر باید در طراحی نرم افزار کاری کنیم که اگر کاربر به این نوع گزارشها نیاز داشت به نحوی موضوع رو مدیریت کنیم که فشار کمی روی سرور باشه. مثلاً اگر بخواهیم اطلاعات رو در یک گرید نشون بدیم میشه از یک لینک استفاده کرد تا اگر کاربر خواست روی اون کلیک کنه و لیست ناشران رو ببینه و ...

شما فرض کنید که هست. چه کوئری میزنید؟

Mahmoud Zaad
چهارشنبه 31 تیر 1394, 12:40 عصر
شما فرض کنید که هست. چه کوئری میزنید؟
از بودن که قطعاً هست، حتی برای یک مورد هم سیستم باید جوابگو باشه. من برای تعداد عرض کردم مشکلی پیش نمیاد.
اما کوئری، من فکر میکنم هنوز برای طراحی جدول به جمع بندی نرسیدیم تا بخوایم کوئری بزنیم.
خب، پیشنهاد من برای تعدد ناشران: به نظرم در کنار جدولی که برای کتاب-نویسنده داریم باید یک جدول دیگه برای ارتباط کتاب-ناشر داشته باشیم. در جدول اصلی که کتاب-نویسنده هست میشه فیلد آخرین ناشر و همینطور فیلد تعداد ناشران رو داشت و هر بار که ناشر عوض میشه این دو فیلد رو آپدیت کرد.
133459
نتیجه
133460

MMR_1234
چهارشنبه 31 تیر 1394, 16:16 عصر
با سلام مجدد
دوست خوب من ناشر را به عنوان نمونه گفتم اگه بخواهیم بررسی کنیم امکان داره در بار اول نویسنده با یکی از انتشارات رو برای چاپ انتخاب کنه و برای چاپ مجدد با ناشر دیگه ای قراردادش رو بنویسه

به هر حال اگر این موضوع باشه میخواست بدونم چطوری میشه کار کرد

چون من در حال ایجاد بانکی هستم برای محاسبه قیمت تولید

هر وسیله مقداری مصالح داره، نیروی انسانی داره هزینه هائی مثل جابجائی حمل و .... براش وجود داره
بهترین روش برای اینکار چه میتونه باشه
بیام برای هر محصول تعداد حداقل 20 ردیف ایجاد کنم تا اتصال برقرار بشه یا راه راحتتری هم هست
به هر حال سپاسگذارم

Mahmoud Zaad
چهارشنبه 31 تیر 1394, 17:42 عصر
با سلام مجدد
دوست خوب من ناشر را به عنوان نمونه گفتم اگه بخواهیم بررسی کنیم امکان داره در بار اول نویسنده با یکی از انتشارات رو برای چاپ انتخاب کنه و برای چاپ مجدد با ناشر دیگه ای قراردادش رو بنویسه

به هر حال اگر این موضوع باشه میخواست بدونم چطوری میشه کار کرد

چون من در حال ایجاد بانکی هستم برای محاسبه قیمت تولید

هر وسیله مقداری مصالح داره، نیروی انسانی داره هزینه هائی مثل جابجائی حمل و .... براش وجود داره
بهترین روش برای اینکار چه میتونه باشه
بیام برای هر محصول تعداد حداقل 20 ردیف ایجاد کنم تا اتصال برقرار بشه یا راه راحتتری هم هست
به هر حال سپاسگذارم
بله درسته، منم در پست قبلی روش پیشنهادی خودم رو برای ناشر عرض کردم. البته همه جوانب باید در نظر گرفته بشه مثلاً برای کتابهایی که مترجم دارن موضوع فرق میکنه، یعنی ممکنه یک کتاب رو ناشرهای مختلف با مترجم های مختلف چاپ کنند حتی اسم فارسی اینها هم چون ترجمه هست فرق میکنه مثلاً Animal Farm رو یکی مزرعه حیوانات ترجمه کرده یک انتشارات دیگه با یک مترجم دیگه قلعه حیوانات ترجمه و منتشر کرده و ...

------
واقعیتش در کارهای قبلی متوجه شدم محاسبه قیمت تولید بحث بسیار پیچیده ای هست بویژه اگه کالای نهایی کالای سبکی باشه مثلاً مداد و خودکار. علاوه بر مواد اولیه، نیروی کار و سایر هزینه ها که هزینه مستقیم هستند بحث سربار رو هم داریم مثلاً آب و برق که در کارگاه مصرف شده رو چجوری تخصیص بدیم یا هزینه انبارداری رو چطور بین کالاها تقسیم کنیم؟ چون یک کالا ممکن یک ماه در انبار باشه یک کالا دو روز و ... خیلی از هزینه های مستقیم هم تقسیمش دقیق در نمیاد مثلا همین هزینه حمل. لزوماً مواد اولیه ای که الان با هزینه حمل a تومان خریداری میشه مشخص نیست در کدوم محصول استفاده شده. حسابدارها معمولا اینا رو به صورت تجربی و نسبی محاسبه می کنند. ولی از کار شما مشخصه که یا ساختمان یا چیزی شبیه این هست. که کار اینجا ساده تره، اگه اطلاعات دقیقتری بدید شاید بهتر بشه راهنمایی کرد.
البته اگه از بحث اصلی تاپیک منحرف نشیم.

MMR_1234
شنبه 03 مرداد 1394, 05:15 صبح
با سپاس از لطف شما
بله کار من ساختمانی هست ولی تنها در این مورد نمیخوام کار بکنم
چون کار اصلی ما تولید هست هم از مصالح ساختمانی استفاده میکنیم هم از دیگر مصالح
درسته حمل و هزینه های مثل انبار داری، فروش، تدارکات و .... درش هست اما ما این هزینه ها رو ماهانه در تولید تقسیم میکنیم
و جداگانه برای هر کدوم حسابی رو باز نمیکنیم
باز هم از لطف شما ممنون

اوبالیت به بو
شنبه 03 مرداد 1394, 09:07 صبح
از بودن که قطعاً هست، حتی برای یک مورد هم سیستم باید جوابگو باشه. من برای تعداد عرض کردم مشکلی پیش نمیاد.
اما کوئری، من فکر میکنم هنوز برای طراحی جدول به جمع بندی نرسیدیم تا بخوایم کوئری بزنیم.
خب، پیشنهاد من برای تعدد ناشران: به نظرم در کنار جدولی که برای کتاب-نویسنده داریم باید یک جدول دیگه برای ارتباط کتاب-ناشر داشته باشیم. در جدول اصلی که کتاب-نویسنده هست میشه فیلد آخرین ناشر و همینطور فیلد تعداد ناشران رو داشت و هر بار که ناشر عوض میشه این دو فیلد رو آپدیت کرد.
133459

نتیجه
133460


کاملا درسته ما هم از همین روش استفاده می کنیم. بریم سراغ جدول Authors و Books و BooksAuthors . یک کوئری می خوام روی جدول Books که قرار هست فهرست کتب رو به من نمایش بده. اگر یک کتاب 3 نویسنده داره، نباید 3 رکورد به من نمایش بده. باید یک رکورد نشون بده و نام نویسنده در یک فیلد بیاد و با کاما جدا بشه. من بدنبال این کوئری هستم.

اوبالیت به بو
یک شنبه 04 مرداد 1394, 09:18 صبح
به روز رسانی

Mahmoud Zaad
دوشنبه 05 مرداد 1394, 21:43 عصر
ظاهراً راهش مثالی هست که آقای Mahmoud.Afrad (http://barnamenevis.org/member.php?71297-Mahmoud-Afrad) نوشتن ولی من آخرین باری که به این مشکل خوردم، از طریق تغییر در دیتاتیبل توی برنامه مشکل رو حل کردم نه از طریق کوئری (پاک کردن صورت مساله!)