Loġika tan-negozju fid-database bl-użu ta' SchemaKeeper

L-iskop ta 'dan l-artikolu huwa li tuża l-eżempju ta' librerija skema-keeper juru għodod li jistgħu jissimplifikaw b'mod sinifikanti l-proċess tal-iżvilupp tad-databases fi ħdan proġetti PHP bl-użu tad-DBMS PostgreSQL.

L-informazzjoni minn dan l-artikolu, l-ewwelnett, tkun utli għall-iżviluppaturi li jixtiequ jagħmlu l-aħjar mill-kapaċitajiet PostgreSQL, iżda jiffaċċjaw problemi biex iżommu l-loġika tan-negozju mqiegħda fid-database.

Dan l-artikolu mhux se jiddeskrivi l-vantaġġi jew l-iżvantaġġi tal-ħażna tal-loġika tan-negozju f'database. Huwa preżunt li l-għażla diġà saret mill-qarrej.

Se jiġu kkunsidrati l-mistoqsijiet li ġejjin:

  1. F'liema forma għandha tinħażen dump ta' struttura ta' database f'sistema ta' kontroll tal-verżjoni (minn hawn 'il quddiem imsejħa VCS)
  2. Kif issegwi l-bidliet fl-istruttura tad-database wara li tissejvja dump
  3. Kif tittrasferixxi bidliet fl-istruttura tad-database għal ambjenti oħra mingħajr kunflitti u fajls ta 'migrazzjoni ġganti
  4. Kif torganizza l-proċess ta 'xogħol parallel fuq proġett minn diversi żviluppaturi
  5. Kif tuża b'mod sikur aktar bidliet fl-istruttura tad-database f'ambjent ta 'produzzjoni

    SchemaKeeper iddisinjat biex jaħdem bi proċeduri maħżuna miktuba fil-lingwa PL/pgSQL. L-ittestjar b'lingwi oħra ma sarx, għalhekk l-użu jista 'ma jkunx daqshekk effettiv jew jista' ma jkunx possibbli.

Kif taħżen dump tal-istruttura tad-database f'VCS

Librerija skema-keeper jipprovdi funzjoni saveDump, li jiffranka l-istruttura tal-oġġetti kollha mid-database bħala fajls tat-test separati. L-output huwa direttorju li fih l-istruttura tad-database, maqsum f'fajls raggruppati li jistgħu jiġu miżjuda faċilment ma 'VCS.

Ejja nħarsu lejn il-konverżjoni ta' oġġetti mid-database f'fajls billi tuża diversi eżempji:

Tip ta' oġġett
L-iskema
Isem
Mogħdija relattiva għall-fajl

tabella
pubblika
Kontijiet
./public/tables/accounts.txt

Proċedura maħżuna
pubblika
awth(hash bigint)
./public/functions/auth(int8).sql

Introduzzjoni
prenotazzjoni
tariffi
./booking/views/tariffs.txt

Il-kontenut tal-fajls huma rappreżentazzjoni testwali tal-istruttura ta' oġġett ta' database speċifiku. Pereżempju, għal proċeduri maħżuna, il-kontenut tal-fajl se jkun id-definizzjoni sħiħa tal-proċedura maħżuna, li tibda bil-blokk CREATE OR REPLACE FUNCTION.

Kif jidher mit-tabella ta 'hawn fuq, il-mogħdija għall-fajl taħżen informazzjoni dwar it-tip, l-iskema u l-isem tal-oġġett. Dan l-approċċ jagħmilha aktar faċli biex wieħed jinnaviga permezz tar-reviżjoni tad-dump u tal-kodiċi tal-bidliet fid-database.

estensjoni .sql għal fajls b'kodiċi tas-sors tal-proċedura maħżuna, dan intgħażel sabiex l-IDE awtomatikament jipprovdi għodod għall-interazzjoni mad-database meta jinfetaħ il-fajl.

Kif issegwi l-bidliet fl-istruttura tad-database wara li tissejvja dump

Billi nsalvaw dump tal-istruttura tad-database attwali f'VCS, ikollna l-opportunità li niċċekkjaw jekk sarux bidliet fl-istruttura tad-database wara li nħolqot id-dump. Fil-librerija skema-keeper biex tiskopri bidliet fl-istruttura tad-database, tiġi pprovduta funzjoni verifyDump, li jirritorna informazzjoni dwar id-differenzi mingħajr effetti sekondarji.

Mod alternattiv biex tiċċekkja huwa li ssejjaħ il-funzjoni mill-ġdid saveDump, billi tispeċifika l-istess direttorju, u ċċekkja fil-VCS għal bidliet. Peress li l-oġġetti kollha mid-database huma ssejvjati f'fajls separati, VCS se juri biss oġġetti mibdula.
L-iżvantaġġ ewlieni ta 'dan il-metodu huwa l-ħtieġa li tikteb fuq il-fajls sabiex tara l-bidliet.

Kif tittrasferixxi bidliet fl-istruttura tad-database għal ambjenti oħra mingħajr kunflitti u fajls ta 'migrazzjoni ġganti

Grazzi għall-funzjoni deployDump Il-kodiċi tas-sors tal-proċeduri maħżuna jista 'jiġi editjat eżattament bl-istess mod bħall-kodiċi tas-sors tal-applikazzjoni regolari. Tista 'żżid/tħassar linji ġodda fil-kodiċi tal-proċedura maħżuna u immedjatament timbotta bidliet għall-kontroll tal-verżjoni, jew toħloq/tħassar proċeduri maħżuna billi toħloq/tħassar il-fajls korrispondenti fid-direttorju tad-dump.

Per eżempju, biex tinħoloq proċedura maħżuna ġdida fi schema public sempliċement toħloq fajl ġdid bl-estensjoni .sql fid-direttorju public/functions, poġġi fiha l-kodiċi tas-sors tal-proċedura maħżuna, inkluż il-blokk CREATE OR REPLACE FUNCTION, imbagħad sejjaħ il-funzjoni deployDump. Il-modifika u t-tħassir ta' proċedura maħżuna jseħħu bl-istess mod. Għalhekk, il-kodiċi jidħol kemm fil-VCS kif ukoll fid-database fl-istess ħin.

Jekk jidher żball fil-kodiċi tas-sors ta' kwalunkwe proċedura maħżuna, jew diskrepanza bejn l-ismijiet tal-fajl u l-proċedura maħżuna, allura deployDump se tfalli, juri test ta 'żball. It-taqbil ħażin tal-proċeduri maħżuna bejn id-dump u d-database kurrenti huwa impossibbli meta jintuża deployDump.

Meta toħloq proċedura maħżuna ġdida, m'hemmx bżonn li ddaħħal manwalment l-isem tal-fajl korrett. Huwa biżżejjed li l-fajl ikollu l-estensjoni .sql. Wara s-sejħa deployDump it-test tal-iżball se jkun fih l-isem korrett, li jista 'jintuża biex tibdel l-isem tal-fajl.

deployDump jippermettilek tibdel il-parametri ta' funzjoni jew tip ta' ritorn mingħajr azzjonijiet addizzjonali, filwaqt li bl-approċċ klassiku jkollok
tesegwixxi l-ewwel DROP FUNCTION, u mbagħad biss CREATE OR REPLACE FUNCTION.

Sfortunatament, hemm xi sitwazzjonijiet fejn deployDump ma tistax tapplika awtomatikament il-bidliet. Pereżempju, jekk titneħħa funzjoni ta' grillu li tintuża minn mill-inqas grillu wieħed. Sitwazzjonijiet bħal dawn jiġu solvuti manwalment bl-użu ta 'fajls ta' migrazzjoni.

Jekk inti responsabbli għall-migrazzjoni tal-bidliet għall-proċeduri maħżuna skema-keeper, imbagħad fajls ta 'migrazzjoni għandhom jintużaw biex jittrasferixxu bidliet oħra fl-istruttura. Per eżempju, librerija tajba biex taħdem mal-migrazzjoni hija duttrina/migrazzjonijiet.

Il-migrazzjonijiet iridu jiġu applikati qabel it-tnedija deployDump. Dan jippermettilek li tagħmel il-bidliet kollha fl-istruttura u ssolvi sitwazzjonijiet problematiċi sabiex il-bidliet fil-proċeduri maħżuna jiġu sussegwentement trasferiti mingħajr problemi.

Il-ħidma mal-migrazzjoni se tkun deskritta f'aktar dettall fit-taqsimiet li ġejjin.

Kif torganizza l-proċess ta 'xogħol parallel fuq proġett minn diversi żviluppaturi

Huwa meħtieġ li tinħoloq skript għall-inizjalizzazzjoni sħiħa tad-database, li se titnieda mill-iżviluppatur fuq il-magna tax-xogħol tiegħu, li ġġib l-istruttura tad-database lokali skont id-dump salvat f'VCS. L-eħfef mod huwa li taqsam l-inizjalizzazzjoni tad-database lokali fi 3 passi:

  1. Importa fajl bi struttura bażika li se tissejjaħ eż. base.sql
  2. Applikazzjoni ta' Migrazzjonijiet
  3. Sejħa deployDump

base.sql huwa l-punt tat-tluq li fuqu jiġu applikati u eżegwiti l-migrazzjoni deployDumpDan huwa, base.sql + миграции + deployDump = актуальная структура БД. Tista 'toħloq fajl bħal dan billi tuża l-utilità pg_dump. Użati base.sql esklussivament meta inizjalizza d-database mill-bidu.

Ejja nsejħu l-iskrittura għall-inizjalizzazzjoni tad-database kompluta refresh.sh. Il-fluss tax-xogħol jista' jidher bħal dan:

  1. L-iżviluppatur tniedi fl-ambjent tiegħu refresh.sh u jikseb l-istruttura tad-database attwali
  2. L-iżviluppatur jibda jaħdem fuq il-kompitu li għandu jkun, jimmodifika d-database lokali biex jissodisfa l-ħtiġijiet tal-funzjonalità l-ġdida (ALTER TABLE ... ADD COLUMN eċċ)
  3. Wara li tlesti l-kompitu, l-iżviluppatur isejjaħ il-funzjoni saveDumpbiex tikkommetti bidliet li saru fid-database fil-VCS
  4. Tnedija mill-ġdid tal-iżviluppatur refresh.sh, allura verifyDumpli issa turi lista ta’ bidliet li għandhom jiġu inklużi fil-migrazzjoni
  5. L-iżviluppatur jittrasferixxi l-bidla tal-istruttura kollha għall-fajl tal-migrazzjoni, jerġa 'jmexxiha refresh.sh и verifyDump, u, jekk il-migrazzjoni hija kkumpilata b'mod korrett, verifyDump se juri l-ebda differenzi bejn id-database lokali u d-dump salvat

Il-proċess deskritt hawn fuq huwa kompatibbli mal-prinċipji tal-gitflow. Kull fergħa fil-VCS se jkun fiha l-verżjoni tagħha stess tad-dump, u meta tgħaqqad il-fergħat, id-dumps se jingħaqdu. Fil-biċċa l-kbira tal-każijiet, m'għandha tittieħed l-ebda azzjoni addizzjonali wara amalgamazzjoni, iżda jekk saru bidliet f'fergħat differenti, pereżempju, fl-istess tabella, jista' jinqala' kunflitt.

Ejja nikkunsidraw sitwazzjoni ta 'kunflitt billi tuża eżempju: hemm fergħa jiżviluppaw, li minnu fergħat żewġ fergħat: karatteristika1 и karatteristika2, li m'għandhom l-ebda kunflitt ma ' jiżviluppaw, iżda għandhom kunflitti ma 'xulxin. Il-kompitu huwa li jingħaqdu ż-żewġ fergħat fihom jiżviluppaw. Għal dan il-każ, huwa rakkomandat li l-ewwel tingħaqad waħda mill-fergħat ġo jiżviluppawu mbagħad jingħaqdu jiżviluppaw għall-fergħa li fadal, issolvi l-kunflitti fil-fergħa li fadal, u mbagħad tgħaqqad l-aħħar fergħa fis jiżviluppaw. Matul il-fażi tar-riżoluzzjoni tal-kunflitt, jista 'jkollok tiffissa l-fajl tal-migrazzjoni fl-aħħar fergħa sabiex jaqbel mad-dump finali, li jinkludi r-riżultati tal-għaqdiet.

Kif tuża b'mod sikur aktar bidliet fl-istruttura tad-database f'ambjent ta 'produzzjoni

Grazzi għall-preżenza ta 'dump tal-istruttura tad-database attwali f'VCS, isir possibbli li tiċċekkja d-database tal-produzzjoni għal konformità eżatta mal-istruttura meħtieġa. Dan jiżgura li l-bidliet kollha li l-iżviluppaturi kienu maħsuba ġew trasferiti b'suċċess għall-bażi tal-produzzjoni.

Kif DDL fil PostgreSQL huwa transazzjonali, huwa rakkomandat li taderixxi mal-ordni ta 'skjerament li ġejja, sabiex, f'każ ta' żball mhux mistenni, tista 'tesegwixxi "bla tbatija" ROLLBACK:

  1. Ibda t-tranżazzjoni
  2. Wettaq il-migrazzjoni kollha fi tranżazzjoni
  3. Fl-istess transazzjoni, eżegwixxi deployDump
  4. Mingħajr ma tlesti t-tranżazzjoni, eżegwixxi verifyDump. Jekk ma jkun hemm l-ebda żbalji, run COMMIT. Jekk ikun hemm żbalji, run ROLLBACK

Dawn il-passi jistgħu jiġu integrati faċilment f'approċċi eżistenti għall-iskjerament tal-applikazzjoni, inkluż żero-waqfien.

Konklużjoni

Grazzi għall-metodi deskritti hawn fuq, huwa possibbli li tingħafas il-prestazzjoni massima mill-proġetti "PHP + PostgreSQL", filwaqt li tiġi sagrifikata relattivament ftit konvenjenza tal-iżvilupp meta mqabbla mal-implimentazzjoni tal-loġika tan-negozju kollha fil-kodiċi tal-applikazzjoni prinċipali. Barra minn hekk, l-ipproċessar tad-dejta fi PL/pgSQL ħafna drabi tidher aktar trasparenti u teħtieġ inqas kodiċi mill-istess funzjonalità miktuba fil-PHP.

Sors: www.habr.com

Żid kumment