IndexedDB — browserda katta hajmdagi strukturali ma’lumotni object store va indexlar orqali saqlash uchun mo‘ljallangan asynchronous client-side database API. U string bilan cheklangan localStorage’dan farqli ravishda object, array, binary, date va boshqa structured-clone qo‘llaydigan qiymatlarni saqlashi mumkin.
IndexedDB offline application, PWA, cache, draft va local-first tizimlarda ishlatiladi.
Database
Har origin bir yoki bir nechta nomlangan IndexedDB database ochishi mumkin.
Database version raqamiga ega:
indexedDB.open("uzbekdevs", 2);
Version oshganda schema upgrade jarayoni ishga tushadi.
Asynchronous API
Ko‘p operation request va event orqali yoki wrapper library yordamida Promise ko‘rinishida bajariladi.
Database call main threadni synchronous bloklamaydi.
Natija darhol qaytmaydi.
Transaction tugashi va xato holati alohida kuzatiladi.
Object store
Object store relational tablega yaqin, lekin JavaScript objectlarini saqlaydi.
Masalan:
- articles;
- drafts;
- users;
- cachedResponses.
Har record key bilan aniqlanadi.
Object structure recordlar orasida qat’iy bir xil bo‘lishi shart emas, ammo application schema saqlaydi.
Key
Record key:
- explicit qiymat;
- object property’sidagi keyPath;
- auto-increment
orqali berilishi mumkin.
Misol:
db.createObjectStore("articles", {
keyPath: "id"
});
Key unique bo‘lishi kerak.
KeyPath
KeyPath object ichidagi property’ni primary key sifatida tanlaydi:
id
user.id
Nested keyPath ham qo‘llanishi mumkin.
Recordda kerakli property bo‘lmasa write xato berishi ehtimoli bor.
Auto-increment
Object store avtomatik sonli key yaratishi mumkin.
Bu local recordlar uchun qulay.
Server bilan sync qilinadigan ID uchun collision va mapping alohida boshqariladi.
Local auto-ID server primary keyi bilan bir xil ma’noda ishlamasligi mumkin.
Index
Index object store ichidagi boshqa field bo‘yicha qidirish imkonini beradi:
store.createIndex("by_status", "status");
Index unique yoki non-unique bo‘lishi mumkin.
Har write indexlarni ham yangilaydi, shu sababli ortiqcha index storage va performance sarflaydi.
Transaction
Barcha operation transaction ichida bajariladi.
Mode:
- readonly;
- readwrite;
- versionchange.
Transaction object store scope’iga ega.
Bir nechta write atomik tarzda muvaffaqiyatli tugashi yoki rollback bo‘lishi mumkin.
Transaction lifecycle
IndexedDB transaction event loop behavioriga bog‘liq holda active qoladi.
Asynchronous boshqa ishni uzoq kutib, keyin eski transactionga write qilish xato berishi mumkin.
Kerakli data avval olinadi yoki yangi transaction ochiladi.
Wrapper library bu murakkablikni kamaytirishi mumkin.
Cursor
Cursor record yoki index bo‘ylab ketma-ket yuradi.
U:
- filter;
- range;
- direction;
- paginationga yaqin iteration
uchun ishlatiladi.
Katta object store’ni getAll bilan to‘liq memoryga olish o‘rniga cursor ishlatilishi mumkin.
Key range
IDBKeyRange ma’lum key oralig‘ini belgilaydi:
- only;
- lowerBound;
- upperBound;
- bound.
Index bilan birga range query bajariladi.
Murakkab SQL JOIN yoki arbitrary query mavjud emas.
Data model IndexedDB access patterniga mos tuziladi.
Structured clone
Objectlar structured clone algoritmi bilan saqlanadi.
Qo‘llanishi mumkin:
- object;
- array;
- Date;
- Blob;
- ArrayBuffer;
- Map va Setga oid qo‘llab-quvvatlash.
Function, DOM node va ayrim maxsus obyektlar saqlanmasligi mumkin.
Schema upgrade
Database version oshganda upgradeneeded eventida:
bajariladi.
Upgrade boshqa ochiq tablar sabab bloklanishi mumkin.
Versionchange
Bir tab database’ni yangi versionga ochmoqchi bo‘lsa boshqa tablarning eski connectionlari upgrade’ni bloklashi mumkin.
versionchange event kelganda eski connection yopiladi.
Userga sahifani yangilash xabari ko‘rsatilishi mumkin.
Origin va quota
IndexedDB origin bo‘yicha ajratiladi.
Storage quota browser, disk va user interactionga bog‘liq.
Katta offline data uchun storage estimate va persistence requestga oid API’lar ishlatilishi mumkin.
Quota tugaganda write xato beradi.
Offline
PWA serverdan olingan data’ni IndexedDBda saqlab offline ko‘rsatishi mumkin.
Sync vaqtida:
- version;
- updated_at;
- conflict;
- deletion;
- retry;
- idempotency
boshqariladi.
Local data server source of truth bilan moslashtiriladi.
Cache API bilan farqi
Cache API Request va Response obyektlarini HTTP cachega o‘xshash tarzda saqlaydi.
IndexedDB application-specific object va indexli query uchun mos.
Ko‘p PWA ikkalasini birga ishlatadi:
Security
IndexedDBga faqat ayni origin scriptlari access qiladi.
XSS mavjud bo‘lsa attacker ayni user kontekstida database’ni o‘qishi mumkin.
Sensitive data encryption kerak bo‘lsa key management muammosi ham hisobga olinadi.
Logout va account almashish local recordlarni tozalashi kerak.
Compound index
Bir nechta property bo‘yicha qidirish uchun compound keyPath ishlatilishi mumkin:
["tenant_id", "status"]
Bu tenant ichidagi status querysini tezlashtiradi. Field tartibi range queryga ta’sir qiladi. Har ehtimoliy filter uchun index yaratish write va storage xarajatini oshiradi.
Bulk operation
Ko‘p record yozishda bitta readwrite transaction ichida batch bajarish samaraliroq. Har record uchun alohida transaction ochish overhead va partial state yaratadi. Juda katta batch esa transaction vaqtini uzaytiradi va boshqa tablarni bloklashi mumkin.
Backup va export
IndexedDB browser profile’iga bog‘liq, user uni tozalashi yoki qurilmani yo‘qotishi mumkin. Muhim data server bilan sync qilinadi yoki userga export imkoniyati beriladi. Local database yagona permanent backup sifatida qaralmaydi.
Bog‘liq tushunchalar
IndexedDB, Object store, Index, Transaction, Cursor, KeyPath, Structured clone, Browser storage, LocalStorage, PWA, Offline-first