CodeShot

Normalization در مقابل Denormalization

Normalization فرآیند تجزیه داده به جداول کوچک‌تر برای حذف افزونگی و تضمین یکپارچگی داده است (طبق فرم‌های نرمال)؛ Denormalization عمداً افزونگی داده را برای کاهش تعداد JOIN و افزایش سرعت خواندن، به قیمت پیچیدگی بیشتر در به‌روزرسانی، برمی‌گرداند.

ویژگیNormalizationDenormalization
افزونگی دادهحداقلعمدی و کنترل‌شده
سرعت خواندن (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 کنید.