SchemaKeeper yordamida ma'lumotlar bazasidagi biznes mantig'i

Ushbu maqolaning maqsadi kutubxona misolidan foydalanishdir sxema saqlovchisi PostgreSQL DBMS yordamida PHP loyihalarida ma'lumotlar bazalarini ishlab chiqish jarayonini sezilarli darajada soddalashtiradigan vositalarni ko'rsatish.

Ushbu maqoladagi ma'lumotlar, birinchi navbatda, PostgreSQL imkoniyatlaridan maksimal darajada foydalanmoqchi bo'lgan, lekin ma'lumotlar bazasida joylashtirilgan biznes mantiqini saqlashda muammolarga duch kelgan ishlab chiquvchilar uchun foydali bo'ladi.

Ushbu maqolada biznes mantig'ini ma'lumotlar bazasida saqlashning afzalliklari yoki kamchiliklari tasvirlanmaydi. Tanlov allaqachon o'quvchi tomonidan qilingan deb taxmin qilinadi.

Quyidagi savollar ko'rib chiqiladi:

  1. Versiyalarni boshqarish tizimida (keyingi o'rinlarda VCS deb yuritiladi) ma'lumotlar bazasi tuzilmasi dumpi qanday shaklda saqlanishi kerak?
  2. Dampni saqlagandan so'ng ma'lumotlar bazasi tarkibidagi o'zgarishlarni qanday kuzatish mumkin
  3. Ma'lumotlar bazasi tarkibidagi o'zgarishlarni ziddiyatlarsiz va ulkan migratsiya fayllarisiz boshqa muhitlarga qanday o'tkazish mumkin
  4. Bir nechta ishlab chiquvchilar tomonidan loyihada parallel ishlash jarayonini qanday tashkil qilish kerak
  5. Ma'lumotlar bazasi tuzilmasidagi qo'shimcha o'zgarishlarni ishlab chiqarish muhitiga qanday qilib xavfsiz tarzda joylashtirish mumkin

    SxemaKeeper tilda yozilgan saqlangan protseduralar bilan ishlash uchun mo'ljallangan PL/pgSQL. Boshqa tillar bilan test o'tkazilmagan, shuning uchun foydalanish unchalik samarali bo'lmasligi yoki imkonsiz bo'lishi mumkin.

VCS-da ma'lumotlar bazasi tuzilmasini qanday saqlash kerak

kutubxona sxema saqlovchisi funktsiyani taqdim etadi saveDump, bu ma'lumotlar bazasidan barcha ob'ektlarning tuzilishini alohida matnli fayllar sifatida saqlaydi. Chiqish VCS ga osongina qo'shilishi mumkin bo'lgan guruhlangan fayllarga bo'lingan ma'lumotlar bazasi tuzilishini o'z ichiga olgan katalogdir.

Keling, bir nechta misollar yordamida ob'ektlarni ma'lumotlar bazasidan fayllarga aylantirishni ko'rib chiqaylik:

Tip ob'ekta
Sxema
ism
Faylga nisbatan nisbiy yo'l

stol
ijtimoiy
hisob
./public/tables/accounts.txt

Saqlangan protsedura
ijtimoiy
auth (xesh bigint)
./public/functions/auth(int8).sql

Kirish
bron
tariflari
./booking/views/tariffs.txt

Fayllarning mazmuni ma'lum bir ma'lumotlar bazasi ob'ekti tuzilishining matnli tasviridir. Masalan, saqlangan protseduralar uchun fayl mazmuni blokdan boshlab saqlangan protseduraning to'liq ta'rifi bo'ladi. CREATE OR REPLACE FUNCTION.

Yuqoridagi jadvaldan ko'rinib turibdiki, faylga yo'l ob'ekt turi, sxemasi va nomi haqidagi ma'lumotlarni saqlaydi. Ushbu yondashuv ma'lumotlar bazasidagi o'zgarishlarni dump va kodni ko'rib chiqishda harakat qilishni osonlashtiradi.

kengaytirish .sql saqlangan protsedura manba kodi bo'lgan fayllar uchun bu IDE fayl ochilganda ma'lumotlar bazasi bilan o'zaro ishlash vositalarini avtomatik ravishda taqdim etishi uchun tanlangan.

Dampni saqlagandan so'ng ma'lumotlar bazasi tarkibidagi o'zgarishlarni qanday kuzatish mumkin

VCS-da joriy ma'lumotlar bazasi tuzilmasining dumpini saqlash orqali biz dump yaratilgandan so'ng ma'lumotlar bazasi tuzilishiga o'zgartirishlar kiritilganligini tekshirish imkoniyatiga ega bo'lamiz. Kutubxonada sxema saqlovchisi ma'lumotlar bazasi strukturasidagi o'zgarishlarni aniqlash uchun funksiya taqdim etiladi verifyDump, bu nojo'ya ta'sirlarsiz farqlar haqida ma'lumotni qaytaradi.

Tekshirishning muqobil usuli bu funksiyani qayta chaqirishdir saveDump, bir xil katalogni belgilang va o'zgarishlar uchun VCS-ni tekshiring. Ma'lumotlar bazasidagi barcha ob'ektlar alohida fayllarda saqlanganligi sababli, VCS faqat o'zgartirilgan ob'ektlarni ko'rsatadi.
Ushbu usulning asosiy kamchiliklari - o'zgarishlarni ko'rish uchun fayllarni qayta yozish zarurati.

Ma'lumotlar bazasi tarkibidagi o'zgarishlarni ziddiyatlarsiz va ulkan migratsiya fayllarisiz boshqa muhitlarga qanday o'tkazish mumkin

Funksiya uchun rahmat deployDump Saqlangan protseduralarning manba kodi oddiy dastur manba kodi bilan bir xil tarzda tahrirlanishi mumkin. Siz saqlangan protsedura kodiga yangi qatorlarni qo'shishingiz/o'chirishingiz va darhol versiya boshqaruviga o'zgartirishlar kiritishingiz yoki dump katalogidagi mos fayllarni yaratish/o'chirish orqali saqlangan protseduralarni yaratishingiz/o'chirishingiz mumkin.

Masalan, sxemada yangi saqlangan protsedura yaratish public faqat kengaytmali yangi fayl yarating .sql katalogda public/functions, unda saqlangan protseduraning manba kodini, shu jumladan blokni joylashtiring CREATE OR REPLACE FUNCTION, keyin funksiyani chaqiring deployDump. Saqlangan protsedurani o'zgartirish va o'chirish xuddi shu tarzda sodir bo'ladi. Shunday qilib, kod bir vaqtning o'zida VCS va ma'lumotlar bazasiga kiradi.

Agar biron-bir saqlangan protseduraning manba kodida xatolik yoki fayl nomlari va saqlangan protsedura o'rtasida nomuvofiqlik paydo bo'lsa, u holda deployDump xato matnini ko'rsatib, muvaffaqiyatsiz bo'ladi. Foydalanishda dump va joriy ma'lumotlar bazasi o'rtasida saqlangan protseduralarning mos kelmasligi mumkin emas deployDump.

Yangi saqlangan protsedurani yaratishda to'g'ri fayl nomini qo'lda kiritishning hojati yo'q. Fayl kengaytmaga ega bo'lishi kifoya .sql. Qo'ng'iroqdan keyin deployDump xato matni fayl nomini o'zgartirish uchun ishlatilishi mumkin bo'lgan to'g'ri nomni o'z ichiga oladi.

deployDump qo'shimcha harakatlarsiz funktsiya yoki qaytish turi parametrlarini o'zgartirishga imkon beradi, klassik yondashuv bilan esa
birinchi bo'lib bajaring DROP FUNCTION, va faqat keyin CREATE OR REPLACE FUNCTION.

Afsuski, ba'zi holatlar mavjud deployDump o'zgarishlarni avtomatik ravishda qo'llash mumkin emas. Misol uchun, agar kamida bitta trigger tomonidan ishlatiladigan trigger funktsiyasi o'chirilsa. Bunday holatlar migratsiya fayllari yordamida qo'lda hal qilinadi.

O'zgarishlarni saqlangan protseduralarga ko'chirish uchun javobgar bo'lsangiz sxema saqlovchisi, keyin strukturadagi boshqa o'zgarishlarni uzatish uchun migratsiya fayllaridan foydalanish kerak. Misol uchun, migratsiya bilan ishlash uchun yaxshi kutubxona doktrina/migratsiya.

Migratsiyalar ishga tushirishdan oldin qo'llanilishi kerak deployDump. Bu sizga tuzilmadagi barcha o'zgarishlarni amalga oshirish va muammoli vaziyatlarni hal qilish imkonini beradi, shunda saqlangan protseduralardagi o'zgarishlar keyinchalik muammosiz uzatiladi.

Migratsiya bilan ishlash keyingi bo'limlarda batafsil tavsiflanadi.

Bir nechta ishlab chiquvchilar tomonidan loyihada parallel ishlash jarayonini qanday tashkil qilish kerak

Ma'lumotlar bazasini to'liq ishga tushirish uchun skript yaratish kerak, uni ishlab chiquvchi o'z ish mashinasida ishga tushiradi, mahalliy ma'lumotlar bazasi tuzilishini VCS-da saqlangan axlatga moslashtiradi. Eng oson yo'li - mahalliy ma'lumotlar bazasini ishga tushirishni 3 bosqichga bo'lish:

  1. Asosiy tuzilishga ega bo'lgan faylni import qiling, masalan. base.sql
  2. Migratsiyani qo'llash
  3. Qiyinchilik deployDump

base.sql migratsiya qo'llaniladigan va amalga oshiriladigan boshlang'ich nuqtadir deployDump, ya'ni base.sql + миграции + deployDump = актуальная структура БД. Yordamchi dastur yordamida bunday faylni yaratishingiz mumkin pg_dump. Ishlatilgan base.sql faqat ma'lumotlar bazasini noldan ishga tushirishda.

Keling, ma'lumotlar bazasini to'liq ishga tushirish uchun skriptni chaqiraylik refresh.sh. Ish jarayoni quyidagicha ko'rinishi mumkin:

  1. Ishlab chiquvchi o'z muhitida ishga tushadi refresh.sh va joriy ma'lumotlar bazasi tuzilishini oladi
  2. Ishlab chiquvchi yangi funksiya ehtiyojlarini qondirish uchun mahalliy ma'lumotlar bazasini o'zgartirib, topshiriq ustida ishlashni boshlaydi (ALTER TABLE ... ADD COLUMN va hokazo)
  3. Vazifani bajargandan so'ng, ishlab chiquvchi funktsiyani chaqiradi saveDumpVCS ma'lumotlar bazasiga kiritilgan o'zgarishlarni amalga oshirish
  4. Ishlab chiquvchini qayta ishga tushirish refresh.sh, keyin verifyDumpbu endi migratsiyaga qo'shiladigan o'zgarishlar ro'yxatini ko'rsatadi
  5. Ishlab chiquvchi barcha tuzilma o'zgarishlarini migratsiya fayliga o'tkazadi, yana ishlaydi refresh.sh и verifyDump, va agar migratsiya to'g'ri tuzilgan bo'lsa, verifyDump mahalliy ma'lumotlar bazasi va saqlangan dump o'rtasida hech qanday farq ko'rsatmaydi

Yuqorida tavsiflangan jarayon gitflow tamoyillariga mos keladi. VCSdagi har bir shoxchada dumpning o'ziga xos versiyasi bo'ladi va filiallarni birlashtirganda axlatxonalar birlashtiriladi. Ko'pgina hollarda, birlashtirgandan so'ng qo'shimcha harakatlar qilish kerak emas, lekin agar o'zgarishlar turli filiallarda, masalan, bitta jadvalga kiritilgan bo'lsa, ziddiyat paydo bo'lishi mumkin.

Keling, bir misol yordamida ziddiyatli vaziyatni ko'rib chiqaylik: filial mavjud rivojlantirish, undan ikkita filial ajralib chiqadi: feature1 и feature2bilan hech qanday ziddiyatga ega bo'lmagan rivojlantirish, lekin bir-biri bilan ziddiyatga ega. Vazifa ikkala filialni birlashtirishdir rivojlantirish. Bunday holda, birinchi navbatda filiallardan birini birlashtirish tavsiya etiladi rivojlantirishva keyin birlashtiring rivojlantirish qolgan filialga, qolgan filialdagi nizolarni hal qilish va keyin oxirgi filialni birlashtirish rivojlantirish. Mojarolarni hal qilish bosqichida siz oxirgi filialdagi migratsiya faylini birlashtirish natijalarini o'z ichiga olgan yakuniy axlatga mos kelishi uchun tuzatishingiz kerak bo'lishi mumkin.

Ma'lumotlar bazasi tuzilmasidagi qo'shimcha o'zgarishlarni ishlab chiqarish muhitiga qanday qilib xavfsiz tarzda joylashtirish mumkin

VCSda joriy ma'lumotlar bazasi tuzilmasining borligi tufayli ishlab chiqarish ma'lumotlar bazasini kerakli tuzilishga aniq muvofiqligini tekshirish mumkin bo'ladi. Bu ishlab chiquvchilar mo'ljallangan barcha o'zgarishlar ishlab chiqarish bazasiga muvaffaqiyatli o'tkazilishini ta'minlaydi.

chunki DDL PostgreSQL da mavjud tranzaksiyaviy, quyidagi joylashtirish tartibiga rioya qilish tavsiya etiladi, shunda kutilmagan xatolik yuz berganda, siz "og'riqsiz" bajarishingiz mumkin. ROLLBACK:

  1. Tranzaksiyani boshlash
  2. Tranzaksiyada barcha migratsiyalarni bajaring
  3. Xuddi shu tranzaksiyada bajaring deployDump
  4. Tranzaktsiyani tugatmasdan, bajaring verifyDump. Hech qanday xato bo'lmasa, ishga tushiring COMMIT. Agar xatolar bo'lsa, ishga tushiring ROLLBACK

Ushbu qadamlar ilovalarni joylashtirishning mavjud yondashuvlariga, shu jumladan nol ishlamay qolish vaqtiga osongina birlashtirilishi mumkin.

xulosa

Yuqorida tavsiflangan usullar tufayli "PHP + PostgreSQL" loyihalarining maksimal ishlashini siqib chiqarish mumkin, shu bilan birga asosiy dastur kodidagi barcha biznes mantiqlarini amalga oshirish bilan solishtirganda nisbatan kam rivojlanish qulayligidan voz kechish mumkin. Bundan tashqari, ma'lumotlarni qayta ishlash PL/pgSQL ko'pincha shaffofroq ko'rinadi va PHP-da yozilgan bir xil funksionallikka qaraganda kamroq kod talab qiladi.

Manba: www.habr.com

a Izoh qo'shish