Mantiki ya biashara katika hifadhidata kwa kutumia SchemaKeeper

Madhumuni ya kifungu hiki ni kutumia mfano wa maktaba mlinzi wa schema onyesha zana zinazoweza kurahisisha kwa kiasi kikubwa mchakato wa kuunda hifadhidata ndani ya miradi ya PHP kwa kutumia PostgreSQL DBMS.

Taarifa kutoka kwa makala hii, kwanza kabisa, itakuwa muhimu kwa wasanidi programu ambao wanataka kutumia vyema uwezo wa PostgreSQL, lakini wanakabiliwa na matatizo ya kudumisha mantiki ya biashara iliyowekwa kwenye hifadhidata.

Nakala hii haitaelezea faida au hasara za kuhifadhi mantiki ya biashara kwenye hifadhidata. Inachukuliwa kuwa uchaguzi tayari umefanywa na msomaji.

Maswali yafuatayo yatazingatiwa:

  1. Je, utupaji wa muundo wa hifadhidata unapaswa kuhifadhiwa katika mfumo wa udhibiti wa toleo (hapa unajulikana kama VCS)
  2. Jinsi ya kufuatilia mabadiliko katika muundo wa hifadhidata baada ya kuhifadhi dampo
  3. Jinsi ya kuhamisha mabadiliko katika muundo wa hifadhidata kwa mazingira mengine bila migogoro na faili kubwa za uhamiaji
  4. Jinsi ya kuandaa mchakato wa kazi sambamba kwenye mradi na watengenezaji kadhaa
  5. Jinsi ya kupeleka kwa usalama mabadiliko zaidi katika muundo wa hifadhidata kwa mazingira ya uzalishaji

    SchemaKeeper iliyoundwa kwa ajili ya kufanya kazi na taratibu zilizohifadhiwa zilizoandikwa katika lugha PL/pgSQL. Jaribio la lugha zingine halijafanyika, kwa hivyo matumizi yanaweza yasiwe na ufanisi au yasiwezekane.

Jinsi ya kuhifadhi dampo la muundo wa hifadhidata katika VCS

maktaba mlinzi wa schema hutoa utendaji saveDump, ambayo huhifadhi muundo wa vitu vyote kutoka kwa hifadhidata kama faili tofauti za maandishi. Matokeo ni saraka iliyo na muundo wa hifadhidata, iliyogawanywa katika faili zilizowekwa kwenye vikundi ambazo zinaweza kuongezwa kwa VCS kwa urahisi.

Wacha tuangalie kubadilisha vitu kutoka kwa hifadhidata kuwa faili kwa kutumia mifano kadhaa:

Aina ya kitu
Mpango
Jina
Njia ya jamaa ya faili

meza
umma
akaunti
./public/tables/accounts.txt

Utaratibu uliohifadhiwa
umma
auth (hashi kubwa)
./public/functions/auth(int8).sql

Utangulizi
booking
ushuru
./booking/views/tariffs.txt

Yaliyomo kwenye faili ni uwakilishi wa maandishi wa muundo wa kitu maalum cha hifadhidata. Kwa mfano, kwa taratibu zilizohifadhiwa, yaliyomo kwenye faili itakuwa ufafanuzi kamili wa utaratibu uliohifadhiwa, kuanzia na kuzuia. CREATE OR REPLACE FUNCTION.

Kama inavyoonekana kwenye jedwali hapo juu, njia ya faili huhifadhi habari kuhusu aina, schema na jina la kitu. Mbinu hii hurahisisha kuvinjari kupitia utupaji na ukaguzi wa msimbo wa mabadiliko katika hifadhidata.

ugani .sql kwa faili zilizo na msimbo wa chanzo wa utaratibu uliohifadhiwa, hii ilichaguliwa ili IDE itoe kiotomatiki zana za kuingiliana na hifadhidata faili inapofunguliwa.

Jinsi ya kufuatilia mabadiliko katika muundo wa hifadhidata baada ya kuhifadhi dampo

Kwa kuhifadhi utupaji wa muundo wa hifadhidata wa sasa katika VCS, tunapata fursa ya kuangalia ikiwa mabadiliko yalifanywa kwenye muundo wa hifadhidata baada ya utupaji kuundwa. Katika maktaba mlinzi wa schema ili kugundua mabadiliko katika muundo wa hifadhidata, kazi hutolewa verifyDump, ambayo inarudi habari kuhusu tofauti bila madhara.

Njia mbadala ya kuangalia ni kupiga simu tena saveDump, ikibainisha saraka sawa, na angalia katika VCS kwa mabadiliko. Kwa kuwa vitu vyote kutoka kwa hifadhidata vimehifadhiwa katika faili tofauti, VCS itaonyesha tu vitu vilivyobadilishwa.
Hasara kuu ya njia hii ni haja ya kufuta faili ili kuona mabadiliko.

Jinsi ya kuhamisha mabadiliko katika muundo wa hifadhidata kwa mazingira mengine bila migogoro na faili kubwa za uhamiaji

Shukrani kwa utendaji deployDump Msimbo wa chanzo wa taratibu zilizohifadhiwa unaweza kuhaririwa kwa njia sawa kabisa na msimbo wa kawaida wa chanzo cha programu. Unaweza kuongeza/kufuta laini mpya katika msimbo wa utaratibu uliohifadhiwa na kusukuma mara moja mabadiliko kwenye udhibiti wa toleo, au kuunda/kufuta taratibu zilizohifadhiwa kwa kuunda/kufuta faili zinazolingana katika saraka ya kutupa.

Kwa mfano, kuunda utaratibu mpya uliohifadhiwa kwenye schema public tengeneza tu faili mpya na kiendelezi .sql katika saraka public/functions, weka msimbo wa chanzo wa utaratibu uliohifadhiwa ndani yake, ikiwa ni pamoja na kuzuia CREATE OR REPLACE FUNCTION, kisha piga kazi deployDump. Kurekebisha na kufuta utaratibu uliohifadhiwa hutokea kwa njia sawa. Kwa hivyo, nambari huingia kwenye VCS na hifadhidata kwa wakati mmoja.

Ikiwa kosa linaonekana katika msimbo wa chanzo wa utaratibu wowote uliohifadhiwa, au tofauti kati ya majina ya faili na utaratibu uliohifadhiwa, basi deployDump itashindwa, kuonyesha maandishi ya makosa. Kutolingana kwa taratibu zilizohifadhiwa kati ya dampo na hifadhidata ya sasa haiwezekani wakati wa kutumia deployDump.

Wakati wa kuunda utaratibu mpya uliohifadhiwa, hakuna haja ya kuingiza jina la faili sahihi. Inatosha kwa faili kuwa na ugani .sql. Baada ya simu deployDump maandishi ya makosa yatakuwa na jina sahihi, ambalo linaweza kutumika kubadili jina la faili.

deployDump hukuruhusu kubadilisha vigezo vya kazi au aina ya kurudi bila vitendo vya ziada, wakati kwa mbinu ya kitambo utalazimika
kutekeleza kwanza DROP FUNCTION, na kisha tu CREATE OR REPLACE FUNCTION.

Kwa bahati mbaya, kuna baadhi ya hali ambapo deployDump haiwezi kutekeleza mabadiliko kiotomatiki. Kwa mfano, ikiwa kitendakazi cha kichochezi kinachotumiwa na angalau kichochezi kimoja kitaondolewa. Hali kama hizo hutatuliwa kwa mikono kwa kutumia faili za uhamiaji.

Ikiwa una jukumu la kuhamisha mabadiliko kwa taratibu zilizohifadhiwa mlinzi wa schema, basi faili za uhamiaji lazima zitumike kuhamisha mabadiliko mengine katika muundo. Kwa mfano, maktaba nzuri ya kufanya kazi na uhamiaji ni mafundisho/uhamaji.

Uhamishaji lazima utumike kabla ya uzinduzi deployDump. Hii hukuruhusu kufanya mabadiliko yote kwenye muundo na kutatua hali zenye shida ili mabadiliko katika taratibu zilizohifadhiwa zihamishwe bila shida.

Kufanya kazi na uhamiaji kutaelezewa kwa undani zaidi katika sehemu zifuatazo.

Jinsi ya kuandaa mchakato wa kazi sambamba kwenye mradi na watengenezaji kadhaa

Inahitajika kuunda hati ya uanzishaji kamili wa hifadhidata, ambayo itazinduliwa na msanidi programu kwenye mashine yake ya kazi, na kuleta muundo wa hifadhidata ya ndani kulingana na utupaji uliohifadhiwa kwenye VCS. Njia rahisi ni kugawanya uanzishaji wa hifadhidata ya ndani katika hatua 3:

  1. Ingiza faili yenye muundo wa msingi ambao utaitwa k.m. base.sql
  2. Kutuma Uhamiaji
  3. Changamoto deployDump

base.sql ni mahali pa kuanzia juu ambayo uhamiaji hutumiwa na kutekelezwa deployDumpHiyo ni, base.sql + ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ + deployDump = Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ структура Π‘Π”. Unaweza kuunda faili kama hiyo kwa kutumia matumizi pg_dump. Imetumika base.sql pekee wakati wa kuanzisha hifadhidata kutoka mwanzo.

Wacha tuite hati kwa uanzishaji kamili wa hifadhidata refresh.sh. Mtiririko wa kazi unaweza kuonekana kama hii:

  1. Msanidi programu huzindua katika mazingira yake refresh.sh na hupata muundo wa hifadhidata wa sasa
  2. Msanidi programu huanza kufanya kazi kwenye kazi iliyopo, kurekebisha hifadhidata ya ndani ili kukidhi mahitaji ya utendakazi mpya (ALTER TABLE ... ADD COLUMN na kadhalika)
  3. Baada ya kukamilisha kazi, msanidi huita kazi saveDumpkufanya mabadiliko yaliyofanywa kwenye hifadhidata katika VCS
  4. Uzinduzi upya wa msanidi refresh.shbasi verifyDumpambayo sasa inaonyesha orodha ya mabadiliko ya kujumuisha katika uhamiaji
  5. Msanidi huhamisha mabadiliko yote ya muundo kwa faili ya uhamiaji, huiendesha tena refresh.sh ΠΈ verifyDump, na, ikiwa uhamiaji umekusanywa kwa usahihi, verifyDump haitaonyesha tofauti kati ya hifadhidata ya ndani na dampo lililohifadhiwa

Mchakato ulioelezewa hapo juu unaendana na kanuni za gitflow. Kila tawi katika VCS litakuwa na toleo lake la kutupa, na wakati wa kuunganisha matawi, utupaji utaunganishwa. Katika hali nyingi, hakuna hatua za ziada zinazohitajika kuchukuliwa baada ya kuunganisha, lakini ikiwa mabadiliko yalifanywa katika matawi tofauti, kwa mfano, kwenye meza moja, mgogoro unaweza kutokea.

Wacha tuangalie hali ya migogoro kwa kutumia mfano: kuna tawi kuendeleza, ambapo matawi mawili yana matawi: kipengele1 ΠΈ kipengele2, ambazo hazina migogoro nazo kuendeleza, lakini kuwa na migogoro na kila mmoja. Kazi ni kuunganisha matawi yote mawili kuendeleza. Kwa kesi hii, inashauriwa kwanza kuunganisha moja ya matawi ndani kuendelezana kisha kuunganisha kuendeleza kwa tawi iliyobaki, kutatua migogoro katika tawi iliyobaki, na kisha kuunganisha tawi la mwisho ndani kuendeleza. Wakati wa awamu ya utatuzi wa migogoro, huenda ukalazimika kurekebisha faili ya uhamishaji katika tawi la mwisho ili ilingane na utupaji wa mwisho, unaojumuisha matokeo ya miunganisho.

Jinsi ya kupeleka kwa usalama mabadiliko zaidi katika muundo wa hifadhidata kwa mazingira ya uzalishaji

Shukrani kwa uwepo wa utupaji wa muundo wa sasa wa hifadhidata katika VCS, inawezekana kuangalia hifadhidata ya uzalishaji kwa kufuata kabisa muundo unaohitajika. Hii inahakikisha kuwa mabadiliko yote ambayo wasanidi walikusudia yalihamishiwa kwa msingi wa uzalishaji.

Kama DDL katika PostgreSQL ni shughuli, inashauriwa kuambatana na agizo lifuatalo la kupeleka, ili, ikiwa kuna kosa lisilotarajiwa, unaweza kutekeleza "bila uchungu" ROLLBACK:

  1. Anza shughuli
  2. Tekeleza uhamishaji wote katika muamala
  3. Katika shughuli hiyo hiyo, tekeleza deployDump
  4. Bila kukamilisha shughuli, tekeleza verifyDump. Ikiwa hakuna makosa, endesha COMMIT. Ikiwa kuna makosa, endesha ROLLBACK

Hatua hizi zinaweza kuunganishwa kwa urahisi katika mbinu zilizopo za kupeleka programu, ikiwa ni pamoja na muda usiopungua.

Hitimisho

Shukrani kwa mbinu zilizoelezwa hapo juu, inawezekana kubana utendakazi wa juu zaidi kutoka kwa miradi ya "PHP + PostgreSQL", huku ukitoa manufaa kidogo ya maendeleo ikilinganishwa na kutekeleza mantiki yote ya biashara katika msimbo mkuu wa maombi. Aidha, usindikaji wa data katika PL/pgSQL mara nyingi inaonekana kwa uwazi zaidi na inahitaji msimbo mdogo kuliko utendakazi sawa ulioandikwa katika PHP.

Chanzo: mapenzi.com

Kuongeza maoni