Normalization در مقابل Denormalization
Normalization فرآیند تجزیه داده به جداول کوچکتر برای حذف افزونگی و تضمین یکپارچگی داده است (طبق فرمهای نرمال)؛ Denormalization عمداً افزونگی داده را برای کاهش تعداد JOIN و افزایش سرعت خواندن، به قیمت پیچیدگی بیشتر در بهروزرسانی، برمیگرداند.
| ویژگی | Normalization | Denormalization |
|---|---|---|
| افزونگی داده | حداقل | عمدی و کنترلشده |
| سرعت خواندن (Read) | معمولاً کندتر (نیاز به JOIN) | سریعتر (داده از پیش آماده) |
| سرعت نوشتن و یکپارچگی | سادهتر و مطمئنتر | پیچیدهتر (ریسک ناسازگاری) |
| مناسب برای | سیستمهای تراکنشی (OLTP) | سیستمهای پرخوانش و گزارشگیری |
کِی از Normalization استفاده کنیم؟
در سیستمهایی با نوشتن/بهروزرسانی مکرر که یکپارچگی داده حیاتی است (مثل سیستم مالی)، طراحی را نرمال نگه دارید تا از ناسازگاری داده جلوگیری شود.
کِی از Denormalization استفاده کنیم؟
وقتی خواندن سریع در مقیاس بالا اولویت دارد و JOINهای زیاد باعث کندی شده (مثل صفحه محصول با بازدید بالا)، بخشی از داده را عمداً denormalize کنید یا از جدولهای خلاصه (summary table) استفاده کنید.
مثال Normalization
-- Normalized: Order references Customer by Id, no duplication
CREATE TABLE Orders (Id INT PRIMARY KEY, CustomerId INT, OrderDate DATE);
CREATE TABLE Customers (Id INT PRIMARY KEY, Name NVARCHAR(100));
مثال Denormalization
-- Denormalized: CustomerName duplicated on every order to avoid a JOIN
CREATE TABLE Orders (
Id INT PRIMARY KEY, CustomerId INT,
CustomerName NVARCHAR(100), -- redundant copy
OrderDate DATE
);
اشتباه رایج
denormalize کردن زودهنگام قبل از اینکه مشکل کارایی واقعی با JOIN اندازهگیری شده باشد ("premature optimization")؛ نتیجه، افزایش پیچیدگی کد برای همگام نگهداشتن دادههای تکراری بدون فایده واقعی کارایی است.
جمعبندی
با طراحی نرمال شروع کنید؛ فقط بعد از اندازهگیری واقعی گلوگاه کارایی، بهصورت هدفمند denormalize کنید.
