Reyslarning eng yaxshi amaliyoti - PostgreSQL-da doimiy manzillar

Kalit / qiymat juftliklarini saqlash uchun

Xulosa: SQL ma'lumotlar bazasidan murakkab ma'lumot turlarini saqlash va olishning izchil, bajaruvchi va ishonchli usulini taklif qiladigan echim taklif qiling.

Ilovalarni rejalashtirish muvaffaqiyatli veb-ilovalarni yaratishda hal qiluvchi va ko'pincha e'tibordan chetda qoladigan qadamdir. Reyslar tizimi dasturni yaratishni osonlashtiradi va uni yuklab olishni osonlashtiradi, chunki ishlab chiquvchilar rejalashtirishni o'tkazib yuborishga va rivojlanishdan sakrashga moyil. Shu bilan birga, domenni to'g'ri rejalashtirishdan oldin dastur kodini yaratish, ishlamay qolishi yoki hatto ishlamay qolishi mumkin. Masalan, dasturda "manzil" maydonini boshqarishning eng yaxshi usulini ko'rib chiqing.

Manzilda nima bor?

Amerika Qo'shma Shtatlaridagi odatiy manzara quyidagicha:

Manzil: [
Ko'cha: "Baxtli kunlar qatori" qatori
Shahar: "Ajoyib dunyo" tor
Holat: "PA" tor
Zip: 10102 satr
]

"Manzil" qiymati kalit / qiymat juftliklari qatoridan iborat bo'lib, ularning qiymati satrdir. Ilovalarda ko'rish juda keng tarqalgan maydon. Shunday qilib, SQL ma'lumotlar bazasida "Manzil" qiymatini ko'rsatishning eng yaxshi usuli qanday? Buni aniqlash uchun keling, ushbu vaziyatda boshqa ishlab chiquvchilar nima qilayotganlarini ko'rib chiqaylik.

1-variant: Qiymatni bitta maydonda satr sifatida saqlang, masalan:

Manzil: “123 Happy Days Ln. Wonderland, PA 10102 ”

Bu yomon echim. Yuqoridagi bo'limda ko'rib chiqqanimizdek, manzil - bu kalit / qiymat juftliklari to'plami. Har qanday boshqa skalalar maydoni kabi manzilga murojaat qilish to'g'ri kelmaydi. Kelajakda biron bir joyda dasturni kengaytirmoqchi bo'lsak, bu nomuvofiqlik aniq bo'ladi. Aytaylik, biz barcha mijozlarni ushbu "Shahar" yoki "Shtat" dan topishni xohlaymiz. "Manzil" ning butun qiymati satr ichida yig'ilganligi sababli, buni qilishning oson yo'li yo'q.

2-variant: "Manzil" qiymatini alohida maydonlarga ajrating va ushbu maydonchalarni saqlang, masalan:

Ko'cha: "123 Happy Days Ln", Shahar: "Ajoyib dunyo", shtat: "PA", Zip: "10102"

Bu erda biz "shahar" yoki "shtat" ning barcha mijozlarini qidirish bo'yicha oldingi farazni hal qildik. Biroq, biz hozirda "Manzil" maydonini to'rtta alohida va alohida maydonlar sifatida ifodalaymiz, aslida esa maydonlar birlashtirilishi kerak.

Variant 3: Alohida manzillar jadvalini va chet el kalitlari assotsiatsiyasini yarating

Bloglardagi bir nechta postlar va StackOverflow-ning javoblari, manzillarni Rails-da saqlashning eng yaxshi usuli bu alohida modeldan va assotsiatsiyadan foydalanishdir. Shu tarzda, foydalanuvchi yoki biznes modelida bir manzil bo'lishi mumkin va bitta manzil bilan cheklanmaydi. Shuningdek, manzillar to'g'ri saqlanishi kerak, chunki har bir "Manzil" modeli uning kalitlari va tegishli qiymatlardan iborat bo'lishi kerak. Bu sizning amaliy modelingiz, masalan, "Foydalanuvchilar" bir nechta manzillarni chaqiradi deb faraz qilib, bu yomon echim emas. Ammo, agar har bir modelga faqat bitta manzil kerak bo'lsa (ko'pchilik uchun bo'lgani kabi, pochta manzili), qo'shimcha jadvallar va assotsiatsiyalarni qo'shish orqali siz dasturning murakkabligini oshirasiz. Rails-da jadvallar va birlashmalar yaratish juda oddiy, bu uchinchi variantning sababi bo'lishi mumkin. "Foydalanuvchi" ga mos keladigan yangi "Manzil" jadvalini yaratish oddiygina: relslar g modeli Manzil ko'chasi: tor shahar: string holati: satr zip: satr foydalanuvchisi: havolalar "Bu eng yaxshi narsa" dasturingizda mashq qiling yoki bu murakkabroq masalaning oddiy echimi emasmi? ”

Qaror:

Rails / PostgreSQL - ishlab chiqarish va ishlab chiqarishda ishlatiladigan keng tarqalgan texnologik stack. "Hstore" kengaytmasini yoqish orqali manzillarni kerakli shaklda saqlash usuli mavjud. Ushbu kengaytma bizga ma'lumotlarni "hstore" (hash-do'kon) turi sifatida saqlashga imkon beradi. Birinchi qadam 'hstore' modulini yoqish. Buning uchun biz ko'chirishni yozamiz:

Buyruqlar satridan 'ray db: migratsiya' ni ishga tushirganimizda, Postgres 'hstore' kengaytmasini yoqadi. Buni schema.rb faylini tekshirish orqali tekshirish mumkin. Endi faylning yuqori qismiga yaqin joyda ko'rishingiz kerak:

 # Bular bu ma'lumotlar bazasini qo'llab-quvvatlash uchun yoqilgan bo'lishi kerak bo'lgan kengaytmalar
enable_extension “plpgsql”
enable_extension “hstore”

Keyinchalik biz foydalanuvchi modeli uchun migratsiyani yaratamiz:

Manzil maydoni uchun "hstore" ma'lumotlar turidan qanday foydalanganimizga e'tibor bering. Bu bizga "manzil" ichida kalit / qiymat juftliklarini saqlashga imkon beradi.

Bundan tashqari: "oshxona" maydonidan har qanday kalit / qiymat juftligini saqlash uchun foydalanish mumkin. Ushbu maqolada biz "Manzil" ni o'rganmoqdamiz, ammo "Afzalliklar" yoki boshqa har qanday turdagi xesh ma'lumotlarini saqlash uchun ham foydalidir.

Shunday qilib, endi biz bilamiz, biz ma'lumotni City => "Wonderland" va State => "PA" shaklida saqlashimiz mumkin bo'lgan yagona maydon mavjud. Biz 'Foydalanuvchi' va 'Foydalanuvchilar' tekshirgichlarini yaratishimiz mumkin, ammo biz bazaning bazasida qanday qilib kalit / qiymat juftliklarini saqlab qo'yamiz? Yana bir masalani ko'rib chiqish kerak, qanday qilib "manzil" maydoniga Siti => "Mo'jizalar" kalit / qiymat juftligini saqlashimiz mumkin?

Tekshirish nazoratchisi nuqtai nazaridan, har qanday parametrlarni massaga biriktirilishidan oldin ularni oq ro'yxatga olishimiz kerak. Bu boshqa har qanday ma'lumotlar bazasi bilan bir xil bo'lgan "user_params" xususiy usulida amalga oshiriladi.

Manzilga tayinlanishi mumkin bo'lgan narsalarni oq ro'yxatga kiritib, biz kutgan ma'lumotlarga tegishli ko'rsatmalar berdik. Manzil maydoni shahar / qiymat juftligiga yoki davlat / qiymat juftligiga ega bo'lishi mumkin, ammo maymun / qiymat juftligi emas.

Foydalanuvchi shaklida biz ma'lumotlarni to'plash uchun tegishli maydonlar bilan ta'minlaymiz:

Butun shakl namoyish uchun ko'rsatilgan. Biroq, manzil maydonining boshi va oxiri html izohlari bilan belgilanadi. Biz manzil uchun maydonlar yaratish uchun form yordamchisidan qanday foydalanganimizga e'tibor bering. Har bir maydon biz boshqaruvchida belgilangan oq ro'yxatga olingan parametrga mos keladi. Ushbu maqola bilan bog'liq bo'lmasa-da, shakl Semantik-UI kutubxonasi darslari bilan bezatilgan - bu juda sezgir va ajoyib ko'rinishni anglatadi!

Yuqoridagi shakl brauzerda ko'rsatiladi

Biz tezda foydalanuvchi yaratamiz va "Manzil" maydoni qanday ko'rinishini ko'ramiz:

Manzil maydoni, kalit / qiymat juftlarining aralashmasi sifatida saqlandi, mukammal!

Yuqoridagi rasmda "mavzu" atamasi "foydalanuvchi" bilan sinonimdir. Ko'rib turganingizdek, "Manzil" maydoni bizning kalit / qiymat juftligimizni xuddi biz kutganimiz kabi boshqaruvchidan saqlab qoldi. Agar biz foydalanadigan ma'lum bir shaharning qiymatini topishni istasak, @ user.address ['city'] va bu bizning foydalanishimiz misolida «Ajoyib dunyo» ni qaytaradi.

Ushbu maqolada PostgreSQL-da 'hstore' kengaytmasi orqali ma'lumotlarning murakkab turlarini saqlash va so'rashning maqbul usulini topdik. Biz eng yaxshi tajriba sifatida veb-ilovani yaratishda dastlabki qadamlarni rejalashtirish va to'plash ekanligini aniqladik. Shuningdek, biz hujjatlarni o'rganish va o'qish orqali o'zimizdan ma'lumot topishning muhimligini bilib oldik. Boshqa bir ishlab chiqaruvchi yoki kompaniya biron bir narsani bitta usul bilan amalga oshirishi, biz ko'r-ko'rona ergashishimizni anglatmaydi. "Nima uchun" savol berish va mantiqiy xulosa chiqarish uchun o'zimizning bilim qobiliyatimizdan foydalanish juda muhimdir. Umid qilamanki, siz ushbu maqolani foydali deb topdingiz. Veb-texnologiyalar bo'yicha bepul ma'lumotlar va qo'llanmalar uchun Learn2Code-ga tashrif buyuring.