View Full Version : طراحی دیتابیس بدون ایجاد دور در relation و درج مقادیر در دو جدول در یک زمان
jafarpalideh
دوشنبه 19 بهمن 1394, 12:02 عصر
با سلامجدولی به نام مظروف دارم با فیلد های کد مظروف(کلید اصلی) ، نام مظروف ، رنگ اول (کلید خارجی)، رنگ دوم(کلید خارجی) ، رنگ سوم(کلید خارجی) ، رنگ چهارم(کلید خارجی) ، رنگ پنجم(کلید خارجی)
و یک جدول دیگر به نام رنگ با فیلد های کد رنگ (کلید اصلی ) ، نام رنگ
اگه بخوام یک relation بین جدول رنگ و جدول مظروف ایجاد کنم دور بوجود میاد. واسه نرمال سازی باید چیکار کنم ؟
حالا اگه بخوام داده هام را در آن واحد به دو تا جدول بفرستم باید چه کدی بنویسم؟
En_MK
دوشنبه 19 بهمن 1394, 13:00 عصر
سلام
دور که به وجود نمیاد
شما یه جدول داری (رنگ) شامل کد ونام...یه جدول داری (مظروف) کد ونام وکد رنگ1وکدرنگ 2و...
موقعی دور پیش میاد که کد مظروف در جدول رنگ کلید خارجی باشه
ش
برای سئوال دوم:شما یه SP مینویسی شامل دو insert که گارامترهای ورودی میشه معادل مقادیر دو جدول
ژیار رحیمی
دوشنبه 19 بهمن 1394, 13:02 عصر
سلام.از یک جدول به جدول دیگر فقط میتوان یک ارتباط ایجاد کرد.
رابط شما چند به جند میباشد(یک رنگ میتواند به صفر ،یک و یا چند مظروف انتصاب داد و حالت عکس آن یک مظروف میتواند صفر،یک و یا چند رنگ انتصاب داد)
Mahmoud Zaad
دوشنبه 19 بهمن 1394, 13:02 عصر
سلام
شما کوئری زیر رو امتحان کنید:
SELECT rang_1.rang, rang_2.rang, rang_3.rang, rang_4.rang, rang_5.rang
FROM rang AS rang_5 RIGHT JOIN ((rang AS rang_3 RIGHT JOIN (rang AS rang_2 RIGHT JOIN (rang AS rang_1 RIGHT JOIN mazrouf ON rang_1.id = mazrouf.r1) ON rang_2.id = mazrouf.r2) ON rang_3.id = mazrouf.r3) LEFT JOIN rang AS rang_4 ON mazrouf.r4 = rang_4.id) ON rang_5.id = mazrouf.r5;
rang اسم جدول رنگ هست
mazrouf اسم جدول مظروف
و r1 تا r5 اسم رنگهای موجود در جدول مظروف
سوال دوم، دو تا کوئری می نویسید و ثبت می کنید، اگه حذف یکی در اون یکی تاثیر میذاره و مشکل ایجاد میکنه میتونید دوتا کوئری رو در یک تراکنش بنویسید.
jafarpalideh
سه شنبه 20 بهمن 1394, 09:16 صبح
خوب من جواب سوال دوم رو گرفتم . ولی سوال اول رو هنوز متوجه نشدم .
الان این دیاگرامی که من کشیدم یعنی درسته ؟ یا باید کار دیگه ای انجام بدم ؟
Mahmoud Zaad
سه شنبه 20 بهمن 1394, 09:37 صبح
خوب من جواب سوال دوم رو گرفتم . ولی سوال اول رو هنوز متوجه نشدم .
الان این دیاگرامی که من کشیدم یعنی درسته ؟ یا باید کار دیگه ای انجام بدم ؟
شما میخواید یه سلکت داشته باشید که نام رنگهای جدول مظروف رو به جای کدشون نشون بده درسته؟ خب شما باید توی همین دیاگرام 4 بار دیگه جدول رنگ رو کپی کنید که با فعلی بشه 5 تا (به تعداد فیلدهای رنگ در جدول مظروف) بعد هر کدوم از فیلدهای رنگ جدول مظروف رو به جدول رنگ ارتباط بدید (ارتباط یک چند)
jafarpalideh
سه شنبه 20 بهمن 1394, 10:06 صبح
آره دقیقا همین کار رو میخوام بکنم . ولی تویه ریلیشن نمیشه یک جدول رو چند بار داشت . اصلا اون دیاگرامی که کشیدم از نظر نرمال سازی اشکالی نداره ؟
Mahmoud Zaad
سه شنبه 20 بهمن 1394, 14:46 عصر
دیاگرام که دیاگرامه شما با کوئری کار دارید. در کوئری هم باید 5 تا جدول مستعار یا alias از جدول رنگ بسازید، شما اگه در کوئری من به جای r1 تا r5 از Color1 تا Color5 و به جای id از CodeRang و اسمهای جدولتون رو هم به جای اسمهای من بگذارید می بینید که همین نتیجه ای که میخواید رو می گیرید.
از نظر نرمال سازی مشکلی نداره فقط مساله ای هست تعداد رکوردهای شماست اگه تعداد رکوردها خیلی زیاده بهتره یه فیلد nvarchar داشته باشید و موقع insert اسم رنگها رو در این فیلد بنویسید بعد توی کوئری ها از این فیلد استفاده کنید به جای join کردن. البته استفاده از این روش به طراحی و گزارشهای شما هم بستگی داره مثلاً شاید کاربر دو رنگ اول رو بخواد یا رنگ اول و چهارم و ... و البته مشکلاتی هم داره مثل اینکه اگه کاربر اسم رنگ با کد 1 رو تغییر بده چی میشه که داستان ها داره!
ولی اگر تعداد رکوردهاتون کمه همین روش خوبه.
jafarpalideh
سه شنبه 20 بهمن 1394, 14:52 عصر
تعداد رکوردها به اندازه ی تعداد محصوله که تقریبا نهایتا به 5000 تا میرسه .
البته این کوئری رو نوشتم .فقط شک داشتم که نرمالسازی توش رعایت شده یا نه
SELECT dbo.TblRang.NameRang AS rang0, TblRang_1.NameRang AS rang1, TblRang_2.NameRang AS rang2, TblRang_3.NameRang AS rang3, TblRang_4.NameRang AS rang4, dbo.TblMazroof.NameZarf
FROM dbo.TblMazroof LEFT OUTER JOIN
dbo.TblRang ON dbo.TblMazroof.Color1 = dbo.TblRang.CodeRang LEFT OUTER JOIN
dbo.TblRang AS TblRang_1 ON dbo.TblMazroof.Color2 = TblRang_1.CodeRang LEFT OUTER JOIN
dbo.TblRang AS TblRang_2 ON dbo.TblMazroof.Color3 = TblRang_2.CodeRang LEFT OUTER JOIN
dbo.TblRang AS TblRang_3 ON dbo.TblMazroof.Color4 = TblRang_3.CodeRang LEFT OUTER JOIN
dbo.TblRang AS TblRang_4 ON dbo.TblMazroof.Color5 = TblRang_4.CodeRang
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.