خانه/ مبانی پایگاه داده/ پایگاه‌های داده

پایگاه‌داده‌ها: ساخت، مدیریت و ساختار داخلی

مبتدی ۱۱ دقیقه مطالعه

در درس اول یاد گرفتیم پایگاه‌داده یعنی چه، و در درس دوم دیدیم SQL Server پشت صحنه چطور کار می‌کند. حالا وقتش رسیده کمی عملی‌تر شویم: یک پایگاه‌داده در SQL Server دقیقاً چطور ساخته می‌شود، از چه فایل‌هایی تشکیل شده، و چطور می‌شود آن را مدیریت کرد و در نهایت حذفش کرد. این درس، پایه‌ی تمام درس‌های عملی بعدی است.

پایگاه‌داده در عمل دقیقاً چیست؟

یک پایگاه‌داده در SQL Server را می‌توان یک «ظرف» یا «فضای نام مستقل» در نظر گرفت که همه‌ی اشیاء مربوط به یک برنامه یا پروژه را در خودش نگه می‌دارد: جدول‌ها، دیدها (Views)، رویه‌های ذخیره‌شده (Stored Procedures)، توابع، ایندکس‌ها و غیره. برای مثال، یک فروشگاه اینترنتی معمولاً یک پایگاه‌داده به نام چیزی شبیه ShopDB دارد که جدول‌های مشتریان، محصولات و سفارش‌ها همگی داخل همان یک پایگاه‌داده کنار هم قرار دارند — جدا از پایگاه‌داده‌ی دیگری مثل HRDB که ممکن است اطلاعات کارکنان و حقوق را نگه دارد.

این جداسازی چند فایده‌ی مهم دارد:

  • سازمان‌دهی: داده‌های مرتبط با هم، در یک‌جا نگه‌داری می‌شوند.
  • امنیت: می‌توان به هر کاربر فقط به پایگاه‌داده‌ی موردنیازش دسترسی داد (این موضوع را در فصل ۱۱ کامل بررسی می‌کنیم).
  • پشتیبان‌گیری مستقل: هر پایگاه‌داده را می‌توان جدا از بقیه، بکاپ گرفت یا روی سرور دیگری بازیابی کرد.

ساخت یک پایگاه‌داده جدید

ساده‌ترین شکل ساخت یک پایگاه‌داده در SQL Server فقط یک خط است:

sql
CREATE DATABASE SchoolDB;

همین یک دستور کافی است تا SQL Server یک پایگاه‌داده‌ی کاملاً جدید با تنظیمات پیش‌فرض بسازد. اما اگر بخواهیم دقیق‌تر مشخص کنیم فایل‌ها کجا ذخیره شوند و چه اندازه‌ای داشته باشند، می‌توانیم این‌طور بنویسیم:

sql
CREATE DATABASE SchoolDB
ON PRIMARY (
  NAME = SchoolDB_Data,
  FILENAME = 'C:\Data\SchoolDB.mdf',
  SIZE = 100MB,
  MAXSIZE = 500MB,
  FILEGROWTH = 50MB
)
LOG ON (
  NAME = SchoolDB_Log,
  FILENAME = 'C:\Data\SchoolDB_log.ldf',
  SIZE = 20MB,
  MAXSIZE = 100MB,
  FILEGROWTH = 10MB
);

هرکدام از این پارامترها یک معنای مشخص دارند:

  • NAME: نام منطقی فایل، همان چیزی که داخل SQL Server برای اشاره به فایل استفاده می‌شود.
  • FILENAME: مسیر و نام فیزیکی فایل روی دیسک.
  • SIZE: اندازه‌ی اولیه‌ی فایل هنگام ساخت.
  • MAXSIZE: حداکثر اندازه‌ای که فایل مجاز است تا آن رشد کند (می‌تواند UNLIMITED هم باشد).
  • FILEGROWTH: هر بار که فایل پر شود، به چه میزان به‌طور خودکار بزرگ‌تر می‌شود.
در پروژه‌های واقعی، تنظیم درست FILEGROWTH اهمیت زیادی دارد: اگر خیلی کوچک باشد، فایل مدام و با فاصله‌ی کم رشد می‌کند که خودش هزینه‌ی عملکردی دارد؛ اگر خیلی بزرگ باشد، ممکن است فضای دیسک بی‌دلیل هدر برود.

فایل‌های فیزیکی یک پایگاه‌داده

همان‌طور که در دستور بالا دیدی، یک پایگاه‌داده از چند فایل فیزیکی روی دیسک تشکیل می‌شود:

پسوندناموظیفه
.mdfفایل داده‌ی اصلی (Primary)هر پایگاه‌داده دقیقاً یکی از این‌ها دارد؛ داده‌ها و اطلاعات راه‌اندازی پایگاه‌داده را نگه می‌دارد
.ndfفایل داده‌ی ثانویه (Secondary)اختیاری؛ برای پخش‌کردن داده‌های حجیم روی چند دیسک مختلف استفاده می‌شود
.ldfفایل لاگ (Log)همان لاگ تراکنشی که در درس قبل دیدیم؛ هر تغییری پیش از نهایی‌شدن، اول این‌جا ثبت می‌شود

برای پایگاه‌داده‌های کوچک و متوسط، معمولاً فقط به یک فایل .mdf و یک فایل .ldf نیاز داری؛ فایل .ndf بیشتر در پایگاه‌داده‌های بسیار بزرگ سازمانی کاربرد دارد.

انتخاب پایگاه‌داده برای کار با آن (USE)

یک Instance از SQL Server می‌تواند هم‌زمان میزبان چندین پایگاه‌داده باشد. پس پیش از نوشتن هر پرس‌وجو، باید به SQL Server بگوییم داریم با کدام پایگاه‌داده کار می‌کنیم:

sql
USE SchoolDB;
SELECT * FROM students;

در SSMS معمولاً یک منوی کشویی در بالای صفحه هم وجود دارد که می‌توان از همان‌جا پایگاه‌داده‌ی فعال را انتخاب کرد، بدون نوشتن دستور USE.

دیدن لیست پایگاه‌داده‌های موجود

برای دیدن همه‌ی پایگاه‌داده‌های موجود روی یک Instance (شامل ۴ پایگاه‌داده‌ی سیستمی که در درس قبل دیدیم، به‌علاوه‌ی پایگاه‌داده‌های خودت)، می‌توان از یک ویوی سیستمی استفاده کرد:

sql
SELECT name, create_date
FROM sys.databases;

sys.databases یک جدول سیستمی است که SQL Server خودش نگه می‌دارد و همیشه لیست به‌روزی از تمام پایگاه‌داده‌های آن Instance را در اختیار می‌گذارد.

حذف یک پایگاه‌داده (DROP DATABASE)

sql
DROP DATABASE SchoolDB;
هشدار: این دستور به‌صورت کامل و بدون هیچ تأییدیه‌ای، پایگاه‌داده و تمام فایل‌های فیزیکی‌اش را برای همیشه حذف می‌کند. پیش از اجرای DROP DATABASE در محیط واقعی، همیشه مطمئن شو در محیط درستی (نه سرور اصلی/Production) هستی.

چند تنظیم مهم دیگر (فعلاً فقط آشنایی)

وقتی یک پایگاه‌داده می‌سازی، دو تنظیم مهم دیگر هم وجود دارند که بعداً با جزئیات بیشتری سراغشان می‌رویم:

  • Collation (کولیشن): مشخص می‌کند متن‌ها چطور مرتب و مقایسه شوند — مثلاً حساس به بزرگ/کوچک بودن حروف باشند یا نه، و قوانین زبانی کدام زبان را رعایت کنند. برای کار با متن فارسی، کولیشن‌های مخصوصی مثل Persian_100_CI_AS وجود دارند.
  • Recovery Model (مدل بازیابی): مشخص می‌کند لاگ تراکنش چطور مدیریت شود — گزینه‌ی Full امکان بازگردانی داده تا لحظه‌ی دقیق خرابی را می‌دهد، در حالی که Simple ساده‌تر است اما این قابلیت را ندارد.

پایگاه‌داده در Playground این سایت

موتور SQLite که Playground این سایت روی آن اجرا می‌شود، پایگاه‌داده را کمی ساده‌تر می‌بیند: یک پایگاه‌داده در SQLite چیزی بیش از یک فایل واحد (یا در مرورگر، یک ساختار در حافظه) نیست — نه Instance ای در کار است، نه فایل جدای .ldf. به همین دلیل وقتی از منوی Playground یکی از دیتاست‌های «مدرسه» یا «فروشگاه» را انتخاب می‌کنی، ما داریم دقیقاً همان لحظه یک پایگاه‌داده‌ی تازه برایت می‌سازیم — بدون نیاز به دستورهای CREATE DATABASE یا USE.

اما مفهوم اصلی همچنان برقرار است: یک پایگاه‌داده، ظرفی است که چند جدول مرتبط را کنار هم نگه می‌دارد. بیا همین را با یک پرس‌وجوی واقعی ببینیم — دستور زیر همه‌ی جدول‌های موجود در پایگاه‌داده‌ی فعلی را نشان می‌دهد:

ببین این پایگاه‌داده چند جدول دارد
دیدی؟ همین یک پایگاه‌داده، دو جدول جدا (students و courses) را کنار هم نگه داشته. sqlite_master در SQLite همان نقشی را دارد که sys.databases برای دیدن لیست پایگاه‌داده‌ها داشت — با این تفاوت که این یکی، لیست جدول‌های داخل همین یک پایگاه‌داده را نشان می‌دهد.

جمع‌بندی این درس

  • پایگاه‌داده «ظرفی» است که جدول‌ها و سایر اشیاء مرتبط با یک برنامه را کنار هم نگه می‌دارد.
  • با CREATE DATABASE ساخته، با USE انتخاب، و با DROP DATABASE برای همیشه حذف می‌شود.
  • هر پایگاه‌داده از فایل‌های فیزیکی .mdf (داده)، به‌صورت اختیاری .ndf (داده‌ی ثانویه)، و .ldf (لاگ) تشکیل شده.
  • sys.databases لیست همه‌ی پایگاه‌داده‌های یک Instance را نشان می‌دهد.

در درس بعدی، یک قدم دقیق‌تر می‌شویم و می‌بینیم داخل یک پایگاه‌داده، جدول‌ها دقیقاً چطور ساخته و تعریف می‌شوند.