دسته بندی مقالات
- بیشتر -محصولات
- بیشتر -آخرین مقالات
- بیشتر --
دستور select در SQL Server
1403/09/30 -
استثناءهای اداره نشده در سی شارپ
1403/09/29 -
نرمالسازی در SQL Server
1403/09/28 -
تعریف یک استثناء توسط کاربر در سی شارپ
1403/09/27 -
کلید اصلی و خارجی در SQL Server
1403/09/26 -
StackTrace در سی شارپ
1403/09/25
نرمالسازی در SQL Server
نرمالسازی در SQL Server
نرمالسازی (Normalization) یک فرآیند سازماندهی دادهها در پایگاههای داده است که به منظور کاهش افزونگی و افزایش یکپارچگی دادهها انجام میشود.
این فرآیند شامل تقسیم جداول بزرگ به جداول کوچکتر و تعریف روابط بین آنها است.
در SQL Server، نرمالسازی یک مفهوم اساسی در طراحی پایگاهدادهها است که به بهبود کارایی، کاهش مشکلات ناسازگاری و جلوگیری از افزونگی دادهها کمک میکند.
در ادامه به تعریف نرمالسازی، اهداف آن، و بررسی فرمهای نرمالسازی میپردازیم.
اهداف نرمالسازی در SQL Server
-
کاهش افزونگی دادهها
نرمالسازی به حداقل رساندن دادههای تکراری در جداول کمک میکند. -
افزایش یکپارچگی دادهها
با تعریف روابط مناسب بین جداول، احتمال ناسازگاری دادهها کاهش مییابد. -
بهبود کارایی پرسوجوها
طراحی بهتر جداول منجر به افزایش سرعت و کارایی کوئریها میشود. -
تسهیل نگهداری دادهها
پایگاهدادههای نرمال شده مدیریت و بهروزرسانی سادهتری دارند. -
پشتیبانی از توسعهپذیری
جداول نرمال شده امکان افزودن دادهها و ویژگیهای جدید را بدون ایجاد تغییرات گسترده فراهم میکنند.
مفاهیم پایه در نرمالسازی در SQL Server
قبل از بررسی فرمهای نرمالسازی، درک چند مفهوم اساسی ضروری است:
-
کلید اصلی (Primary Key)
ستونی که به طور یکتا هر رکورد را در جدول شناسایی میکند. -
کلید خارجی (Foreign Key)
ستونی که به کلید اصلی یک جدول دیگر ارجاع میدهد. -
وابستگی تابعی (Functional Dependency)
وقتی مقدار یک ستون به مقدار ستون دیگری وابسته باشد. -
وابستگی ترانزیتیو (Transitive Dependency)
وابستگی غیرمستقیم یک ستون به کلید اصلی.
انواع فرمهای نرمالسازی در SQL Server
در این بخش، به هر یک از انواع نرمالسازی همراه با مثالهای کدنویسی کاربردی میپردازیم.
این مثالها نشان میدهند که چگونه میتوان نرمالسازی را در یک پروژه واقعی پیادهسازی کرد.
فرض میکنیم در حال طراحی یک پایگاه داده برای یک فروشگاه آنلاین هستیم.
-
فرم نرمال اول (1NF)
در فرم نرمال اول، دادهها باید اتمیک باشند و هیچ گروه تکراری یا ستونهای چندمقداری وجود نداشته باشد.
مثال
فرض کنید جدولی برای ذخیره اطلاعات سفارشات وجود دارد که در آن ستون Products شامل چندین محصول برای یک سفارش است:
-- جدول اولیه با ستون چندمقداری (غیر نرمال)
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
CustomerName NVARCHAR(100),
Products NVARCHAR(MAX) -- چند محصول در یک ستون ذخیره شده است
);
-- درج داده نمونه
INSERT INTO Orders (OrderID, CustomerName, Products)
VALUES (1, 'Ali', 'Laptop, Mouse'),
(2, 'Sara', 'Tablet, Keyboard');
برای تبدیل این جدول به 1NF، ستون Products را به یک جدول جداگانه منتقل میکنیم:
-- تبدیل به 1NF
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
CustomerName NVARCHAR(100)
);
CREATE TABLE OrderDetails (
OrderDetailID INT PRIMARY KEY IDENTITY(1,1),
OrderID INT,
ProductName NVARCHAR(100),
FOREIGN KEY (OrderID) REFERENCES Orders(OrderID)
);
-- درج داده نمونه
INSERT INTO Orders (OrderID, CustomerName)
VALUES (1, 'Ali'),
(2, 'Sara');
INSERT INTO OrderDetails (OrderID, ProductName)
VALUES (1, 'Laptop'),
(1, 'Mouse'),
(2, 'Tablet'),
(2, 'Keyboard');
-
فرم نرمال دوم (2NF)
برای دستیابی به فرم نرمال دوم، جدول باید در 1NF باشد و تمامی ستونهای غیرکلیدی به کلید اصلی به طور کامل وابسته باشند.
مثال
فرض کنید جدول OrderDetails شامل اطلاعات اضافی درباره مشتری است:
-- جدول غیر نرمال (1NF اما نه 2NF)
CREATE TABLE OrderDetails (
OrderDetailID INT PRIMARY KEY IDENTITY(1,1),
OrderID INT,
CustomerName NVARCHAR(100),
ProductName NVARCHAR(100),
FOREIGN KEY (OrderID) REFERENCES Orders(OrderID)
);
در اینجا ستون CustomerName به کلید اصلی وابسته نیست، بلکه به ستون OrderID وابسته است. برای رسیدن به 2NF، اطلاعات مشتری باید به جدول دیگری منتقل شود:
-- تبدیل به 2NF
CREATE TABLE Customers (
CustomerID INT PRIMARY KEY IDENTITY(1,1),
CustomerName NVARCHAR(100)
);
ALTER TABLE Orders
ADD CustomerID INT;
ALTER TABLE Orders
ADD FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID);
-- درج دادهها در جداول جدید
INSERT INTO Customers (CustomerName)
VALUES ('Ali'),
('Sara');
UPDATE Orders
SET CustomerID = 1
WHERE CustomerName = 'Ali';
UPDATE Orders
SET CustomerID = 2
WHERE CustomerName = 'Sara';
🌟 آیا میخواهید به یک متخصص پایگاه داده تبدیل شوید و در دنیای فناوری اطلاعات بدرخشید؟
با دوره آموزشی SQL Server ما، شما میتوانید به راحتی و با روشی عملی، تمام مهارتهای لازم را یاد بگیرید!
این دوره به شما آموزش میدهد که چگونه دادهها را به بهترین شکل مدیریت کنید، گزارشهای قدرتمند بسازید و به تحلیلهای عمیق دست یابید.
با محتوای جذاب و پروژههای واقعی، شما نه تنها تئوری را یاد میگیرید، بلکه تواناییهای عملی خود را نیز تقویت میکنید.
پس فرصت را از دست ندهید! همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آینده شغلی روشنتر بردارید!
همین حالا شروع کنید و به دنیای دادهها بپیوندید!
-
فرم نرمال سوم (3NF)
در فرم نرمال سوم، نباید هیچ وابستگی ترانزیتی بین ستونهای غیرکلیدی وجود داشته باشد.
مثال
فرض کنید در جدول Orders اطلاعات مربوط به شهر مشتری نیز ذخیره شده است:
-- جدول غیر نرمال (2NF اما نه 3NF)
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
CustomerID INT,
CustomerName NVARCHAR(100),
City NVARCHAR(100),
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);
در اینجا ستون City به طور غیرمستقیم به کلید اصلی وابسته است. برای رسیدن به 3NF، باید جدول جدیدی برای شهرها ایجاد کنیم:
-- تبدیل به 3NF
CREATE TABLE Cities (
CityID INT PRIMARY KEY IDENTITY(1,1),
CityName NVARCHAR(100)
);
ALTER TABLE Customers
ADD CityID INT;
ALTER TABLE Customers
ADD FOREIGN KEY (CityID) REFERENCES Cities(CityID);
-- درج داده نمونه
INSERT INTO Cities (CityName)
VALUES ('Tehran'),
('Mashhad');
UPDATE Customers
SET CityID = 1
WHERE CustomerName = 'Ali';
UPDATE Customers
SET CityID = 2
WHERE CustomerName = 'Sara';
-
فرم نرمال بویس-کاد (BCNF)
فرم نرمال بویس-کاد زمانی اعمال میشود که یک ستون غیرکلیدی به یک کلید جزئی وابسته باشد.
مثال
فرض کنید جدولی داریم که اطلاعات محصولات و تامینکنندگان آنها را ذخیره میکند:
-- جدول غیر نرمال (3NF اما نه BCNF)
CREATE TABLE ProductSuppliers (
ProductID INT,
SupplierID INT,
SupplierName NVARCHAR(100),
PRIMARY KEY (ProductID, SupplierID)
);
در اینجا SupplierName به SupplierID وابسته است، نه به ترکیب ProductID و SupplierID. برای رسیدن به BCNF، باید اطلاعات تامینکنندگان را به جدول جداگانهای منتقل کنیم:
-- تبدیل به BCNF
CREATE TABLE Suppliers (
SupplierID INT PRIMARY KEY,
SupplierName NVARCHAR(100)
);
ALTER TABLE ProductSuppliers
DROP COLUMN SupplierName;
ALTER TABLE ProductSuppliers
ADD FOREIGN KEY (SupplierID) REFERENCES Suppliers(SupplierID);
-- درج داده نمونه
INSERT INTO Suppliers (SupplierID, SupplierName)
VALUES (1, 'Supplier A'),
(2, 'Supplier B');
-
فرم نرمال چهارم (4NF)
در فرم نرمال چهارم، نباید هیچ وابستگی چندمقداری وجود داشته باشد.
مثال
فرض کنید اطلاعاتی درباره مهارتهای کارمندان و پروژههایی که روی آنها کار میکنند داریم:
-- جدول غیر نرمال (دارای وابستگی چندمقداری)
CREATE TABLE EmployeeProjects (
EmployeeID INT,
ProjectID INT,
Skill NVARCHAR(100),
PRIMARY KEY (EmployeeID, ProjectID, Skill)
);
برای حل این مشکل، باید جداول جداگانهای برای مهارتها و پروژههای هر کارمند ایجاد کنیم:
-- تبدیل به 4NF
CREATE TABLE EmployeeSkills (
EmployeeID INT,
Skill NVARCHAR(100),
PRIMARY KEY (EmployeeID, Skill)
);
CREATE TABLE EmployeeAssignments (
EmployeeID INT,
ProjectID INT,
PRIMARY KEY (EmployeeID, ProjectID)
);
-- درج داده نمونه
INSERT INTO EmployeeSkills (EmployeeID, Skill)
VALUES (1, 'SQL'),
(1, 'Python');
INSERT INTO EmployeeAssignments (EmployeeID, ProjectID)
VALUES (1, 101),
(1, 102);
-
فرم نرمال پنجم (5NF)
فرم نرمال پنجم تضمین میکند که هیچ وابستگی پیوندی بین دادهها وجود نداشته باشد.
مثال
فرض کنید جدولی برای مدیریت روابط بین دانشجویان، دورهها، و اساتید داریم:
-- جدول غیر نرمال (دارای وابستگی پیوندی)
CREATE TABLE StudentCourses (
StudentID INT,
CourseID INT,
TeacherID INT,
PRIMARY KEY (StudentID, CourseID, TeacherID)
);
برای رسیدن به 5NF، این جدول را به سه جدول مجزا تبدیل میکنیم:
-- تبدیل به 5NF
CREATE TABLE StudentEnrollments (
StudentID INT,
CourseID INT,
PRIMARY KEY (StudentID, CourseID)
);
CREATE TABLE CourseTeachers (
CourseID INT,
TeacherID INT,
PRIMARY KEY (CourseID, TeacherID)
);
CREATE TABLE StudentTeachers (
StudentID INT,
TeacherID INT,
PRIMARY KEY (StudentID, TeacherID)
);
این مثالهای کاربردی نشان میدهند که نرمالسازی چگونه به طراحی کارآمدتر پایگاه داده کمک میکند.
هر سطح از نرمالسازی هدف مشخصی دارد و بسته به نیاز پروژه، میتوان از آن استفاده کرد.
دوره های مرتبط
آموزش پایگاه داده SqlServer
پایگاه داده Sqlserver یکی از پایگاه داده های مهم برای ذخیره اطلاعات محسوب میشود .