PDA

View Full Version : سوال: افزونگی



mona11
شنبه 30 آبان 1388, 09:37 صبح
سلام ،من 3 تا جدول دارم که یکی مربوط به مشتری هست و یکی هم مشخصات چک ها رو ذخیره میکنه.و جدول سوم رابطه این دو تا رو نگه میداره،حالا اگه هر مشتری 10 تا چک بده اونوقت تو این جدول سوم خیلی افزونگی ایجاد میشه.چه راهی پیشنهاد میکنید؟

galaxy1985
شنبه 30 آبان 1388, 10:12 صبح
با اين توضيحاتي كه دادين به نظر نمياد جدول سومي نياز باشد،مي توني تو همون جدول چك شماره مشتري(كليد جدول مشتري)را براي هر چك ذخيره كني.
اگه اشتباه متوجه سوالت شدم لطفا بيشتر توضيح بده.

Reza.ariyan
شنبه 30 آبان 1388, 11:52 صبح
نرمال ترین حالت همینه
دیگه بیشتر از این نرمال نمیشه
تو این روش که انتخاب کردید کمترین افزونگی داده ها هست و در صورتی که میخواهید جست و جو سریع تر بشه فیلد Customer_ID رو ایندکس کنید که زیاد هم تفاوتی نمیکنه

pourang_us
شنبه 30 آبان 1388, 12:01 عصر
دوست عزیز
درود

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

در نهایت به نظر من حجم بالای اطلاعات باعث ایجاد افزونگی در بانک نیست!!

موفق باشید.

sia_2007
شنبه 30 آبان 1388, 14:53 عصر
به نظر من بهترین حالت این بود که شما یک جدول عملیاتی داشته باشید به نام پرداخت؛
که مشتری، نحوه پرداخت، دلیل پرداخت و تحویل گیرنده و بانک عامل در آن وارد شوند.
و البته برای بهبود کار و از همه مهم تر حفظ سوابق؛ تعدادی فیلدهای جانبی در جدول عملیاتیتان داشته باشید.
جدول عملیاتی = واسط = Junction Table
برای مثال پس از Join و گرفتن گزارش از طریق Select چنین چیزی گیرمان میآمد :

آقای ابراهیمی - چک - خرید سرویس - صندوق دار 1 (مثلا خانم فراهانی). تاریخ :1388/9/16 - تاریخ سر رسید : 21/10/1388 - بانک عامل : سپه - مبلغ : 500000 ریال.

خانم میناوند - نقد - جریمه - صندوق دار 2 (مثلا خانم محمدی) - تاریخ : 16/9/1388 - تاریخ سررسید : 16/9/1388 بانک عامل : ندارد مبلغ : 12000 ریال

آقای جواهری - پیش پرداخت - خدومات جانبی - صندوق دار 1 - تاریخ 16/9/1388 تاریخ سررسید 16/9/1388 بانک عامل ندارد مبلغ 25000 ریال

این طوری هم سوابق حفظ میشه؛ هم انواع اقسام گزارشات پیچیده به راحتی به دست میآید.

و البته نکته ای که آقا یا خانم Galexy1985 متذکر شده اند.
در حالتی که من و این دوست عزیزمون متوجه شده اند (شاید هر دوی ما اشتباه متوجه شده ایم)؛ شما نیازی به جدول واسط یا Junction Table ندارید؛ چون میتوان در جدول چک شماره مشتری رو هم نگه داشت؛ چون رابطه ی شما یک به چند است و نیازی به شکستن ندارد؛ (اصلا شکسته نمیشود).
مگر این که بعضی از چکهای شما توسط بیش از یک مشتری امضا بخورند؛ مثلا 2 امضایی باشند؛ که در این صورت اگر مشتریان شما حقوقی نباشند؛ طراحی شما صحیح میباشد.
مثلا در جدول واسطتان بگویید؛
چک شماره یک مشتری شماره یک
چک شماره یک مشتری شماره دو
که در این صورت؛ چک شماره یک را دو نفر امضا کرده اند.
حال خواستید؛ نظرتان را بنویسید تا ببینیم چه کار باید کرد.
موفق باشی

mona11
شنبه 30 آبان 1388, 19:54 عصر
خیلی ممنون از جوابی که دادین(sia_2007)فکر کنم اگه جدول سومی هم در کار باشه بهتره چون اینطوری احتمال گیج شدن خودم کمتره.فکر نکنم فرقی داشته باشه چون در صورتی که دو تا جدوله کارو انجام بدم اونجا هم شماره id تکرار میشه