خانه/ مدل‌سازی داده (CDM، LDM، PDM)/ تحلیل و بازبینی نمودار ER

تحلیل و بازبینی نمودار ER: چک‌لیست و اشتباه‌های رایج با مثال

متوسط ۱۳ دقیقه مطالعه

کشیدن نمودار فقط نیمی از کار است؛ نیمه‌ی دیگر خواندن و نقد آن است. استاد در تصحیح پروژه، همکار در بازبینی کد و خودت در ماه‌های بعد همین کار را می‌کنید. این درس یک روش منظم برای تحلیل نمودار می‌دهد.

روش اول: نمودار را به جمله تبدیل کن

هر ارتباط را از هر دو جهت با کاردینالیتی‌اش بخوان. اگر جمله بی‌معنی یا غلط بود، نمودار ایراد دارد:

کاردینالیتیجمله‌ی خوانده‌شده
Customer (0,n) — Order (1,1)هر مشتری صفر یا چند سفارش دارد؛ هر سفارش دقیقاً به یک مشتری تعلق دارد.
Student (0,n) — Course (0,n)هر دانشجو صفر یا چند درس را ثبت‌نام می‌کند؛ هر درس صفر یا چند دانشجو دارد.
Employee (0,1) — Manager (0,n)هر کارمند حداکثر یک مدیر دارد (مدیرکل ندارد)؛ هر مدیر صفر یا چند کارمند را مدیریت می‌کند.

چک‌لیست بازبینی

بخشسؤال بازبینی
۱. موجودیت‌هاهر موجودیت یک «چیز» واقعی است؟ نام مفرد و یکتاست؟ موجودیت اضافی یا جاافتاده نیست؟
۲. صفت‌هاصفت محاسبه‌ای (مثل سن) یا چندمقداری (چند تلفن در یک ستون) نیست؟
۳. کلیدهاهر جدول کلید اصلی دارد؟ کلید مناسب (یکتا و پایدار) است؟
۴. ارتباط‌هاهر ارتباط نام معنادار دارد؟ چندبه‌چندی بدون جدول واسط نیست؟
۵. کاردینالیتیحداقل و حداکثر هر دو سر مشخص و مطابق قواعد کسب‌وکار است؟
۶. نرمال‌سازیتکرار داده یا وابستگی انتقالی (3NF) ندارد؟
۷. نمادگذارینمادگذاری در کل نمودار یکدست است؟ نمودار خوانا و بدون تقاطع اضافی است؟
۸. قابل‌پیاده‌سازیمی‌توان از آن اسکریپت SQL ساخت که همه‌ی نیازها و قواعد را پوشش دهد؟

اشتباه ۱: رابطه‌ی چندبه‌چند بدون جدول واسط

در نمودار منطقی، رابطه‌ی M:N را مستقیم نمی‌توان پیاده کرد. «ثبت‌نام» هم صفت دارد (نمره) که به هیچ‌یک از دو جدول تعلق ندارد.

Grade ??? StudentPK StudentIdFullName CoursePK CourseIdTitle
نادرست ✗ — نمره را کجا نگه می‌داری؟ این نمودار قابل‌پیاده‌سازی نیست.
StudentPK StudentIdFullName EnrollmentFK StudentIdFK CourseIdGrade CoursePK CourseIdTitle
درست ✓ — جدول واسط دو کلید خارجی و صفت Grade دارد.

اشتباه ۲: جدول بدون کلید اصلی و صفت‌های ناسالم

Customer (نادرست ✗)FullNamePhones (09121, 09351, ...)BirthDateAgeCity
ایرادها: کلید اصلی ندارد، Phones چندمقداری است، Age از BirthDate قابل‌محاسبه است.
Customer (درست ✓)PK CustomerIdFullNameBirthDateCity CustomerPhonePK,FK CustomerIdPK Phone
اصلاح: کلید اصلی، جدول جدا برای تلفن‌ها و حذف Age.

اشتباه ۳: کاردینالیتی برعکس

نمودار می‌گوید «هر درس چند استاد دارد و هر استاد فقط یک درس». اما در واقعیت یک استاد چند درس می‌دهد و هر درس (در سیستم ما) یک استاد دارد. جمله را بخوان و با صورت مسئله مقایسه کن؛ اگر جهت برعکس باشد، کلید خارجی در جدول اشتباه قرار می‌گیرد (CourseId در Teacher به‌جای TeacherId در Course).

این یکی از رایج‌ترین ایرادهاست و پیامدش جدی است: دیتابیس نمی‌تواند یک استاد را به چند درس وصل کند و برنامه از همان ابتدا به مشکل برمی‌خورد.

اشتباه ۴: تکرار داده و نقض نرمال‌سازی

وقتی در جدول Employee ستون‌های DeptName و DeptManager برای هر کارمند تکرار می‌شوند، تغییر نام یک بخش باید در صدها ردیف انجام شود. راه‌حل: جدول Department جداگانه و فقط DeptId در Employee (به نرمال‌سازی مراجعه کن).

اشتباه ۵: ترکیب سطح‌ها

  • نوشتن نوع داده و INT IDENTITY در مدل مفهومی (CDM).
  • گذاشتن کلید خارجی به‌عنوان صفت در CDM؛ ارتباط خودش کار FK را می‌کند.
  • نشان دادن ایندکس و قید فیزیکی در مدل منطقی.
  • نام‌های متفاوت یک شیء در سه مدل (ردیابی ناممکن می‌شود).

معیار نمره‌دهی پیشنهادی برای تحلیل پروژه

معیارامتیاز
تحلیل نیازمندی و تطابق مدل با آن۲۰٪
درستی موجودیت‌ها، صفت‌ها و کلیدها۲۰٪
درستی ارتباط‌ها و کاردینالیتی۲۰٪
نرمال‌سازی (حداقل 3NF) با توضیح۲۰٪
خوانایی نمودار و یکدستی نمادگذاری۱۰٪
اسکریپت اجراپذیر و نمونه‌پرس‌وجوها۱۰٪

تمرین: مدل کتابخانه را در طراح تعاملی باز کن و چک‌لیست بالا را روی آن اجرا کن. بعد به تمرین‌های حل‌شده برو.

تمرین‌های خودآزمایی

اول خودت جواب بده، بعد پاسخ را باز کن و مقایسه کن.

۱در نمودار یک فروشگاه، بین Customer و Product مستقیم رابطه‌ی چندبه‌چند «خرید» کشیده شده است و تعداد خرید روی خط نوشته‌اند. چه ایرادی دارد و چطور اصلاحش می‌کنی؟نمایش پاسخ
پاسخ

چندبه‌چند در مدل منطقی باید با جدول واسط شکسته شود و «تعداد» صفتِ رابطه است. بهتر است زنجیره‌ی Customer → Order → OrderItem ← Product مدل شود و Quantity و قیمت در زمان خرید در OrderItem نگه‌داری شود (چون یک مشتری ممکن است یک محصول را چند بار و در چند سفارش بخرد).

۲جدول Employee ستون‌های DeptName و DeptManager دارد که برای هر کارمند تکرار می‌شوند. کدام ناهنجاری و چه فرم نرمالی نقض شده است؟نمایش پاسخ
پاسخ

وابستگی انتقالی (EmployeeId → DeptId → DeptName, DeptManager) و در نتیجه 3NF نقض شده و ناهنجاری به‌روزرسانی داریم. راه‌حل: جدول Department جدا با کلید اصلی DeptId و کلید خارجی در Employee.

۳چرا ستون Age در کنار BirthDate ایراد دارد؟نمایش پاسخ
پاسخ

Age قابل‌محاسبه از تاریخ تولد است (داده‌ی مشتق‌شده) و هر روز تغییر می‌کند؛ ذخیره‌اش باعث ناسازگاری می‌شود. فقط BirthDate را نگه دار و سن را در پرس‌وجو محاسبه کن.