Lojik biznis nan baz done a lè l sèvi avèk SchemaKeeper

Objektif atik sa a se sèvi ak egzanp yon bibliyotèk gadyen chema montre zouti ki ka siyifikativman senplifye pwosesis pou devlope baz done nan pwojè PHP lè l sèvi avèk DBMS PostgreSQL.

Enfòmasyon ki soti nan atik sa a pral, anvan tout bagay, itil pou devlopè ki vle fè pi plis nan kapasite PostgreSQL, men yo fè fas ak pwoblèm kenbe lojik biznis yo mete nan baz done a.

Atik sa a pa pral dekri avantaj oswa dezavantaj nan estoke lojik biznis nan yon baz done. Li sipoze ke chwa a te deja fè pa lektè a.

Y ap konsidere kesyon sa yo:

  1. Nan ki fòm yo ta dwe estoke yon pil fatra estrikti baz done nan yon sistèm kontwòl vèsyon (apwe sa yo rele VCS)
  2. Ki jan yo swiv chanjman nan estrikti baz done a apre sove yon pil fatra
  3. Ki jan yo transfere chanjman nan estrikti baz done a nan lòt anviwònman san konfli ak dosye migrasyon jeyan
  4. Ki jan yo òganize pwosesis la nan travay paralèl sou yon pwojè pa plizyè devlopè
  5. Ki jan yo deplwaye san danje plis chanjman nan estrikti baz done a nan yon anviwònman pwodiksyon

    SchemaKeeper fèt pou travay ak pwosedi ki estoke ekri nan lang lan PL/pgSQL. Tès ak lòt lang pa te fèt, kidonk itilizasyon ka pa efikas oswa pa posib.

Ki jan yo estoke yon pil fatra estrikti baz done nan VCS

bibliyotèk gadyen chema bay yon fonksyon saveDump, ki sove estrikti tout objè ki soti nan baz done a kòm dosye tèks separe. Pwodiksyon an se yon anyè ki gen estrikti baz done a, divize an fichye gwoupe ki ka fasilman ajoute nan VCS.

Ann gade nan konvèti objè ki soti nan yon baz done nan dosye lè l sèvi avèk plizyè egzanp:

Kalite objè
Scheme
Non
Chemen relatif nan dosye

tab
piblik
kont
./public/tables/accounts.txt

Pwosedi ki estoke
piblik
otorizasyon (hash bigint)
./public/functions/auth(int8).sql

Entwodiksyon
anrjistreman
tarif
./booking/views/tariffs.txt

Sa ki nan dosye yo se yon reprezantasyon tèks nan estrikti a nan yon objè baz done espesifik. Pou egzanp, pou pwosedi ki estoke, sa ki nan dosye a pral definisyon konplè nan pwosedi ki estoke, kòmanse ak blòk la. CREATE OR REPLACE FUNCTION.

Kòm ou ka wè nan tablo ki anwo a, chemen an nan dosye a magazen enfòmasyon sou kalite, chema ak non objè a. Apwòch sa a fè li pi fasil pou navige nan revizyon pil fatra ak kòd chanjman nan baz done a.

ekstansyon .sql pou dosye ki gen kòd sous pwosedi ki estoke, sa a te chwazi pou IDE a otomatikman bay zouti pou kominike avèk baz done a lè yo louvri dosye a.

Ki jan yo swiv chanjman nan estrikti baz done a apre sove yon pil fatra

Lè nou sove yon pil fatra nan estrikti baz done aktyèl la nan VCS, nou jwenn opòtinite pou tcheke si yo te fè chanjman nan estrikti baz done a apre pil fatra a te kreye. Nan bibliyotèk gadyen chema pou detekte chanjman nan estrikti baz done a, yo bay yon fonksyon verifyDump, ki retounen enfòmasyon sou diferans ki genyen san efè segondè.

Yon lòt fason pou tcheke se rele fonksyon an ankò saveDump, espesifye menm anyè a, epi tcheke nan VCS pou chanjman. Depi tout objè ki soti nan baz done a sove nan dosye separe, VCS pral sèlman montre objè ki chanje yo.
Dezavantaj prensipal la nan metòd sa a se bezwen nan recouvrir dosye yo nan lòd yo wè chanjman yo.

Ki jan yo transfere chanjman nan estrikti baz done a nan lòt anviwònman san konfli ak dosye migrasyon jeyan

Mèsi a fonksyon an deployDump Kòd sous pwosedi ki estoke yo ka modifye egzakteman menm jan ak kòd sous aplikasyon regilye a. Ou ka ajoute / efase nouvo liy nan kòd pwosedi ki estoke epi imedyatman pouse chanjman nan kontwòl vèsyon an, oswa kreye / efase pwosedi ki estoke pa kreye / efase dosye korespondan yo nan anyè pil fatra a.

Pou egzanp, yo kreye yon nouvo pwosedi ki estoke nan yon chema public jis kreye yon nouvo dosye ak ekstansyon an .sql nan anyè a public/functions, mete kòd sous la nan pwosedi ki estoke nan li, ki gen ladan blòk la CREATE OR REPLACE FUNCTION, Lè sa a, rele fonksyon an deployDump. Modifye ak efase yon pwosedi ki estoke rive nan menm fason an. Kidonk, kòd la antre nan tou de VCS a ak baz done a an menm tan.

Si yon erè parèt nan kòd sous nenpòt pwosedi ki estoke, oswa yon diferans ant non yo nan dosye a ak pwosedi ki estoke a, lè sa a deployDump pral echwe, montre tèks erè. Diferans nan pwosedi ki estoke ant pil fatra a ak baz done aktyèl la enposib lè w ap itilize deployDump.

Lè w ap kreye yon nouvo pwosedi ki estoke, pa gen okenn nesesite pou antre manyèlman non dosye ki kòrèk la. Li se ase pou dosye a gen ekstansyon an .sql. Apre apèl la deployDump tèks erè a pral genyen non ki kòrèk la, ki ka itilize pou chanje non dosye a.

deployDump pèmèt ou chanje paramèt yon fonksyon oswa kalite retounen san aksyon adisyonèl, pandan y ap ak apwòch klasik la ou ta dwe
egzekite an premye DROP FUNCTION, epi sèlman lè sa a CREATE OR REPLACE FUNCTION.

Malerezman, gen kèk sitiyasyon kote deployDump pa kapab aplike chanjman otomatikman. Pou egzanp, si yo retire yon fonksyon deklanche ki itilize pa omwen yon deklanche. Sitiyasyon sa yo rezoud manyèlman lè l sèvi avèk dosye migrasyon yo.

Si ou responsab pou migrasyon chanjman nan pwosedi ki estoke gadyen chema, Lè sa a, dosye migrasyon yo dwe itilize yo transfere lòt chanjman nan estrikti a. Pou egzanp, yon bibliyotèk bon pou travay ak migrasyon se doktrin/migrasyon.

Migrasyon yo dwe aplike anvan lansman deployDump. Sa a pèmèt ou fè tout chanjman nan estrikti a ak rezoud sitiyasyon pwoblèm pou ke chanjman nan pwosedi ki estoke yo imedyatman transfere san pwoblèm.

Travay ak migrasyon yo pral dekri an plis detay nan seksyon sa yo.

Ki jan yo òganize pwosesis la nan travay paralèl sou yon pwojè pa plizyè devlopè

Li nesesè yo kreye yon script pou inisyalizasyon konplè nan baz done a, ki pral lanse pa pwomotè a sou machin travay li, pote estrikti nan baz done lokal la an akò ak pil fatra a sove nan VCS. Fason ki pi fasil la se divize inisyalizasyon baz done lokal la an 3 etap:

  1. Enpòte yon fichye ak yon estrikti de baz ki pral rele pa egzanp. base.sql
  2. Aplike Migrasyon
  3. Defi deployDump

base.sql se pwen depa sou tèt migrasyon yo aplike ak egzekite deployDumpSa se, base.sql + миграции + deployDump = актуальная структура БД. Ou ka kreye yon dosye konsa lè l sèvi avèk sèvis piblik la pg_dump. Itilize base.sql sèlman lè inisyalize baz done a nan grafouyen.

Ann rele script la pou inisyalizasyon baz done konplè refresh.sh. Workflow la ta ka sanble tankou sa a:

  1. Pwomotè a lanse nan anviwònman li refresh.sh epi li jwenn estrikti baz done aktyèl la
  2. Pwomotè a kòmanse travay sou travay la nan men an, modifye baz done lokal la pou satisfè bezwen nouvo fonksyonalite a (ALTER TABLE ... ADD COLUMN elatriye)
  3. Apre w fin ranpli travay la, pwomotè a rele fonksyon an saveDumppou komèt chanjman ki fèt nan baz done a nan VCS
  4. Devlopè relanse refresh.shlè sa a verifyDumpki kounye a montre yon lis chanjman yo enkli nan migrasyon an
  5. Pwomotè a transfere tout chanjman estrikti nan dosye migrasyon an, kouri ankò refresh.sh и verifyDump, epi, si migrasyon an konpile kòrèkteman, verifyDump pa pral montre okenn diferans ant baz done lokal la ak pil fatra ki sove a

Pwosesis ki dekri pi wo a konpatib ak prensip gitflow. Chak branch nan VCS a pral genyen pwòp vèsyon li yo nan pil fatra a, epi lè fizyone branch yo, pil fatra yo pral fizyone. Nan pifò ka yo, pa bezwen pran okenn lòt aksyon apre yon fizyon, men si yo te fè chanjman nan diferan branch, pou egzanp, nan menm tab la, yon konfli ka leve.

Ann konsidere yon sitiyasyon konfli lè l sèvi avèk yon egzanp: gen yon branch devlope, ki soti nan ki de branch branch: karakteristik1 и karakteristik2, ki pa gen okenn konfli ak devlope, men gen konfli youn ak lòt. Travay la se rantre tou de branch yo nan devlope. Pou ka sa a, li rekòmande premye rantre youn nan branch yo nan devlopeak Lè sa a, rantre devlope nan branch ki rete a, rezoud konfli nan branch ki rete a, ak Lè sa a, fusion dènye branch nan devlope. Pandan faz rezolisyon konfli a, ou ka oblije ranje dosye migrasyon an nan dènye branch lan pou li matche ak pil fatra final la, ki gen ladan rezilta fizyon yo.

Ki jan yo deplwaye san danje plis chanjman nan estrikti baz done a nan yon anviwònman pwodiksyon

Mèsi a prezans yon pil fatra nan estrikti baz done aktyèl la nan VCS, li vin posib yo tcheke baz done pwodiksyon an pou konfòmite egzak ak estrikti ki nesesè yo. Sa a asire ke tout chanjman yo ke devlopè yo te gen entansyon yo te transfere avèk siksè nan baz pwodiksyon an.

Kòm DDL nan PostgreSQL se tranzaksyon, li rekòmande pou respekte lòd deplwaman sa a, pou ke, nan ka ta gen yon erè inatandi, ou ka "san doulè" egzekite ROLLBACK:

  1. Kòmanse tranzaksyon
  2. Fè tout migrasyon nan yon tranzaksyon
  3. Nan menm tranzaksyon an, egzekite deployDump
  4. San yo pa ranpli tranzaksyon an, egzekite verifyDump. Si pa gen okenn erè, kouri COMMIT. Si gen erè, kouri ROLLBACK

Etap sa yo ka fasilman entegre nan apwòch ki deja egziste nan deplwaman aplikasyon, ki gen ladan zewo-detan.

Konklizyon

Mèsi a metòd ki dekri pi wo a, li posib pou peze maksimòm pèfòmans nan pwojè "PHP + PostgreSQL", pandan y ap sakrifye relativman ti konvenyans devlopman konpare ak aplike tout lojik biznis nan kòd aplikasyon prensipal la. Anplis, tretman done nan PL/pgSQL souvan sanble pi transparan epi li mande mwens kòd pase menm fonksyonalite ki ekri nan PHP.

Sous: www.habr.com

Add nouvo kòmantè