Äriloogika andmebaasis SchemaKeeperi abil

Selle artikli eesmĂ€rk on nĂ€idata raamatukogu schema-keeper tööriistu, mis vĂ”imaldavad oluliselt lihtsustada andmebaaside arendamise protsessi PHP-projektides, mis kasutavad PostgreSQL andmebaasihaldussĂŒsteemi.

KÀesolevast artiklist on kasu eelkÔige arendajatele, kes soovivad maksimaalselt Àra kasutada PostgreSQLi vÔimalusi, kuid seisavad silmitsi Àriloogika haldamise probleemidega, mis on viidud andmebaasi.

Artikkel ei kÀsitle Àriloogika hoidmise eeliseid vÔi puudusi andmebaasis. Eeldatakse, et lugeja on valiku juba teinud.

KĂ€sitletakse jĂ€rgmisi kĂŒsimusi:

  1. Kuidas sĂ€ilitada andmebaasi struktuuri varukoopia versioonihaldussĂŒsteemis (edaspidi VCS)
  2. Kuidas jÀlgida andmebaasi struktuuri muutusi pÀrast varukoopia salvestamist
  3. Kuidas edastada andmebaasi struktuuri muutusi teistele keskkondadele ilma konfliktideta ja suuremate migratsioonifailideta
  4. Kuidas korraldada mitme arendaja paralleelset töötamist projekti kallal
  5. Kuidas turvaliselt juurutada suurem hulk andmebaasi struktuuri muutusi tootmisringkonda

    SchemaKeeper on loodud salvestatud protseduuride töötlemiseks, mis on kirjutatud keeles PL/pgSQL. Testimine teiste keeltest ei ole toimunud, seetÔttu vÔib kasutamine olla vÀhem tÔhus vÔi isegi vÔimatu.

Kuidas salvestada andmebaasi struktuuri dump VCS-is

Raamatukogu schema-keeper pakub funktsiooni saveDump, mis salvestab kĂ”ikide objektide struktuuri andmebaasist eraldi tekstifailidena. Tulemuseks luuakse kataloog, mis sisaldab andmebaasi struktuuri, jagatuna rĂŒhmitatud failideks, mida on lihtne VCS-i lisada.

Vaadata objekti teisendamist andmebaasist failideks mitmete nÀidete abil:

Objekti tĂŒĂŒp
Skeem
Nimi
Faili suhteline tee

Tabel
public
accounts
./public/tables/accounts.txt

Salvestatud protseduur
public
auth(hash bigint)
./public/functions/auth(int8).sql

Vaade
booking
tariffs
./booking/views/tariffs.txt

Failide sisu on objekti andmebaasi struktuuri tekstiline esitus. NÀiteks salvestatud protseduuride puhul on faili sisuks salvestatud protseduuri tÀiendav mÀÀratlemine, mis algab plokist CREATE OR REPLACE FUNCTION.

Nagu nĂ€ha ĂŒlaltoodud tabelist, sisaldab faili tee teavet objekti tĂŒĂŒbi, skeemi ja nime kohta. Selline lĂ€henemine lihtsustab dump'i navigeerimist ja andmebaasi muudatuste arvustamist.

Laiendus .sql protseduuride lÀhtekoodifailide jaoks on valitud, et IDE-d pakuksid automaatselt tööriistu andmebaasi interaktsiooniks faili avamisel.

Kuidas jÀlgida andmebaasi struktuuri muutusi pÀrast varukoopia salvestamist

Salvestades praeguse andmebaasi struktuuri VCS-s, saame kontrollida, kas struktuuri on pÀrast dumpi loomist muudetud. Raamatukogus schema-keeper andmebaasi struktuuri muutuste tuvastamiseks on ette nÀhtud funktsioon verifyDump, mis tagastab ilma kÔrvalmÔjudeta teavet erinevuste kohta.

Alternatiivne kontrollimeetod — kutsuda uuesti vĂ€lja funktsioon saveDump, mĂ€rkides sama katalooge, ja kontrollida VCS-is muudatuste olemasolu. Kuna kĂ”ik andmebaasi objektid on salvestatud eraldi failidesse, nĂ€itab VCS ainult muudetud objekte.
Peamine miinus antud meetodi puhul — failide ĂŒmberkirjutamise vajadus muudatuste nĂ€gemiseks.

Kuidas edastada andmebaasi struktuuri muutusi teistele keskkondadele ilma konfliktideta ja suuremate migratsioonifailideta

TĂ€nu funktsioonile deployDump Salvestatud protseduuride lĂ€htekoodi saab muuta sama lihtsalt nagu tavalise rakenduse lĂ€htekoodi. Uusi koodiridasid saab lisada vĂ”i eemaldada salvestatud protseduuride koodis ning kohe saab saata muudatused versioonihaldussĂŒsteemi vĂ”i luua vĂ”i kustutada salvestatud protseduure, luues vĂ”i kustutades vastavaid faile koopia kaustas.

NÀiteks uue salvestatud protseduuri loomiseks skeemis public on piisav luua uus fail laiendiga .sql kaustas public/functions, asetada sellesse salvestatud protseduuri lÀhtekood, sealhulgas plokk CREATE OR REPLACE FUNCTION, seejÀrel kutsuda vÀlja funktsioon deployDump. Sarnasel viisil toimub salvestatud protseduuri muutmine ja kustutamine. Seega satub kood samal ajal nii VCS-i kui ka andmebaasi.

Kui mÔne salvestatud protseduuri lÀhtekoodis ilmneb viga vÔi tekib vastuolu faili nime ja salvestatud protseduuri vahel, siis deployDump ei toimu, kuvades veateate. Salvestatud protseduuride lahknevus koopia ja praeguse andmebaasi vahel on vÔimatu, kui kasutatakse deployDump.

Uue salvestatud protseduuri loomisel ei ole vaja kĂ€sitsi sisestada Ă”iget faili nime. Piisab, kui failil on laiend .sql. PĂ€rast vĂ€ljakutsumist deployDump veatekst sisaldab Ă”iget nime, mida saab kasutada faili ĂŒmbernimetamiseks.

deployDump vĂ”imaldab muuta funktsiooni vĂ”i tagastatava tĂŒĂŒbi parameetreid ilma tĂ€iendavate toiminguteta, samas kui klassikalise lĂ€henemise korral oleks olnud vajalik
esiteks teostada DROP FUNCTION, ja alles siis CREATE OR REPLACE FUNCTION.

Kahjuks on olukordi, kus deployDump ei ole suuteline automaatselt muudatusi rakendama. NĂ€iteks, kui eemaldatakse kĂ€ivitusfunktsioon, mida kasutab vĂ€hemalt ĂŒks kĂ€ivitus. Sellised olukorrad lahendatakse kĂ€sitsi migratsioonifailide abil.

Kui muutuste eest hĂ€lbivates protseduurides vastutab schema-keeper, siis ĂŒlejÀÀnud struktuuri muudatuste ĂŒleviimiseks tuleb kasutada migratsioonifaile. NĂ€iteks on hea raamatukogu migratsioonide jaoks doctrine/migrations.

Migratsioonid peavad olema rakendatud enne deployDump. See vĂ”imaldab teha kĂ”ik muudatused struktuuris ja lahendada probleemsed olukorrad, et muudatused hĂ€lbivates protseduurides saaks hiljem probleemideta ĂŒle kanda.

Migratsioonide töö kohta lÀhemalt tuleb juttu jÀrgmistes osades.

Kuidas korraldada mitme arendaja paralleelset töötamist projekti kallal

On oluline luua tÀieliku andmebaasi initsialiseerimise skript, mis kÀivitatakse arendaja oma töökeskkonnas, et viia kohaliku andmebaasi struktuur vastavusse VCS-i salvestatud dumpiga. Lihtsaim on jagada kohaliku andmebaasi initsialiseerimine kolme etappi:

  1. Importida fail pÔhistruktuuriga, mida saab nÀiteks nimetada base.sql
  2. Rakendada migratsioone
  3. Kutse deployDump

base.sql — see on lĂ€htepunt, millele tuginedes rakendatakse migratsioone ja tehakse deployDump, st base.sql + migratsioonid + deployDump = ajakohane andmebaasi struktuur. Sellise faili genereerimiseks saab kasutada utiliiti pg_dump. Seda kasutatakse base.sql ainult andmebaasi initsialiseerimiseks nullist.

Nimetame tÀieliku andmebaasi initsialiseerimise skripti refresh.sh. Töövoog vÔiks vÀlja nÀha jÀrgmiselt:

  1. Arendaja kÀivitab oma keskkonnas refresh.sh ja saab ajakohase andmebaasi struktuuri
  2. Arendaja hakkab töötama seatud ĂŒlesande kallal, muutes kohaliku andmebaasi vastavalt uue funktsiooni vajadustele (ALTER TABLE ... ADD COLUMN jne)
  3. PĂ€rast ĂŒlesande tĂ€itmist kutsub arendaja vĂ€lja funktsiooni saveDump, et fikseerida VCS-is andmebaasis tehtud muudatused
  4. Arendaja kĂ€ivitab uuesti refresh.sh, seejĂ€rel verifyDump, mis nĂŒĂŒd nĂ€itab migratsiooni kaasamise muudatuste loendit
  5. Arendaja viib kĂ”ik struktuuri muutused ĂŒle migratsioonifaili, kĂ€ivitab selle uuesti refresh.sh ja verifyDump, ja kui migratsioon on korrektselt koostatud, verifyDump nĂ€itab see erinevuste puudumist kohaliku andmebaasi ja salvestatud dumpi vahel

Ülaltoodud protsess on kooskĂ”las gitflow pĂ”himĂ”tetega. Iga haru VCS-is sisaldab oma dumpi versiooni ning harude sulandumisel toimub dumpide ĂŒhendamine. Enamasti ei ole pĂ€rast sulandumist vaja teha tĂ€iendavaid toiminguid, kuid kui erinevates harudes on tehtud muudatusi, nĂ€iteks samasse tabelisse, vĂ”ib tekkida konflikt.

Vaatame konfliktset olukorda nĂ€itel: on haru develop, millest on vĂ€lja kasvanud kaks haru: feature1 ja feature2, mis ei sisalda konflikte develop, kuid omavad ĂŒksteisega konflikte. Ülesanne on sulandada mĂ”lemad harud develop. Sellisel juhul soovitatakse kĂ”igepealt sulandada ĂŒks harudest develop, seejĂ€rel siis develop jĂ€tta alles haru, lahendades konfliktid seal, pĂ€rast mida sulandada viimane haru develop. Konfliktide lahendamise etapis vĂ”ib olla vajalik migreerimisfaili muutmine viimases haru, et see vastaks lĂ”ppdumpile, mis sisaldab liitumiste tulemusi.

Kuidas turvaliselt juurutada suurem hulk andmebaasi struktuuri muutusi tootmisringkonda

TÀnu VCS-s olevatele andmebaasi struktuuri dumpidele on vÔimalik kontrollida tootmisbaasi tÀpset vastavust nÔutud struktuurile. See tagab, et tootmisbaasi on edukalt kantud kÔik muudatused, mida arendajad kavandasid.

Kuna DDL PostgreSQL-is on tehinguline, soovitatakse jÀrgida jÀrgmisi juurutamise etappe, et vajadusel 'valutult' teostada. RULLI TAGASI:

  1. Alusta tehingut.
  2. Tehingus teosta kÔik migratsioonid.
  3. Samuti teosta selles tehingus deployDump
  4. Ilma tehingut lÔpetamata teosta verifyDump. Kui vigu ei ole, teosta COMMIT. Kui vigu on, teosta RULLI TAGASI

Need sammud on piisavalt lihtsalt integreeritavad olemasolevatesse rakenduste juurutamise meetoditesse, sealhulgas zero-downtime'i lÀhenemistesse.

KokkuvÔte

Ülaltoodud meetodite abil on vĂ”imalik maksimeerida «PHP + PostgreSQL» projektide jĂ”udlust, ohverdades samas suhteliselt vĂ€ikese arenduse mugavuse vĂ”rreldes kogu Ă€ri-logika realiseerimisega rakenduse pĂ”hikoodis. Lisaks sellele, andmete töötlemine PL/pgSQL nĂ€eb sageli vĂ€lja lĂ€bipaistvam ja nĂ”uab vĂ€hem koodi, kui sama funktsionaalsus, kirjutatud PHP-s.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster