Denormalization — o‘qish tezligi, query soddaligi yoki distributed tizim talabi uchun normalizatsiya qilingan ma’lumotning ayrim qismlarini ataylab takrorlash yoki birlashtirish jarayoni. U ma’lumot modelidagi redundancy’ni nazoratli ravishda oshiradi.
Denormalization noto‘g‘ri schema’ni oqlash emas. U aniq o‘lchangan bottleneck va access pattern asosida qo‘llanadi.
Takroriy field
Order table’da user nomining snapshoti saqlanishi mumkin:
orders.user_id
orders.customer_name
user_id joriy userga bog‘lanadi.
customer_name esa order yaratilgan paytdagi tarixiy nomni saqlaydi.
Bu har doim redundancy xatosi emas; u business snapshot bo‘lishi mumkin.
Joinni kamaytirish
Tez-tez ishlatiladigan query bir nechta katta table’ni join qilsa, ayrim fieldlar asosiy recordga ko‘chirilishi mumkin.
Masalan, product list’da har row uchun category nomi kerak.
category_name product read modelida saqlansa join kamayadi.
Lekin category nomi o‘zgarganda barcha nusxalar yangilanishi kerak.
Precomputed aggregate
Hisoblashni har requestda bajarish o‘rniga oldindan saqlash mumkin.
Misollar:
- order total;
- comment count;
- account balance;
- daily sales;
- average rating.
Aggregate source eventlardan yangilanadi.
Noto‘g‘ri update yoki yo‘qolgan event drift yaratishi mumkin.
Materialized view
Murakkab query natijasi materialized view’da fizik saqlanadi.
Bu denormalized read model hisoblanadi.
- real-timega yaqin;
- scheduled;
- incremental;
- full
bo‘lishi mumkin.
Data freshness query tezligi evaziga boshqariladi.
Read model
CQRSga o‘xshash arxitekturada write modeli normalizatsiya qilingan bo‘lishi, read modeli esa UI querylariga mos denormalizatsiya qilinishi mumkin.
Masalan, dashboard uchun bitta document ichida:
- user;
- oxirgi order;
- total;
- status;
- notification count
saqlanadi.
Read model source of truth emas, qayta qurilishi mumkin.
Document embedding
Document database’da bog‘liq ma’lumotlar bir document ichiga joylashtiriladi.
Masalan, order itemlari order documentiga embed qilinadi.
Afzalliklari:
- bitta read;
- bitta document atomic update;
- natural aggregate boundary.
Kamchiligi:
- document hajmi;
- itemni mustaqil query qilish;
- takroriy product ma’lumoti;
- update fan-out.
Cache
Cache ham denormalized nusxa sifatida qaralishi mumkin.
Database’dagi record:
da takrorlanadi.
Cache invalidation va TTL consistency darajasini belgilaydi.
Search index
Search engine source database’dagi ma’lumotni qidiruvga mos document shaklida saqlaydi.
Bir documentda bir nechta relational table fieldlari birlashtirilishi mumkin.
Database commit va search index update orasida qisqa eventual consistency mavjud.
Outbox yoki change data capture update’ni ishonchli yetkazadi.
Update fan-out
Bitta source qiymat ko‘p denormalized recordlarda saqlansa o‘zgarish barcha nusxalarga tarqaladi.
Masalan, product nomi million order history recordida takrorlangan bo‘lsa ham tarixiy snapshot bo‘lsa yangilanmasligi mumkin.
Ammo joriy katalog documentlarida yangilanishi talab qilinadi.
Qaysi nusxa snapshot, qaysi nusxa joriy ma’lumot ekani aniq belgilanadi.
Consistency modeli
Denormalized nusxalar:
- bir transactionda;
- asynchronous event bilan;
- schedule;
- read vaqtida;
- background repair
orqali yangilanadi.
Bir transaction faqat bitta database ichidagi nusxalarni atomic saqlashi mumkin.
Tashqi search yoki cache eventual consistency bilan ishlaydi.
Source of truth
Har denormalized field uchun asosiy manba aniqlanadi.
Masalan:
users.name — source of truth
search_users.name — projection
cache:user:15 — cache
Nusxalar o‘zaro bir-birini yangilamasligi kerak.
Aks holda conflict va cycle paydo bo‘ladi.
Rebuild
Denormalized read modelni source data’dan qayta qurish imkoniyati muhim.
Rebuild:
- yangi index yoki table yaratadi;
- source’dan backfill qiladi;
- yangi o‘zgarishlarni yetkazadi;
- natijani tekshiradi;
- trafficni almashtiradi.
Bu drift va schema o‘zgarishida foydali.
Dual write xavfi
Application bitta requestda database va search indexga ketma-ket yozsa, birinchisi muvaffaqiyatli, ikkinchisi xato bo‘lishi mumkin.
Natijada nusxalar farqlanadi.
ni bitta transactionda saqlaydi.
Worker eventni tashqi tizimga yetkazadi.
Reconciliation
Denormalized storage source bilan davriy solishtiriladi.
Tekshiruvlar:
Topilgan farqlar background repair bilan tuzatiladi.
Performance foydasi
Denormalization quyidagilarni kamaytirishi mumkin:
- join;
- network round-trip;
- aggregation;
- random disk read;
- cross-shard query.
Lekin write, storage va maintenance xarajatini oshiradi.
Foyda benchmark va real query profiling bilan isbotlanadi.
Schema evolyutsiyasi
Denormalized modelda bir field ko‘p joyda bo‘lishi mumkin.
bosqichlarini talab qiladi.
Versionlangan event va projection handlerlari rolling migrationni yengillashtiradi.
Maxfiy ma’lumot
Personal yoki secret fieldni denormalizatsiya qilish uning ko‘proq storage va loglarda paydo bo‘lishiga olib keladi.
Har nusxa uchun:
- encryption;
- retention;
- deletion;
- access;
- audit
talabi bajariladi.
Normalization bilan muvozanat
Transactional source model ko‘pincha normalizatsiya qilinadi.
Read-heavy yoki analytics modeli denormalizatsiya qilinadi.
Bir tizim ichida ikkala yondashuv birga mavjud bo‘lishi mumkin.
Tanlov data yaxlitligi va workload asosida qilinadi.
Version maydoni
Denormalized record source version yoki updated timestamp saqlashi mumkin.
Consumer eski eventni yangi projection ustidan yozmaslik uchun versionni solishtiradi.
Bu eventlar tartibsiz keladigan distributed tizimda muhim.
Qayta hisoblash
Aggregate qiymatni incremental yangilash tez, ammo xato yig‘ilib borishi mumkin.
Davriy ravishda source data’dan to‘liq qayta hisoblash va stored natija bilan solishtirish driftni aniqlaydi.
Bog‘liq tushunchalar
Normalization, Redundancy, Materialized view, Read model, CQRS, Cache, Search index, Eventual consistency, Outbox pattern, Data projection