- Published on
Firebase Firestore bilan tanishuv va ma'lumotlar bazasini loyihalash
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
Cloud Firestore nima?
Firebase ikkita ma'lumotlar bazasini (database) taklif qiladi: Realtime Database va Cloud Firestore. Realtime Database - bu eski texnologiya hisoblanadi. Zamonaviy ilovalarning aksariyati Cloud Firestore'ni tanlashadi, chunki uni ishlatish osonroq, kuchliroq qidiruv (querying) imkoniyatlariga ega va cheksiz masshtablana oladi (scalable). Apple'ning CloudKit texnologiyasi bilan solishtirganda, Firestore'ni sozlash va ishlatish sezilarli darajada sodda hisoblanadi, hamda u Android va Web uchun ham mos keladi.
Baza yaratish
Firebase Console'ga kirib Firestore Database bo'limidan Create database ni tanlang:
- Security rules: Boshlanishida "Test mode"ni tanlang (bir oygacha hamma bemalol yozib-o'qishi mumkin). Kelajakda ularni xavfsiz holatga o'tkazamiz.
- Server joylashuvi: Ilovangiz foydalanuvchilarining katta qismi qayerda yashasa, o'sha hududga eng yaqin serverni tanlang (Masalan, Europe yoki United States). Diqqat: buni keyinroq o'zgartirib bo'lmaydi!
Firestore strukturasi
Firestore NoSQL turidagi ma'lumotlar bazasi bo'lib, u ikki asosiy tushunchaga asoslanadi: Collection (To'plam) va Document (Hujjat).
- Collection: Bu papka (folder). Papka o'z ichida cheksiz miqdordagi hujjatlarni saqlashi mumkin.
- Document: Bu aniq bir ma'lumot yozuvi (masalan, bitta foydalanuvchi profili). Har bir hujjat o'z ichida maydonlarni (Fields) saqlaydi.
- Qoida: Collection ichida faqat Document'lar bo'ladi. Document ichida esa Collection'lar bo'lishi mumkin (Sub-collection).
Hujjat hajmi uchun limit: Bitta hujjat eng ko'pi bilan 1 Megabayt joy egallashi mumkin (bu taxminan 1 millionta harf degani). Collection ichidagi hujjatlar soni esa mutlaqo cheklanmagan!
Data tiplari va Nomlash qoidalari
Hujjat ichidagi maydonlar turli xil bo'lishi mumkin: String, Number, Boolean, Array, Map (Dictionary), GeoPoint (Kenglik/Uzunlik), Timestamp (Sana).
Juda muhim qoida: Swift'da biz o'zgaruvchilarni camelCase ko'rinishida yozishga o'rganganmiz (masalan, isHealthy). Lekin ma'lumotlar bazasida iOS, Android va Web jamoalari bir xil tushunishi va muammo chiqmasligi uchun nomlarni snake_case da (masalan, is_healthy) yozish qabul qilingan best-practice hisoblanadi. Biz ham shunga amal qilamiz!
TIP
ID qo'shish: Firebase hujjatlarga avtomatik ID (masalan, "Kj83s92nd...") biriktiradi. Lekin hujjat ichidagi field'lar qatoriga ham id nomli qator ochib, o'sha uzun kodni yozib qo'yishni unutmang. Chunki Swift'da Codable orqali ma'lumotlarni o'qib olayotganda, hujjat ID'sini olish biroz qiyin bo'ladi. Hujjat ichida uning ID'si tursa, uni to'g'ridan to'g'ri o'qib ketamiz!
Arxitekturani loyihalash (Misollar)
Deylik, biz "Foydalanuvchining bozorlik ro'yxati"ni (Grocery List) bazada saqlamoqchimiz. Buni bazada 3 xil usulda qursak bo'ladi:
1-usul: Oddiy Array (Users hujjati ichida)
users kolleksiyasida user_1 hujjati bor. Uning ichida grocery_list: ["Apple", "Orange"] degan massiv ochamiz.
- Afzalligi: O'qish juda tez. Bitta so'rov orqali hamma narsa keladi.
- Kamchiligi: Mevalar haqida qo'shimcha ma'lumot (masalan, sotib olindimi, narxi qancha) saqlab bo'lmaydi, faqatgina matnlar ro'yxati.
2-usul: Sub-collection (Hujjat ichidagi kolleksiya)
users -> user_1 hujjati ichida yangi -> grocery_list degan kolleksiya ochamiz. Bu kolleksiya ichida har bir mahsulot alohida hujjatga aylanadi.
- Afzalligi: Har bir mahsulot hujjat bo'lgani uchun ularga qo'shimcha
priority: "high",is_bought: falsekabi xususiyatlar qo'shish mumkin. Kolleksiyadagi hujjatlar cheksiz bo'lishi mumkin. - Kamchiligi: Bu ma'lumotlarni faqatgina o'sha
user_1ning o'zi ishlatayotganda qulay, agar boshqa do'sti bilan ro'yxatni baham ko'rmoqchi bo'lsa (shared list), uni tashqaridan o'qish qiyin bo'ladi.
3-Usul: asosiy collection (Top-level)
Asosiy strukturada users kolleksiyasi bilan bir qatorda grocery_lists degan yangi mustaqil kolleksiya ochamiz. Har bir ro'yxat hujjati ichida kimga tegishli ekanligini bildiruvchi author_id: "user_1_id" maydoni bo'ladi.
- Afzalligi: Ommaviy suhbatlar (chat), ommaviy postlar yoki baham ko'rilgan ro'yxatlar uchun eng to'g'ri usul! "Barcha ro'yxatlar ichidan
author_idsi sening ID'ingga teng bo'lganlarini tortib ol" degan so'rov (query) yozish orqali ma'lumot topiladi. - Kamchiligi: Eng murakkab usul. Oldingisiga qaraganda qidiruvlar soni ortishi mumkin.
Xulosa
Qaysi usul eng yaxshi degan savolga "Sizning ilovangiz ma'lumotlarni qanday o'qib olishiga (fetch) qarab" deb javob beramiz. Ko'p hollarda bizga Collection -> Document -> SubCollection -> Document strukturasi (2-usul) to'g'ri keladi va bu eng keng tarqalgan "best practice" hisoblanadi.
Ushbu darsda biz barcha jarayonlarni shunchaki Web interfeys orqali o'rganib chiqdik. Keyingi darsda biz bazani tozalaymiz va bu narsalarni Xcode ichida Swift kodi orqali qanday yaratish va o'qib olishni boshlaymiz!