📚 فصل ۱۱ — طراحی جداول (Table Design) در SQL Server
1️⃣ مقدمه — چرا طراحی جدول مهم است؟
وقتی صحبت از پایگاه داده رابطهای (Relational Database) میشود، جدولها (Tables) قلب سیستم هستند.
تمام دادههای ما در قالب جدول ذخیره میشود و کیفیت طراحی جدول تعیین میکند:
- سرعت جستجو چطور باشد.
- نگهداری داده راحت باشد یا نه.
- توسعه آینده پروژه بدون مشکل باشد.
مثال یک طراحی بد:
اگر در یک جدول تمام اطلاعات کاربران، سفارشها و محصولات در کنار هم ذخیره شود:
- دادهها تکراری میشوند.
- بهروزرسانی سخت میشود.
- تغییر یک مقدار ممکن است صدها ردیف را تحتتأثیر قرار دهد.
📌 بنابراین، طراحی جدول درست یعنی:
- انتخاب تعداد جدولهای مناسب
- تعیین ستونها با Data Type درست
- مشخص کردن کلیدها (Keys)
- تعریف روابط بین جداول
2️⃣ اجزای اصلی یک جدول
یک جدول معمولاً شامل بخشهای زیر است:
جزء | توضیح |
---|---|
نام جدول (Table Name) | باید معنادار و شفاف باشد (مثلاً Customers بهجای Tbl1 ) |
ستونها (Columns) | هر ستون نشاندهنده یک ویژگی داده است (مثلاً FirstName , LastName ) |
نوع داده (Data Type) | تعیین میکند هر ستون چه نوع اطلاعاتی نگه دارد (عدد، متن، تاریخ و غیره) |
کلید اصلی (Primary Key) | برای شناسایی یکتای هر رکورد |
قیود (Constraints) | قوانین اعتبارسنجی داده (مثلاً NOT NULL , CHECK , DEFAULT ) |
3️⃣ انواع کلیدها در طراحی جدول
3.1 کلید اصلی (Primary Key)
- تضمین میکند هر ردیف شناسه یکتا داشته باشد.
- نمیتواند
NULL
باشد. - فقط یک Primary Key در هر جدول وجود دارد.
مثال:
CREATE TABLE Customers (
CustomerID INT PRIMARY KEY,
FullName NVARCHAR(100) NOT NULL
);
3.2 کلید خارجی (Foreign Key)
- برای ایجاد ارتباط بین دو جدول.
- مقدار آن باید در جدول دیگر وجود داشته باشد.
مثال:
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
CustomerID INT FOREIGN KEY REFERENCES Customers(CustomerID)
);
3.3 کلید یکتا (Unique Key)
- تضمین میکند مقادیر ستون یا ستونها تکراری نباشند.
- بر خلاف Primary Key، میتواند
NULL
داشته باشد.
مثال:
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
NationalCode CHAR(10) UNIQUE
);
3.4 کلید مرکب (Composite Key)
- ترکیب بیش از یک ستون بهعنوان کلید اصلی.
- کاربرد در جدولهای ارتباطی.
مثال:
CREATE TABLE StudentCourses (
StudentID INT,
CourseID INT,
PRIMARY KEY (StudentID, CourseID)
);
4️⃣ روابط بین جداول
4.1 One-to-One (یک به یک)
هر رکورد از جدول A فقط مقابل یک رکورد در جدول B است.
مثلاً:
Users
UserProfiles
4.2 One-to-Many (یک به چند)
هر رکورد از جدول A میتواند چند رکورد در جدول B داشته باشد.
مثلاً:
- یک مشتری چند سفارش دارد.
4.3 Many-to-Many (چند به چند)
هر رکورد در جدول A میتواند با چند رکورد در جدول B مرتبط باشد و برعکس.
میانجدول واسط ایجاد میکنیم.
5️⃣ نرمالسازی (Normalization) — جلوگیری از داده تکراری
5.1 سطح اول (1NF)
- هر ستون فقط یک مقدار منفرد دارد.
- داده تکراری نباشد.
5.2 سطح دوم (2NF)
- تمام ستونهای غیراصلی وابسته کامل به Primary Key باشند.
5.3 سطح سوم (3NF)
- ستونها فقط به کلید اصلی وابسته باشند، نه به ستونهای دیگر.
📌 به زبان ساده: اطلاعات رو طوری پخش کن که تکرار نشه و وابستگی غیرضروری بین ستونها ایجاد نشه.
6️⃣ ایجاد جدول با روش گرافیکی در SSMS
- در Object Explorer روی پوشه Tables راست کلیک → New Table…
- ستونها را اضافه کن:
- Name
- Data Type
- Allow Nulls
- کلید اصلی را تعیین کن → راست کلیک روی ستون → Set Primary Key
- جدول را ذخیره کن → نام بده.
7️⃣ ایجاد جدول با T-SQL (CREATE TABLE)
مثال:
CREATE TABLE Products (
ProductID INT IDENTITY(1,1) PRIMARY KEY,
ProductName NVARCHAR(200) NOT NULL,
Price DECIMAL(10,2) CHECK (Price >= 0),
Stock INT DEFAULT 0,
CategoryID INT FOREIGN KEY REFERENCES Categories(CategoryID)
);
📌 توضیحات:
IDENTITY(1,1)
→ مقدار خودکار از 1 شروع و 1 تا 1 اضافه میشود.CHECK
→ جلوگیری از ورود مقدار منفی برای قیمت.DEFAULT
→ مقدار پیشفرض در صورت وارد نکردن مقدار.
8️⃣ ویرایش جدول (ALTER TABLE)
اضافه کردن ستون:
ALTER TABLE Products
ADD Description NVARCHAR(MAX);
تغییر نوع داده:
ALTER TABLE Products
ALTER COLUMN ProductName NVARCHAR(300) NOT NULL;
حذف ستون:
ALTER TABLE Products
DROP COLUMN Description;
9️⃣ حذف جدول (DROP TABLE)
DROP TABLE IF EXISTS Products;
🔟 تمرین عملی — طراحی جداول فروشگاهی
جداول:
Customers
→ اطلاعات مشتریانProducts
→ محصولاتOrders
→ سفارشهاOrderDetails
→ جزئیات هر سفارش
نمونه کد:
CREATE TABLE Customers (
CustomerID INT IDENTITY PRIMARY KEY,
FullName NVARCHAR(100) NOT NULL,
Phone CHAR(11) UNIQUE,
RegisterDate DATE DEFAULT GETDATE()
);
CREATE TABLE Products (
ProductID INT IDENTITY PRIMARY KEY,
ProductName NVARCHAR(200) NOT NULL,
Price DECIMAL(10,2) CHECK (Price >= 0),
Stock INT DEFAULT 0
);
CREATE TABLE Orders (
OrderID INT IDENTITY PRIMARY KEY,
CustomerID INT FOREIGN KEY REFERENCES Customers(CustomerID),
OrderDate DATETIME DEFAULT GETDATE()
);
CREATE TABLE OrderDetails (
OrderID INT,
ProductID INT,
Quantity INT CHECK (Quantity > 0),
PRIMARY KEY (OrderID, ProductID),
FOREIGN KEY (OrderID) REFERENCES Orders(OrderID),
FOREIGN KEY (ProductID) REFERENCES Products(ProductID)
);
1️⃣1️⃣ اشتباهات رایج در طراحی جدول
- استفاده از
NVARCHAR(MAX)
یاTEXT
بدون دلیل. - نداشتن Primary Key.
- ذخیره تاریخ و عدد بهعنوان متن.
- عدم تعریف روابط Foreign Key.
- ستونهای اضافی و تکراری.
1️⃣2️⃣ جمعبندی
- طراحی جدول بخش حیاتی پایگاه داده است.
- باید Data Type درست، کلید مناسب، و رابطه دقیق انتخاب شود.
- نرمالسازی کمک میکند دادهها تکرار نشود.
- هم روش گرافیکی SSMS و هم T-SQL برای طراحی وجود دارد.
- رعایت استانداردها = نگهداری راحتتر + عملکرد بهتر.