Bosh sahifa Wiki IndexedDB

IndexedDB

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:

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