EttevÔtte loogika andmebaasis SchemaKeeperi abil

KĂ€esoleva artikli eesmĂ€rk on nĂ€idata raamatukogu nĂ€itel schema-keeper tööriistu, mis suudavad oluliselt lihtsustada andmebaaside arendamise protsessi PHP-projektides, mis kasutavad andmebaasisĂŒsteemi PostgreSQL.

Selle artikli teave on eelkÔige kasulik arendajatele, kes soovivad maksimaalselt Àra kasutada PostgreSQL-i vÔimalusi, kuid seisavad silmitsi probleemidega, mis on seotud ettevÔtte loogika sÀilitamisega andmebaasis.

Artikkel ei kÀsitle ettevÔtte loogika sÀilitamise eeliseid ega puudusi andmebaasis. Eeldatakse, et lugeja on juba valiku teinud.

KÀesolevas tööks uuritakse jÀrgmisi teemasid:

  1. Millises vormis hoida andmebaasi struktuuri dump versioonihaldussĂŒsteemis (edaspidi - VCS)
  2. Kuidas jÀlgida andmebaasi struktuuri muudatusi pÀrast dumpi salvestamist
  3. Kuidas edastada andmebaasi struktuuri muudatusi teistesse keskkondadesse ilma konfliktide ja hiiglaslike migratsioonifailideta
  4. Kuidas korraldada mitme arendaja paralleelset tööd projekti kallal
  5. Kuidas turvaliselt juurutada suurem hulk muudatusi andmebaasi struktuuris tootmiskeskkonnas

    SchemaKeeper on kohandatud salvestatud protseduuridega, mis on kirjutatud keeles PL/pgSQL. Testimist teiste keeltes ei ole tehtud, seega vÔib kasutamine olla vÀhem tÔhus vÔi vÔimatu.

Millises vormis hoida andmebaasi struktuuri dump VCS-is

Raamatukogu schema-keeper pakub funktsiooni saveDump, mis salvestab andmebaasi kÔigi objektide struktuuri eraldi tekstifailidena. VÀljundina luuakse kataloog, mis sisaldab andmebaasi struktuuri eraldatud failides, mis on hÔlpsasti lisatav VCS-i.

Vaatleme andmebaasi objektide teisendamist failideks mitme nÀite abil:

Objekti tĂŒĂŒp
Schema
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 konkreetse andmebaasi objekti struktuuri tekstiline esitus. NÀiteks salvestatud protseduuride korral on faili sisuks salvestatud protseduuri tÀielik mÀÀratlemine, mis algab plokist CREATE OR REPLACE FUNCTION.

Nagu on nĂ€ha ĂŒlaltoodud tabelist, hoiab faili tee endas teavet objekti tĂŒĂŒbi, skeemi ja nime kohta. Selline lĂ€henemine lihtsustab dumpis navigeerimist ja andmebaasi muudatuste ĂŒlevaatamist.

Laien .sql nÀidatud, et IDE-de automaatselt pakkuda tööriistu andmebaasiga suhtlemiseks, kui fail on avatud.

Kuidas jÀlgida andmebaasi struktuuri muudatusi pÀrast dumpi salvestamist

Salvestades hetke andmebaasi struktuuri dump VCS-i, saame kontrollida, kas andmebaasi struktuuri on pÀrast dumpi loomist muudetud. Raamatukogus schema-keeper muutuste tuvastamiseks andmebaasi struktuuris on ette nÀhtud funktsioon verifyDump, mis tagastab teabe erinevuste kohta ilma kÔrvaltoimeteta.

Alternatiivne kontrollimeetod on funktsiooni uuesti kutsumine saveDump, mÀÀrates sama kausta ja kontrollides VCS-is muutuste olemasolu. Kuna kÔik andmebaasi objektid on salvestatud eraldi failidesse, nÀitab VCS ainult muudetud objekte.
Selle meetodi peamine miinus on failide ĂŒlekirjutamise vajadus, et nĂ€ha muudatusi.

Kuidas edastada andmebaasi struktuuri muudatusi teistesse keskkondadesse ilma konfliktide ja hiiglaslike migratsioonifailideta

TĂ€nu funktsioonile deployDump saab salvestatud protseduuride algkoodi redigeerida tĂ€pselt samamoodi nagu tavalist rakenduse algkoodi. Saame lisada/maha vĂ”tta uusi ridu salvestatud protseduuride koodis ja saata muudatused kohe versioonihaldussĂŒsteemi, vĂ”i luua/kustutada salvestatud protseduure, luues/kustutades vastavaid faile dumpi kaustas.

NÀiteks, et luua uus salvestatud protseduur skeemis public on piisav luua uus fail, millel on laiend .sql kaustas public/functions, panna sinna salvestatud protseduuri algkood, sealhulgas plokk CREATE OR REPLACE FUNCTION, ja seejÀrel kutsuda funktsiooni deployDump. Samuti toimub salvestatud protseduuri muutmine ja kustutamine. Seega satub kood samal ajal nii VCS-i kui ka andmebaasi.

Kui salvestatud protseduuri algkoodis ilmneb viga vÔi erimeelsus faili ja salvestatud protseduuri nimede vahel, siis deployDump ei toimi, kuvades viga. Salvestatud protseduuride erisus dumpi ja praeguse andmebaasi vahel on vÔimatu kasutada deployDump.

Uue salvestatud protseduuri loomisel ei ole vaja kĂ€sitsi sisestada Ă”iget faili nime. Piisab, kui failil on laiend .sql. PĂ€rast kutsumist deployDump kuvab vea tekst Ă”ige nime, mida saab faili ĂŒmbernimetamiseks kasutada.

deployDump vĂ”imaldab funktsiooni parameetreid vĂ”i tagastatavat tĂŒĂŒpi muuta ilma tĂ€iendavate toiminguteta, samas kui klassikalise lĂ€henemise korral oleks pidanud
esmajÀrjekorras tÀitma KUSTUTA FUNKTSIOON, ja alles seejÀrel CREATE OR REPLACE FUNCTION.

Kahjuks on olukordi, kus deployDump ei suudeta muudatusi automaatselt rakendada. NĂ€iteks juhul, kui kustutatakse kĂ€ivitaja funktsioon, mida kasutab vĂ€hemalt ĂŒks kĂ€ivitaja. Sellised olukorrad lahendatakse kĂ€sitsi migratsioonifailide abil.

Kui muutuste ĂŒlekande eest salvestatud protseduurides vastutab ise schema-keeper, siis teiste struktuurimuudatuste ĂŒlekandmiseks tuleb kasutada migratsioonifaile. NĂ€iteks on hea migratsioonidega töötamiseks raamatukogu doctrine/migrations.

Migratsioonid tuleb rakendada enne kÀivitamist deployDump. See vÔimaldab teha kÔik struktuuri muudatused ja lahendada probleemsed olukorrad, et salvestatud protseduurides tehtud muudatused saaksid hiljem probleemideta edasi kanduda.

Migratsioonide töö kohta on rohkem teavet jÀrgmistes jaotistes.

Kuidas korraldada mitme arendaja paralleelset tööd projekti kallal

On vaja luua DB tÀieliku initsialiseerimise skript, mida arendaja kÀivitab oma töömasinas, viies kohaliku DB struktuuri vastavusse VCS-s salvestatud dumpiga. KÔige lihtsam on jagada kohaliku DB initsialiseerimine kolmeks sammuks:

  1. Baasskeemi faili importimine, mis kannab nime nÀiteks base.sql
  2. Migratsioonide rakendamine
  3. Kutsumine deployDump

base.sql — see on lĂ€htepunkt, mille peale rakendatakse migratsioonid ja tĂ€idetakse deployDump, see tĂ€hendab base.sql + migratsioonid + deployDump = ajakohane DB struktuur. Sellise faili saab genereerida utiliidiga pg_dump. Kasutatakse base.sql ainult DB algse initsialiseerimise ajal.

Nimetame DB tÀieliku initsialiseerimise skripti refresh.sh. Tööprotsess vÔib vÀlja nÀha jÀrgmine:

  1. Arendaja kÀivitab oma keskkonnas refresh.sh ja saab ajakohase DB struktuuri
  2. Arendaja hakkab töötama mÀÀratud ĂŒlesande kallal, muutes kohaliku DB uue funktsionaalsuse vajadustele vastavaks (ALTER TABLE ... lisa veerg jne)
  3. PĂ€rast ĂŒlesande tĂ€itmist kutsub arendaja vĂ€lja funktsiooni saveDump, et fikseerida VCS-is DB-s tehtud muudatused
  4. Arendaja kĂ€ivitab uuesti refresh.sh, seejĂ€rel verifyDump, mis nĂŒĂŒd nĂ€itab muudatuste nimekirja migreerimiseks
  5. Arendaja kannab kÔik struktuuri muudatused migratsioonifaili, kÀivitab uuesti refresh.sh ja verifyDump, ja kui migratsioon on korrektselt koostatud, verifyDump nÀitab, et kohaliku DB ja salvestatud dumpi vahel pole erinevusi.

Ülaltoodud protsess on kooskĂ”las gitflow pĂ”himĂ”tetega. Iga haru VCS-is sisaldab oma dump'i versiooni ning harude ĂŒhendamisel toimub dump'ide liitmine. Enamikul juhtudel ei ole pĂ€rast liitmist vaja mingit tĂ€iendavat tegevust, kuid kui erinevates harudes on tehtud muudatusi, nĂ€iteks samas tabelis, vĂ”ib konflikt tekkida.

Vaatleme konfliktset olukorda nĂ€ite abil: on haru develop, millest on harunenud kaks haru: feature1 ja feature2, mis ei ole konfliktis develop, kuid on konfliktis omavahel. EesmĂ€rk on mĂ”lema haru liitmine develop. Selle jaoks soovitatakse esmalt liita ĂŒks haru develop, seejĂ€rel liita develop jÀÀkharusse, lahendades sealjuures konfliktid jÀÀnud haru osas, pĂ€rast mida liita viimane haru develop. Konfliktide lahendamise etapis vĂ”ib osutuda vajalikuks parandada migratsioonifail viimasel harul, et see vastaks lĂ”ppdump'ile, mis sisaldab liitmise tulemusi.

Kuidas turvaliselt juurutada suurem hulk muudatusi andmebaasi struktuuris tootmiskeskkonnas

TÀnu VCS-is oleva aktuaalse andmebaasi struktuuri dump'ile on vÔimalik kontrollida production-andmebaasi tÀpset vastavust nÔutavale struktuurile. See tagab, et kÔik arendajate soovitud muudatused on edukalt toodetud andmebaasi viidud.

Kuna DDL PostgreSQL-is on tehinguline, on soovitatav jÀrgida jÀrgmist juurutamise jÀrjekorda, et juhuslike vigade korral oleks vÔimalik "valutult" teostada ROLLBACK:

  1. Alusta tehingut
  2. Tehingu raames teosta kÔik migratsioonid
  3. Samas tehingus teosta deployDump
  4. Ilma tehingut lÔpetamata teosta verifyDump. Kui vigu ei ole, teosta COMMIT. Kui vigu on, teosta ROLLBACK

Need sammud on piisavalt lihtsad, et neid saaks integreerida olemasolevatesse rakenduste juurutamise lÀhenemistesse, sealhulgas zero-downtime.

KokkuvÔte

Ülaltoodud meetodite abil on vĂ”imalik maksimeerida "PHP + PostgreSQL" projektide jĂ”udlust, ohverdades samal ajal suhteliselt vĂ€ikese mugavuse arendamisel vĂ”rreldes kogu Ă€ri loogika rakendamisega rakenduse pĂ”hiprogrammis. Veelgi enam, andmete töötlemine PL/pgSQL nĂ€eb sageli vĂ€lja lĂ€bipaistvam ja vajab vĂ€hem koodi kui sama funktsionaalsus, mis on kirjutatud PHP-s.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster