پایگاهدادهها: ساخت، مدیریت و ساختار داخلی
در درس اول یاد گرفتیم پایگاهداده یعنی چه، و در درس دوم دیدیم SQL Server پشت صحنه چطور کار میکند. حالا وقتش رسیده کمی عملیتر شویم: یک پایگاهداده در SQL Server دقیقاً چطور ساخته میشود، از چه فایلهایی تشکیل شده، و چطور میشود آن را مدیریت کرد و در نهایت حذفش کرد. این درس، پایهی تمام درسهای عملی بعدی است.
پایگاهداده در عمل دقیقاً چیست؟
یک پایگاهداده در SQL Server را میتوان یک «ظرف» یا «فضای نام مستقل» در نظر گرفت که همهی اشیاء مربوط به یک برنامه یا پروژه را در خودش نگه میدارد: جدولها، دیدها (Views)، رویههای ذخیرهشده (Stored Procedures)، توابع، ایندکسها و غیره. برای مثال، یک فروشگاه اینترنتی معمولاً یک پایگاهداده به نام چیزی شبیه ShopDB دارد که جدولهای مشتریان، محصولات و سفارشها همگی داخل همان یک پایگاهداده کنار هم قرار دارند — جدا از پایگاهدادهی دیگری مثل HRDB که ممکن است اطلاعات کارکنان و حقوق را نگه دارد.
این جداسازی چند فایدهی مهم دارد:
- سازماندهی: دادههای مرتبط با هم، در یکجا نگهداری میشوند.
- امنیت: میتوان به هر کاربر فقط به پایگاهدادهی موردنیازش دسترسی داد (این موضوع را در فصل ۱۱ کامل بررسی میکنیم).
- پشتیبانگیری مستقل: هر پایگاهداده را میتوان جدا از بقیه، بکاپ گرفت یا روی سرور دیگری بازیابی کرد.
ساخت یک پایگاهداده جدید
سادهترین شکل ساخت یک پایگاهداده در SQL Server فقط یک خط است:
CREATE DATABASE SchoolDB;
همین یک دستور کافی است تا SQL Server یک پایگاهدادهی کاملاً جدید با تنظیمات پیشفرض بسازد. اما اگر بخواهیم دقیقتر مشخص کنیم فایلها کجا ذخیره شوند و چه اندازهای داشته باشند، میتوانیم اینطور بنویسیم:
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 بگوییم داریم با کدام پایگاهداده کار میکنیم:
USE SchoolDB; SELECT * FROM students;
در SSMS معمولاً یک منوی کشویی در بالای صفحه هم وجود دارد که میتوان از همانجا پایگاهدادهی فعال را انتخاب کرد، بدون نوشتن دستور USE.
دیدن لیست پایگاهدادههای موجود
برای دیدن همهی پایگاهدادههای موجود روی یک Instance (شامل ۴ پایگاهدادهی سیستمی که در درس قبل دیدیم، بهعلاوهی پایگاهدادههای خودت)، میتوان از یک ویوی سیستمی استفاده کرد:
SELECT name, create_date FROM sys.databases;
sys.databases یک جدول سیستمی است که SQL Server خودش نگه میدارد و همیشه لیست بهروزی از تمام پایگاهدادههای آن Instance را در اختیار میگذارد.
حذف یک پایگاهداده (DROP DATABASE)
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 را نشان میدهد.
در درس بعدی، یک قدم دقیقتر میشویم و میبینیم داخل یک پایگاهداده، جدولها دقیقاً چطور ساخته و تعریف میشوند.