PDA

View Full Version : آیا در طراحی دیتابیس بهتر است جداول یک جنس را از هم جدا نمود (شی گرائی) یا همه را در یک جدول نوشت؟



NaserHadi
سه شنبه 14 آذر 1391, 12:53 عصر
با سلام
در طراحی دیتا بیس یک برنامه موجودیت های مشابهی وجود دارند که طبق قانون شی گرائی باید آنها از هم جدا شوند ولی در عمل ساده تر آن است که تمام آن موجودیت ها در یک جدول باشند
کدام یک از این دو روش بهتر است؟
مثلا در طراحی دیتا بیس یک فروشگاه چند موجودیت از نوع انسان وجود دارد :

1 : کارمند فروش
2 : مشتری
3: پیک موتور ( به جهت بردن وسایل به در خانه مشتری های دایمی که با تلفن خرید می کنند)


95998

هر یک از موجودیت ها فیلد های خاص خود را دارند که فقط مختص خود ان شخص است مثلا در جدول کارمند ممکنه که یک فیلد برای ذخیره عکس قرار داده بشه ولی در جدول مشتری چنین فیلدی اصلا لازم نیست

NaserHadi
سه شنبه 14 آذر 1391, 13:37 عصر
و یا اینکه قرار دادن تمام فیلد های هر سه جدول در جدول اول مانند جدول زیر


96002

در این حالت هم کلی فیلد خالی هنگام ذخیره اطلاعات بوجود می یاد

NaserHadi
سه شنبه 14 آذر 1391, 13:58 عصر
حالت اول از انباشته شدن بی خود فیلدهای اضافی در جدول که خالی خواهند ماند جلوگیری می کنه ولی در عوض پیاده سازی و نوشتن کوئری برای آن دشوار است
ولی در عوض روش دوم بسیار ساده پیاده سازی میشه و پرس و جو از این جدول بسیار راحت تر است
من تقاضا دارم نظر اساتید محترم رو هم جویا بشم

hamid.karimy
سه شنبه 14 آذر 1391, 14:08 عصر
بدون شک روش اول.شک نکنید هم در سرعت برنامه نویسی و هم ادیت و هم خود نرم افزارتون ، حالت اول بهتر است

NaserHadi
سه شنبه 14 آذر 1391, 14:35 عصر
با تشکر از پاسخ شما
اگر ممکنه راجع به فیلدها هم نظر خود را بفرمائید که بهتره چه فیلدی کجا و در کدام جدول باشه
مثلا
بعضی از پرس و جو ها در این روش بسیار پیچیده میشه مثلا وقتی که یک مشتری با تلفن دومش زنگ میزنه که تلفن دوم در جدول مشتری ذخیره شده و تلفن اول در جدول شخص
کوئری برای در یافت مشخصات فرد تماس گیرنده بر اساس شماره تلفن چطور نوشته میشه ؟

hamid.karimy
سه شنبه 14 آذر 1391, 14:57 عصر
ببین طراحی کاملا درسته ، یه ویو درست کن ازش یعنی مشتری و شخص

حمیدرضاصادقیان
سه شنبه 14 آذر 1391, 20:27 عصر
سلام.
ببینید یکی از اصول طراحی این هست که شما ابتدا موجودیت ها رو شناسایی کنید.
سپس Attribute های هر موجودیت رو بنویسید.
موجودیت های یکسان اونهارو جمع بندی کنید.
اگر نیاز بود موجودیت ها رو در چند جدول قرار بدید.
ببینید در ساختار شما میتونید جداول مشتری - موتوری و شخص رو یک جدول در نظر بگیرید به خاطر اینکه همه فیلدها تکراری است و این کارشما اشتباهه.بعدا در توسعه سیستم به مشکل برخواهید خورد.
ولی برای پرسنل یک جدول جدا در نظر بگیرید چون ممکنه پارامترهای دیگه به ان اضافه بشه که نیازی نباشه با جدول مشتریان شما یکی باشه.

NaserHadi
چهارشنبه 15 آذر 1391, 22:19 عصر
آقای صادفیان با تشکر از پاسختون
اجازه بدید یه خورده موضوع رو باز تر کنم و سوال رو واضح تر بپرسم تا نتیجه لازم گرفته بشه چون من دقیقا متوجه نشدم
سوال اول کلی است
1: در شناسائی موجودیت ها وقتی چند موجودیت یک جنس باشه که یک سری Attribute مشابه و باقی آنها متفاوت باشه راه حل درست چیه ؟
اینکه هر موجودیت باید در جدول جداگانه قرار داده بشه یا اینکه نه همه را در یک جدول قرار می دیم و خلاص
مثلا در مثال بالا سه موجودیت وجود دارد که هر سه از نوع انسان هستند و هر سه ی آنها صفات اسم - فامیل - آدرس - تلفن - موبایل را دارند که برای هر سه موجودیت لازم است
ولی هر کدام هم یک سری صفات ویژه مخصوص خود دارند که برای ذیگری لازم نیست
ضمنا با جزئیات صفات هم کاری نداریم ولی فرض بر این است که هر موجودیت چند فیلد مختص به خود دارند که به دیگری لازم نیست

حمیدرضاصادقیان
چهارشنبه 15 آذر 1391, 22:28 عصر
ببینید مسئله رو اینجوری ببینید.
اگر مثلا فقط یک فیلده میتونید در یک جدول ببینید.
ولی مثلا جدول پرسنلی ممکنه خواص اون بیشتر بشه ودر ساختارهای کلی برنامه دائم ازش استفاده بشه و دسترسی های کاربر مشخص بشه.پس نیاز هست که کلا جدابشه چون همه خاصیت های آن با جدول مشتریان ما متفاوته.
مورد بعد اینه شما میتونید یک ذره از خواص شی گرایی در تجزیه تحلیل استفاده کنید.
فرضا تمامی اشخاص در جدول اشخاص تعریف شوند.بعد برای موتوری که نیاز هست پلاک موتور نیز ضبط بشه در یک جدول با Relation مربوط به کد شخص میتونید پلاک رو نگهداری کنید و تمامی مشخصات اون شخص در جدول مشتریان قرار داره و دیگه فیلدی مثل تلفن دائما د رجداول مختلف پیاده سازی نمیشه.

مهدی هادیان2
شنبه 18 آذر 1391, 22:16 عصر
بسم الله الرحمن الرحیم
با سلام
وقتی می توان فیلدهای مشترک چند جدول رو در یک جدول جمع آوری کرد و به عنوان پدر معرفی کرد که 2شرط داشته باشند:
1- تعدادی فیلد مشترک داشته باشند.
2- (خیلی مهم) جایگاه مشابهی در سیستم ما داشته باشند.
مثلا در سیستم هواپیمایی خلبان و مسافر رو در نظر بگیرید با اینکه شرط اول رو دارا می باشد ولی شرط 2 صادق نیست. چراکه جایگاه خلبان و مسافر در سیستم یکسان نیست.
موفق باشید.

baktash.n81@gmail.com
یک شنبه 19 آذر 1391, 08:00 صبح
از نظر من ... فرقی نمی کنه که شخص چه کاره باشه یعنی کارکن فروش باشه یا پیک باشه یا مشتری یه آدمه که یه سری صفات مثل نام و نام خانوادگی و ... داره - و یه نقش داریم که این آدم ها نقش های مختلفی ممکنه داشته باشند که نقش های متفاوت ممکنه صفات متفاوتی داشته باشه ... پس همه کاربرها رو می زارم توی جدول با یه فیلد نقش آدم ها رو مشخص می کنم و برای هر نقش یه جدول جدا در نظر می گیرم ... (اگه این امکان وجود داشته باشه که یه نفر دارای چند نقش باشه از یه جدول واسط برای نقش و کاربر می زارم) ... حالا نکته ایی که وجود داره اینه که شما یه سایت می خواین طراحی کنید که هزاران مشتری داره ولی 20 کارمند داره ... ولی هر دفعه که می خواین اطلاعات کارمند رو بخونین باید برید از یه جدولی با هزاران رکورد این کارو بکنید که ممکنه مقداری بازدهی سیستم رو پایین بیاره ... در نتیجه ممکنه این تصمیم رو بگیرید که اطلاعات مشتری ها رو از سایر اشخاص جدا کنید ...

NaserHadi
یک شنبه 19 آذر 1391, 19:20 عصر
2- (خیلی مهم) جایگاه مشابهی در سیستم ما داشته باشند.
مثلا در سیستم هواپیمایی خلبان و مسافر رو در نظر بگیرید با اینکه شرط اول رو دارا می باشد ولی شرط 2 صادق نیست. چراکه جایگاه خلبان و مسافر در سیستم یکسان نیست.
موفق باشید.

آقای هادیان میشه بیشتر توضیح بدید البته در مورد شرط دوم
مثلا در مثال ما جایگاه افراد با هم مشابه اند یا نه؟

NaserHadi
یک شنبه 19 آذر 1391, 19:33 عصر
مورد بعد اینه شما میتونید یک ذره از خواص شی گرایی در تجزیه تحلیل استفاده کنید.
فرضا تمامی اشخاص در جدول اشخاص تعریف شوند.بعد برای موتوری که نیاز هست پلاک موتور نیز ضبط بشه در یک جدول با Relation مربوط به کد شخص میتونید پلاک رو نگهداری کنید و تمامی مشخصات اون شخص در جدول مشتریان قرار داره و دیگه فیلدی مثل تلفن دائما د رجداول مختلف پیاده سازی نمیشه.

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

مهدی هادیان2
دوشنبه 20 آذر 1391, 08:39 صبح
بسم الله الرحمن الرحیم
با سلام

آقای هادیان میشه بیشتر توضیح بدید البته در مورد شرط دوم
مثلا در مثال ما جایگاه افراد با هم مشابه اند یا نه؟
نه جایگاه پرسنل و مشتری در سیستم شما یکسان نیست.
آقای صادقیان مطلب زیبائی در این مورد گفتند:


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