PDA

View Full Version : نظر درمورد طراحی جدول



حمیدرضاصادقیان
یک شنبه 30 خرداد 1389, 23:33 عصر
سلام خدمت اساتید گرام.
عرضم به خدمتتون که من یک دیتابیس دارم طراحی میکنم.
در این دیتابیس یک جدول مربوط به لیست مشتریان هست.
این مشتریان یک نرم افزار خریداری میکنند و این نرم افزار هم قسمتهای مختلفی داره.
هر مشتری بنا به نیازش یک بخشی از این قسمتها رو خریداری میکنه.
حالا برای طراحی جدول، من اگر تمام اون فیلدهارو در جدول خود مشتری تعریف کنم و به صورت bit باشه و تک تک اونهاروو انتخاب کنم؟
یا بیام یک جدول طراحی کنم و تمامی قسمتهای برنامه رو اونجا قرار بدم بعد به جدول مشتری ارتباط بدم؟
خوب در روش دوم اگر یک مشتری چند قسمت رو خرید بود اون وقت رکوردهای تکراری زیاد میشه.
باز روش سومی که به ذهنم رسید اینه که یک جدول جزئیات هم برای مشتری تعریف کنم و در این جدول فقط فیلد خواص برنامه ، ردیف و کد مشتری باشه و برای هر قسمت یک ردیف در این جدول اضافه کنه.
روش چهارم اینه که بیام در همون جدول مشتری یک فیلد برای قسمتهای مختلف طراحی کنم و در جدول بخشهای برنامه، کد قسمتهای برنامه به صورت دودویی باشه. و وقتی کاربر چند قسمت رو باهم انتخاب کرد مجموع ارقام دودویی که همون کد بخشهای مختلف میشه در اون فیلد ذخیره کنم.بعد در برنامه این کدهارو تفکیک کنم تا ببینم کدوم بخشها خریداری شده.
حالا با توجه به این روشهایی که پیشنهاد دادم کدومش بهینه تر هست و در گزارشات به مشکل برنمیخورم،
اگر روش بهتری وجود داره ممنون میشم راهنمایی بفرمائید.
با تشکر.

محمد سلیم آبادی
دوشنبه 31 خرداد 1389, 00:43 صبح
سلام دوست من (البته منو جز اون اساتید قرار ندین (: )

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

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


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

اگر منظورتون این هست که در یک جدول اسامی همراه با مشخصات هر بخش را ذخیره کنید و از یک جدول واسط (Junction Table) برای ایجاد یک ارتباط Many to Many استفاده کنید، من می گویم بهترین روش، استاندارد ترین روش و اصولی ترین روش همین روش است! به این روش به اصطلاح Open Schema گفته می شود.

چرا فکر می کنید رکوردهای تکراری در بانک ذخیره می شود؟ (اگر یک نمونه از داده هایتان را قرار می دادین و شفاف تر مساله را توضیح می دادین بهتر بود)

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

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

حمیدرضاصادقیان
دوشنبه 31 خرداد 1389, 10:53 صبح
سلام.ممنون.
ببینید من یک جدول برای لیست مشتریان دارم.
مشتری میاد برنامه رو خریداری میکنه.
نرم افزار امکاناتی مثل خریدو فروش- انبار- اسناد دریافتنی و... داره. و این امکانات درحال تغییر هستند.
قبلا جدول به این صورت بود که به ازای هر کدوم از این قابلیتها در جدول مشتری یک فیلد از نوع bit قرار داشت که کاربر هرکدوم از این قسمتها رو انتخاب میکرد اون فیلدها تغییر میکرد.که به نظر منم کاملا اشتباهه.چون اگر قرار باشه این امکانات تغییر کنه مجبوریم دائم اون جدول رو تغییر بدیم.
حالا اگر جدول واسط بسازم به چه صورت میشه؟
یعنی ارتباط اون با جدول مشتری چطوری میشه.؟

یعنی در جدول واسط یک فیلد id باشه یک فیلد هم نام قسمتهای مختلف برنامه؟؟
بعد اگر کاربر چند قسمت رو خریداری کرد چطوری باید اینو مشخص بکنم؟
یعنی باید یک جدول Detail هم برای مشتری بذارم که یک فیلد id_customer داره برای ارتباط با جدول مشتری یک فیلد id_section برای ارتباط با جدول مشخصات.و به ازای هر قسمتی که مشتری خرید کرد من یک رکورد در این جدول اضافه کنم؟ و ترکیب این دوتا فیلد باهم رو کلید قرار بدم؟

باتشکر

محمد سلیم آبادی
دوشنبه 31 خرداد 1389, 12:50 عصر
بعد اگر کاربر چند قسمت رو خریداری کرد چطوری باید اینو مشخص بکنم؟
یعنی باید یک جدول Detail هم برای مشتری بذارم که یک فیلد id_customer داره برای ارتباط با جدول مشتری یک فیلد id_section برای ارتباط با جدول مشخصات.و به ازای هر قسمتی که مشتری خرید کرد من یک رکورد در این جدول اضافه کنم؟ و ترکیب این دوتا فیلد باهم رو کلید قرار بدم؟

دقیقا همین چیزی هست که گفتین.

شما امکانات نرم افزار را داخل یک جدولی به نام "امکانات" ذخیره کنید که دارای دو ستون id و Name باشه.
جدول مشتریان هم که مشخصه دارای یک ستون کلید به نام customer_id و سایر ستون هاست.
حالا یک جدول واسط ایجاد کنید که دارای دو ستون id از جدول "امکانات" و customer_id از جدول مشتریان باشه. ترکیب این دو ستون کلید اصلی را تشکیل میده.
بر فرض اگر مشتری سه بخش را انتخاب کرد بایستی سه سطر در جدول واسط برای این منظور درج بشه و موقع نمایش شاید علاقه مند باشید که داده ها مثلا به شکل زیر در بیاد:
نام مشتری لیست امکانات نرم افزار خریداری شده
------------ ------------------------------------------
حسن خرید و فروش، اسناد
رضا اسناد، انبار
اکبر خرید و فروش، اسناد، انبار و ....

برای الحاق کردن سطرها به این شکل من روشهای زیادی را به شما پیشنهاد می کنم که میتونید از این مقاله مطالعه کنید:
http://www.30sharp.com/ShowArticle.aspx?nid=13&did=214&AuthorID=11

حمیدرضاصادقیان
دوشنبه 31 خرداد 1389, 13:14 عصر
ممنون از توضیحات کاملتون.البته برای نمایش دیگه در برنامه روی یک groupCheklist نمایش میدم. اون کاری نداره.من توی این طراحی شک کرده بودم که به نظر خودم هم همین راهی که گفتم درست بود که شما هم تائید کردید.باتشکر.