ورود

View Full Version : طراحی صحیح جداول



Milad Mohseny
سه شنبه 20 فروردین 1387, 10:53 صبح
با سلام خدمت دوستان عزیز.
من میخواهم اطلاعات یک دانشجو را ذخیره کنم. روش طراحی بانک اطلاعاتی که من تا به حال یاد گرفتم به صورت زیر است:

جدول دانشجو ---------------------------------------------- جدول رشته

reshteh_Name reshteh_Code ---------------reshteh_Code id name family


-------------------------------------------------------------------------------------------------------------------------------------------
اما استاد جدیدی که ما این ترم برای طراحی بانک اطلاعاتی داریم میگه این روش خوب نیست و بهتره جدول اینطوری طراحی بشه:

جدول دانشجو

id name family reshteh_Name

میگه چون هزینه inner join زیاده بهتره از این روش استفاده بشه.
-------------------------------------------------------------------------------------------------------
در این حالت اگه 2000 تا دانشجو داشته باشیم 2000 بار مقدار مثلاً کارشناسی ناپیوسته کامپیوتر تکرار میشه!!!!!!!!!!

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

AminSobati
سه شنبه 20 فروردین 1387, 13:17 عصر
میلاد جان روش استاد محترم شما برای من هم عجیبه به دلیل اینکه در حقیقت Denormalize انجام دادن. اجتناب از Normalize کردن و روی آوردن به Denormalization یک تفکر کلاسیک و قدیمیه. زمانی که سخت افزارها بسیار ضعیف بودند و انجام حتی Joinهای ساده باعث میشد سرور به زانو در بیاد، Denormalization مورد توجه بود. اما امروزه با توجه به اینکه سرعت پیشرفت و بهبود تکنولوژی سخت افزار بیشتر از سرعت رشد حجم بانک اطلاعاتی ماست، Normalization به دلیل اصولی بودن و انطباق بر قوائد Relational Database از اولویت بالاتری برخورداره.
اگرچه روش استاد شما قطعا در Query گرفتن سرعت بهتری نسبت Join داره، اما این مشکل رو داره که در صورت نیاز به تغییر یا تصحیح نام رشته در جدول رشته ها، باید در جدول دانشجویان هم Update صورت بگیره. این کار میتونه توسط Trigger که روی جدول رشته ها نوشته میشه انجام بگیره.
Denormalize زمانی توجیه داره که فرضا یک Query به دفعات بسیار زیاد در طول روز اجرا میشه و با توجه به حیاتی بودن سرعت اون، به نظر برسه که Join موجود واقعا به کارآیی سیستم آسیب میرسونه. در این حالت با سبک سنگین کردن، ممکنه تصمیم به Denormalization گرفته بشه

Milad Mohseny
چهارشنبه 21 فروردین 1387, 12:22 عصر
با تشکر از پاسخ شما استاد عزیز

اگرچه روش استاد شما قطعا در Query گرفتن سرعت بهتری نسبت Join داره
من 2 بانک جدا گانه یکی با روش خودم و دیگری با روش استادم ساختم و 2 میلیون رکورد توش اضافه کردم. با روش خودم حجم فایل بانک اطلاعاتی 170mb و با روش استادم 270mb شد (حالا اگه 10 تا جدول که هرکدوم 10 تا فیلد داشت میساختم احتمالاً اختلاف به چند گیگ میرسید). در Query گرفتن هم آنچنان تفافتی با هم نداشتند با timespan زمان هارو بدست آوردم در اکثر مواقع حتی روش من سریعتر بود و در بعضی مواقع چند صدم ثانیه کند تر بود.
خیلی ممنون از پاسخ شما استاد عزیز.