به عنوان یک توسعهدهنده نرمافزار، ساعتهای بیشماری را صرف طراحی الگوهای پایگاههای دادهای کردهام که به نام طرحوارههای پایگاه داده معروف هستند و علاوه بر این با متخصصان زیادی در این باره گفتوگو کردهام. هر بار که یک پروژه پایگاه داده را طراحی کردهام، در پیشبینی مشکلات احتمالی و جلوگیری از بروز آنها تجربه بیشتر کسب کردم، به طوری که پایگاههای داده بهتر از قبل طراحی میشدند. دانش فعلی من آمیزهای از تجربیات خودم و نقطه نظرات متخصصانی است که در طول این سالها با آنها کار کردهام.
پیشنهاد مقاله: الگوریتم چیست و چرا دانستن آن مهم است؟
بانک اطلاعاتی به چه معنا است؟
ابتدا اجازه دهید به بررسی این موضوع بپردازیم که پایگاه داده (Database) چیست. یک پایگاه داده یا بانک اطلاعاتی مجموعهای ساختارمند از دادهها است که به شکل الکترونیکی در یک سیستم کامپیوتری ذخیره میشوند و دسترسی به آنها از طریق برنامههای کاربردی انجام میشود. با توجه به اینکه بانکهای اطلاعاتی امروزه شکل پیشرفتهای پیدا کردهاند، طراحی پایگاه داده بر مبنای به کارگیری روشهای طراحی و مدلسازی ساختارمند انجام میشود.
سیستم مدیریت بانک اطلاعاتی و انواع آن
یکی از موضوعات مهمی که باید در این زمینه به آن دقت کنید، سیستم مدیریت پایگاه داده (DBMS) است که نرمافزاری است که با کاربر نهایی، برنامههای کاربردی و پایگاه داده برای ثبت و تحلیل داده مرتبط است. به بیان دیگر، DBMS نرمافزاری است که ضمن ارائه قابلیتهای اصلی برای مدیریت بانک اطلاعاتی، قابلیتهای دیگری به منظور تعامل با بانک اطلاعاتی در اختیار برنامهنویسان یا کاربران قرار میدهد.
یکی از پر کاربردترین سیستمهی بانکهای اطلاعاتی که روزانه توسط شرکتهای مختلفی مورد استفاده قرار میگیرد، سیستمهای پایگاه داده رابطهای (Relational Database Systems) است. در این مدل بانکهای اطلاعاتی، دادهها در قالب سطرها و ستونهای جدولها ذخیرهسازی میشوند و اغلب توسعهدهندگان از زبان SQL برای نوشتن دادهها در پایگاه داده و درخواست اطلاعات (کوئری) استفاده میکنند.
دومین گزینه مطرح در این زمینه بانکهای اطلاعاتی غیررابطهای (Non-Relational Databases) است که به آنها NoSQL گفته میشود. پایگاه دادهها NoSQL نوعی از پایگاه دادهها است که برای تعامل با آن باید از زبان پرسمان یا کوئری (Query Language) استفاده شود.
طراحی بانک اطلاعاتی به چه معنا است؟
طراحی بانک اطلاعاتی به معنای سازماندهی دادهها مطابق با مدل بانک اطلاعاتی است. توسعهدهنده و طراح بانک اطلاعاتی باید نوع دادههایی که قرار است ذخیره شوند و نحوه برقراری ارتباط عناصر داده با یکدیگر را مشخص میکند. بر مبنای این تعریف باید بگوییم که طراحی پایگاه داده شامل طبقهبندی و شناسایی ارتباط متقابل دادهها با یکدیگر است و اشاره به مجموعهای از فرایندها دارد که طراحی، توسعه، پیادهسازی و نگهداری سیستمهای مدیریت داده کسب و کار را ساده میکند.
نکته مهمی که هنگام طراحی پایگاه داده باید به آن دقت کنید ساخت مدلهای فیزیکی و منطقی سیستم پایگاه داده است. مدل منطقی روی نیازمندیها و دادههایی متمرکز است که به شکل مستقل از ملاحظات فیزیکی ذخیره میشوند.
مدل طراحی داده فیزیکی شامل ترجمه طراحی منطقی پایگاه داده در یک رسانه فیزیکی با استفاده از منابع سختافزاری و سیستمهای نرمافزاری مانند سیستم مدیریت پایگاه داده DBMS است.
مدلسازی و طراحی پایگاه داده چیست؟
اولین کاری که هنگام طراحی پایگاه داده باید انجام دهید آمادهسازی یک مدل داده مفهومی است که ساختار اطلاعاتی که باید در پایگاه داده نگهداری شوند را نشان میدهد. یک رویکرد مهم هنگام طراحی این مدل مفهومی، مدل موجودیت-رابطه است که از ابزارهای مشخصی برای طراحی آن استفاده میشود.
رویکرد دیگری که برای ساخت مدل داده مفهومی در دسترس است، زبان مدلسازی یکپارچه UML مخفف (Unified Modeling Language) است. به طور مثال، اگر در دنیای واقعی افراد میتوانند بیشتر از یک شماره تلفن داشته باشند، در مدل نیز باید توانایی ذخیرهسازی بیش از یک شماره تلفن وجود داشته باشد. به منظور طراحی یک مدل مفهومی دقیق باید درک کاملی از شرکتی که قصد طراحی پایگاه داده را برای آن دارید به دست آورید.
ساخت یک مدل داده مفهومی که پاسخگوی کاربران باشد مرحله بعدی توسعه پایگاه داده است که ترجمه مدل به طرحواره پایگاه داده (Database Schema) نام دارد که ساختار داده مرتبط با دادهها در پایگاه داده را پیادهسازی میکند. فرایند مذکور طراحی منطقی پایگاه داده (Logical Database Design) نام دارد و خروجی آن یک مدل داده منطقی (Logical Data Model) است.
محبوبترین مدل طراحی پایگاه داده، مدل همهمنظوره رابطهای است که مبتنی بر زبان SQL است. فرایند ساخت یک طراحی پایگاه داده منطقی با استفاده از این مدل، مبتنی بر رویکرد نرمالسازی (Normalization) است. هدف از نرمالسازی اطمینان از این موضوع است که اطلاعات تنها در یک مکان ذخیرهسازی میشوند. از اینرو، عملیات درج، بهروزرسانی و حذف به شکل خودکار انجام شده و در تمامی این فرآیندها سازگاری پایگاه داده حفظ میشود.
گام انتهایی در طراحی پایگاه داده اتخاذ تصمیماتی در ارتباط با کارایی، مقیاسپذیری، بازیابی و امنیت است. این مفاهیم در قالب مفاهیمی که طراحی پایگاه داده فیزیکی (Physical Database Design) نام دارد انجام میشوند که خروجی آن، مدل داده فیزیکی است.
پیشنهاد مقاله: با رعایت این 10 نکته جادویی در یادگیری برنامهنویسی موفق خواهید بود
طراحی فیزیکی پایگاه داده چیست؟
طراحی فیزیکی پایگاه داده به معنای پیکربندی فیزیکی پایگاه داده روی رسانه ذخیرهسازی است. این کار شامل تعریف جزئیات برای عناصر داده، انواع داده، گزینههای شاخصگذاری و پارامترهایی میشود که سیستم مدیریت پایگاه داده از آنها استفاده میکند. مباحث دیگری که هنگام طراحی فیزیکی پایگاه داده مورد توجه قرار میگیرد، ماژولها، جزییات سختافزاری و نرمافزارهای پایگاه داده است. از مباحث مهمی که هنگام طراحی فیزیکی پایگاه داده باید به آنها دقت کنید به موارد زیر باید اشاره کرد:
امنیت: امنیت کاربر نهایی و امنیت مدیر پایگاه داده باید در بالاترین سطح باشد.
تکثیر: چه بخشهایی از دادهها در دیگر پایگاه دادهها کپی میشوند و این کار در چه زمانهایی باید انجام میشود.
دسترسپذیری بالا: پایگاه داده باید در همه شرایط در دسترس قرار داشته باشد تا عملیات تجاری مختل نشوند.
بخشبندی: اگر پایگاه داده توزیع شده است، برای یک موجودیت یکتا، توزیع داده در میان همه بخشهای پایگاه داده به چه نحوی انجام میشود و فرآیند بخشبندی به چه ترتیبی باید انجام شود.
مدل طراحی منطقی پایگاه داده
مدل پایگاه داده نوعی از مدل داده است که ساختار منطقی طراحی پایگاه داده را مشخص کرده و تعیین میکند که دادهها بر مبنای چه الگویی باید ذخیرهسازی، سازماندهی و دستکاری شوند. معروفترین نوع در این زمینه مدل رابطهای (Relational Model) است که از قالب مبتنی بر جدول استفاده میکند. از مدلهای داده منطقی رایج باید به پایگاه داده مبتنی بر ردیابی (Navigational Databases)، مدل پایگاه داده سلسلهمراتبی (Hierarchical Database Model)، مدل شبکه (Network Model)، پایگاه داده گراف (Graph Database)، مدل رابطهای (Relational Model)، مدل موجودیت رابطه (Entity–Relationship Model)، مدل موجودیت رابطه بهبودیافته (Enhanced Entity–Relationship Model)، مدل شی (Object Model)، مدل سند (Document Model)، مدل موجودیت-خصیصه-ارزش (Entity–Attribute–Value Model) و اسکیمای ستارهای اشاره کرد.
نرمالسازی در هنگام طراحی پایگاه داده
یکی از مهمترین اصولی که هنگام طراحی پایگاه داده باید به آن دقت کنید مبحث نرمالسازی است. هرچه طراحی نرمالتر باشد، تکرار دادههای کمتری وجود دارد و فضای کمتری اشغال میشود. برخی از اصول مدلسازی مانند رویکرد مدلسازی بُعدی (Dimensional Modeling) برای طراحی انبار داده (Data Warehouse)، صراحتا طراحی غیرنرمال را توصیه میکنند. امروزه از سطوح مختلفی از نرمالسازی استفاده میشود که 1NF ،2NF ،3NF ،BOYCE-CODD NF (3.5NF) ،4NF و 5NF نام دارند. دقت کنید سطوح بالاتر نرمالسازی به ندرت استفاده میشوند، زیرا نیازمند محاسبات پیچیدهای هستند که بار محاسباتی زیادی به پردازنده مرکزی وارد میکنند.
استثنایی که باید در این زمینه به آن دقت کنید پایگاه دادههای سند (Document Databases) هستند. سندی که در این مدل پایگاه دادهای ذخیرهسازی میشود، حاوی بیش از یک داده نرمال شده است و معمولا رابطه بین واحدها نیز به همین ترتیب است. اگر همه دادهها و روابط بین آنها در محاوره با یکدیگر بازیابی شوند، این رویکرد تعداد بازیابیها را بهینهسازی میکند. همچنین، روشی که دادهها تکرار میشوند تسهیل میشود.
پایگاههای داده به چه صورتی طراحی میشوند؟
اکنون که تا حدودی با اطلاعات اولیه در ارتباط با پایگاههای داده آشنا شوید، وقت آن رسید تا به بررسی یک نمونه مفهومی در این زمینه بپردازیم. برای طراحی یک پایگاه داده در نرمافزارهایی مثل اسکیوالسرور یا اکسس مایکروسافت باید به موارد زیر دقت کنید:
تعیین هدف پایگاه داده: این موضوع کمک میکند تا فرد برای گامهای بعدی طراحی نمودار موجودیت رابطه شناخت و اطلاعات کافی داشته باشد.
پیدا کردن و سازماندهی اطلاعات: این مرحله شامل جمعآوری تمامی دادههایی است که قرار است در پایگاه داده ثبت شود.
تقسیم اطلاعات در جداول مختلف: یک پایگاه داده خوب شامل انواع مختلفی از جداول است که هر یک اطلاعات مختلفی را نگهداری مینند. به بیان دقیقتر، در یک ساختار حرفهای قرار نیست تمامی اطلاعات درون یک جدول واحد قرار گیرند. تقسیمبندی اقلام به موجودیتها یا موضوعهای جداگانه مانند محصولات یا سفارشات، اطلاعات کاربری و…. که هر یک جدول مخصوص به خود را دارند باید به دقت انجام شود.
تبدیل اطلاعات به ستونها: ابتدا باید مشخص کنید که چه اطلاعاتی باید در هر جدول ذخیره شوند. هر عنصر به یک فیلد (Field) تبدیل و به صورت ستونی در جدول نمایش داده شوند. برای مثال، جدول کارکنان ممکن است شامل فیلدهایی مانند نام خانوادگی Last Name و تاریخ استخدام Hire Date باشد.
تعیین کلیدهای اصلی: کلید اصلی (Primary Key) هر جدول باید انتخاب شود. کلید اصلی یک ستون یا مجموعهای از ستونها است که برای تعیین هر سطر به صورت یکتا استفاده میشود. یک مثال در این زمینه Product ID یا Order ID است. دقت کنید که کلید اصلی حتما باید منحصر به فرد باشد. این کلید در تعامل با کلید خارجی ارتباط میان جداول را برقرار میکند.
پیادهسازی روابط جدول: به هر جدول نگاه کنید و سپس مشخص کنید که دادهها در یک جدول چگونه به دادههای موجود در جدولهای دیگر باید مرتبط شوند. فیلدهایی به جدولها اضافه یا جدولهای جدیدی برای شفافسازی روابط ایجاد کنید.
ویرایش طراحی: هنگامی که طراحی به پایان رسید باید آنرا در ارتباط با خطاهای احتمالی بررسی کنید و رکوردهای آزمایشی به آن اضافه کنید و سپس، بررسی کنید که آیا نتایج از جداول به شکل مورد انتظار استخراج میشوند یا خیر.
اعمال قوانین نرمالسازی: قوانین نرمالسازی دادهها روی جداول اعمال میشود تا مشاهده شود که آیا جدولها دارای ساختار درستی هستند یا خیر. همچنین، تنظیمات به صورت مورد نیاز روی جدولها باید انجام شوند.
در ادامه با اصول مهمی که هنگام طراحی پایگاههای داده باید به آنها دقت کنید، آشنا میشویم:
مشکل را درک کنید
قبل از تلاش برای طراحی هر چیزی، باید درک روشن و عمیقی از مشکل واقعی برنامهای که در حال ساخت آن هستید، داشته باشید. توجه داشته باشید که نگهداری پایگاههای داده از نظر زمانی و مالی هزینهبر است.
کنترل دسترسی را تعریف کنید
باید از خود بپرسید که کدام بخشها قرار است به پایگاه داده دسترسی داشته باشد. این دسترسی میتوان مستقیم یا غیر مستقیم باشد. آیا نیازمند تهیه نسخه پشتیبان از پایگاه داده هستید یا از استراتژی متفاوتی استفاده میکنید؟ آیا باید به افراد (توسعهدهندگان یا مدیران محصول) اجازه دسترسی مستقیم به پایگاه داده را بدهید؟ بسته به الزامات، ممکن است لازم باشد به موضوعات امنیتی به شکل متفاوتی نگاه کنید.
رویکرد پیشگیرانه اعمال کنترل دسترسی با استفاده از ابزارهای ارائه شده توسط موتور پایگاه داده است. در مورد پایگاه داده SQL، این توانایی را دارید تا برای کاربرانی که قصد دسترسی به پایگاه داده را دارند سطومح مختلفی از دسترسی را تعیین کنید.
طرحواره را روی کاغذ بنویسید (Write the Schema on Paper)
نوشتن طرحواره روی کاغذ ابتدا به طراح اجازه میدهد تا عیبهای طراحی را خیلی سریع پیدا کند. تصحیح خطاها با استفاده از مداد سادهتر از یک پایگاه داده SQL است که روی یک سامانه پیادهسازی شده است.
علاوه بر این، میتوانید طرح کاغذی را به یک محیط دیجیتالی منتقل کنید تا همکاران دیگر توانایی کار روی آنرا داشته باشند. یکی از بهترین گزینهها در این زمینه نمودارهای UML است.
شما باید طرح خود را با افراد دیگر چند مرتبه بررسی کنید، همواره این احتمال وجود دارد تا برخی جزئیات نادیده گرفته شده باشند یا یک فراموش کرده باشید یک ویژگی سفارشی را به محصول اضافه کنید.
از کلیدهای خارجی استفاده نکنید
در پایگاه داده SQL مبتنی بر یک سیستم توزیع شده، کلیدهای خارجی ممکن است مشکلساز باشند. ما باید تغییراتی در رکوردهایی که توسط کلیدهای خارجی نگهداری میشوند را با ترتیب خاصی اعمال کنیم که گاهی اوقات باعث بروز مشکل ناسازگاری میشود.
برخی از توسعهدهندگان این مانع را با استفاده از کلیدهای خارجی null برطرف میکنند، با این حال به این نکته دقت کنید که فیلدهای nullable مشکلات خاص خود را دارند.
علاوه بر این، استفاده از کلیدهای خارجی ممکن است باعث ایجاد بنبست شوند، اگر بانک اطلاعاتی بر مبنای یک طرح ضعیف پیادهسازی شده باشد. با حذف کلیدهای خارجی، احتمال بنبست کاهش پیدا میکند.
بدون کلیدهای خارجی، میتوانیم به تراکنشهای بهدرستی استفاده شده، سطوح جداسازی و ایجاد پرسوجوهای مناسب که پایگاه داده را از یک حالت صحیح به حالت دیگر منتقل میکند، تکیه کنیم.
پیشنهاد من این است که سعی کنید طراحی پایگاه داده را به گونهای انجام دهید که کمترین وابستگی به کلیدهای خارجی داشته باشید یا در صورت امکان استفاده از آنها را حذف کنید.
بدون حالت آبشاری کار کنید (Use No Cascades)
پایگاه دادههای SQL به کاربران اجازه میدهد تا از الگوی آبشاری در ارتباط با کلیدهای خارجی استفاده کنند تا بتوانند کنترل کنند وقتی شخصی یک ردیف را در جدول والد بهروز یا حذف میکند چه اتفاقی میافتد. به عنوان توسعهدهنده پایگاه داده به این نکته دقت کنید که مدل آبشاری منطق تجاری مورد استفاده در ارتباط با بهروزرسانی و حذف را مخدوش میکند.
درک خود در ارتباط با نواحی زمانی را افزایش دهید (Understand Time Zones)
بدون شک، بزرگترین مشکلی که همه توسعهدهندگان با آن روبرو هستند، مناطق زمانی است. میتوانید با استفاده از UTC موقعیت زمانی را ذخیره کنید، زیرا این استاندارد جهانی مستقل از مکان و ساعت تابستانی است. رویکرد فوق به شما بستگی دارد که آیا از نوعهای اختصاصی استفاده میکنید یا فقط از زمان دورهای تعریف شده در اعداد صحیح استفاده میکنید.
از مهرهای زمانی ردیفی استفاده کنید (Use Row Timestamps)
به عنوان طراح پایگاه داده باید بدانید در چه زمانی هر ردیف پایگاه داده با عمل ساخت، بهروزرسانی یا حذف روبرو میشود. میتوانید از تکنیک فوق برای ممیزی پایگاه داده و اشکالزدایی استفاده کنید. بهعلاوه، میتوانید از این مهرهای زمانی برای مرتبسازی استفاده کنید، بهویژه برای موجودیتهایی که مرتب نیستند.
سرویسهایی که دادهها را تغییر میدهند را شناسایی کنید
یک سرویس میتواند دادههای سیستم را تغییر دهد. یک شخص میتواند دادهها را با استفاده از رابط کاربری ارائه شده تغییر دهد. یک سرویس میتواند دادهها به شکل دورهای و در قالب زمانبندی مشخص تغییر دهد.
از Numbered Enumerations استفاده کنید
هنگام کار بر روی وضعیت یا وضعیت موجودیتهای خاص، ممکن است نیاز داشته باشید که آنها را به عنوان رشته در فیلدهای پایگاه داده مربوطه ذخیره کنید. رویکرد فوق میتواند به مدیران پایگاه داده اجازه دهد تا مقادیر را به راحتی بررسی کنند.
استفاده از انواع اعداد صحیح نیاز به برنامهریزی دقیق دارد، اما در مقابل صرفهجویی در فضای مصرف شده را بیشتر کرده و و امکان انجام ارزیابیها را سریعتر میکند. همچنین، در صورت دریافت دادههای در پایگاه داده، هکرها به راحتی به همه اطلاعات دسترسی نخواهند داشت.
طول نام ستون را محدود کنید
نام ستونها را تا حد امکان کوتاه نگه دارید تا نوشتن و خواندن محاورههای SQL آسانتر شود. این مسئله به ویژه زمانی حائز اهمیت است که پایگاه داده درخواستهای زیادی دریافت میکند
در پایگاههای داده NoSQL که نام ستون را در هر شی نوشته شده قرار میدهند، اگر طول رشتهها زیاد باشد، فضای قابل توجهی از دیسک اشغال میشود.
طول مقدار ستون را محدود کنید
به عنوان یک قانون نانوشته، همیشه باید بدانید که برای حفظ یک مقدار خاص به چه مقدار فضا نیاز دارید. موتورهای پایگاه داده، طول فیلدهای متنی را با استفاده از تعداد بایتها، نه کاراکترها، محدود میکنند. این مسئله ممکن است هنگام کار با رشتههای یونیکد عجیب باشد. همچنین، باید کدگذاری و ترکیب ستونهای متن را بررسی کنید و این مورد را در بیشتر سطوح پایگاه داده (کل پایگاه داده، جدول یا ستون) اعمال کنید.
برای اعداد واقعی، معمولاً سه نوع موجود است:
نوع ممیز شناور با دقت تکی (floating-point single-precision) مبتنی بر مبنای 2.
نوع ممیز شناور با دقت دوگانه (floating-point double-precision type) بر مبنای پایه 2.
دقت ثابت (fixed-precision) در مبنای 10.
ذخیرهسازی اعداد واقعی ممکن است یک چالش باشد، زیرا ممکن است ابزارهای بکاند از استانداردهای دقیق مشابه پایگاه داده پشتیبانی نکنند.
هنگام استفاده از اعداد صحیح، باید بایتهای کافی را در سطح فیلد اختصاص دهیم. ما باید تصمیم بگیریم که آیا از دادههای امضا شده یا بدون امضا پشتیبانی کنیم یا خیر.
منابع:
https://en.wikipedia.org/wiki/Database_design
https://www.educba.com/types-of-dbms/
https://levelup.gitconnected.com/principles-of-database-schema-design-8e322e4fb283
https://www.oreilly.com/library/view/access-database-design/0596002734/ch04.html
https://www.oracle.com/database/what-is-database/