{"id":31385,"date":"2019-10-31T21:40:58","date_gmt":"2019-10-31T18:40:58","guid":{"rendered":"https:\/\/prohoster.info\/blog\/biznes-logika-v-baze-dannyh-pri-pomoshhi-schemakeeper\/"},"modified":"2019-10-31T21:40:58","modified_gmt":"2019-10-31T18:40:58","slug":"biznes-logika-v-baze-dannyh-pri-pomoshhi-schemakeeper","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/biznes-logika-v-baze-dannyh-pri-pomoshhi-schemakeeper","title":{"rendered":"\u00c4riloogika andmebaasis SchemaKeeperi abil","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Selle artikli eesm\u00e4rk on n\u00e4idata raamatukogu <noindex><a rel=\"nofollow\" href=\"https:\/\/packagist.org\/packages\/schema-keeper\/schema-keeper\">schema-keeper<\/a><\/noindex> t\u00f6\u00f6riistu, mis v\u00f5imaldavad oluliselt lihtsustada andmebaaside arendamise protsessi PHP-projektides, mis kasutavad PostgreSQL andmebaasihalduss\u00fcsteemi.<\/p>\n<p><\/p>\n<p>K\u00e4esolevast artiklist on kasu eelk\u00f5ige arendajatele, kes soovivad maksimaalselt \u00e4ra kasutada PostgreSQLi v\u00f5imalusi, kuid seisavad silmitsi \u00e4riloogika haldamise probleemidega, mis on viidud andmebaasi. <\/p>\n<p><\/p>\n<p>Artikkel ei k\u00e4sitle \u00e4riloogika hoidmise eeliseid v\u00f5i puudusi andmebaasis. Eeldatakse, et lugeja on valiku juba teinud.<\/p>\n<p><\/p>\n<p>K\u00e4sitletakse j\u00e4rgmisi k\u00fcsimusi:<\/p>\n<p><\/p>\n<ol>\n<li>Kuidas s\u00e4ilitada andmebaasi struktuuri varukoopia versioonihalduss\u00fcsteemis (edaspidi VCS)<\/li>\n<li>Kuidas j\u00e4lgida andmebaasi struktuuri muutusi p\u00e4rast varukoopia salvestamist<\/li>\n<li>Kuidas edastada andmebaasi struktuuri muutusi teistele keskkondadele ilma konfliktideta ja suuremate migratsioonifailideta<\/li>\n<li>Kuidas korraldada mitme arendaja paralleelset t\u00f6\u00f6tamist projekti kallal<\/li>\n<li>Kuidas turvaliselt juurutada suurem hulk andmebaasi struktuuri muutusi tootmisringkonda<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<blockquote><p><strong>SchemaKeeper<\/strong> on loodud salvestatud protseduuride t\u00f6\u00f6tlemiseks, mis on kirjutatud keeles <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/plpgsql.html\">PL\/pgSQL<\/a><\/noindex>. Testimine teiste keeltest ei ole toimunud, seet\u00f5ttu v\u00f5ib kasutamine olla v\u00e4hem t\u00f5hus v\u00f5i isegi v\u00f5imatu.\n<\/p><\/blockquote>\n<\/li>\n<\/ol>\n<p><\/p>\n<h2 id=\"v-kakom-vide-hranit-damp-struktury-bd-v-vcs\">Kuidas salvestada andmebaasi struktuuri dump VCS-is<\/h2>\n<p><\/p>\n<p>Raamatukogu <noindex><a rel=\"nofollow\" href=\"https:\/\/packagist.org\/packages\/schema-keeper\/schema-keeper\">schema-keeper<\/a><\/noindex> pakub funktsiooni <code>saveDump<\/code>, mis salvestab k\u00f5ikide objektide struktuuri andmebaasist eraldi tekstifailidena. Tulemuseks luuakse kataloog, mis sisaldab andmebaasi struktuuri, jagatuna r\u00fchmitatud failideks, mida on lihtne VCS-i lisada.<\/p>\n<p><\/p>\n<p>Vaadata objekti teisendamist andmebaasist failideks mitmete n\u00e4idete abil:<\/p>\n<p><\/p>\n<p>Objekti t\u00fc\u00fcp<br \/>\nSkeem<br \/>\nNimi<br \/>\nFaili suhteline tee<\/p>\n<p>Tabel<br \/>\npublic<br \/>\naccounts<br \/>\n<code>.\/public\/tables\/accounts.txt<\/code><\/p>\n<p>Salvestatud protseduur<br \/>\npublic<br \/>\nauth(hash bigint)<br \/>\n<code>.\/public\/functions\/auth(int8).sql<\/code><\/p>\n<p>Vaade<br \/>\nbooking<br \/>\ntariffs<br \/>\n<code>.\/booking\/views\/tariffs.txt<\/code><\/p>\n<p><\/p>\n<p>Failide sisu on objekti andmebaasi struktuuri tekstiline esitus. N\u00e4iteks salvestatud protseduuride puhul on faili sisuks salvestatud protseduuri t\u00e4iendav m\u00e4\u00e4ratlemine, mis algab plokist <code>CREATE OR REPLACE FUNCTION<\/code>.<\/p>\n<p><\/p>\n<p>Nagu n\u00e4ha \u00fclaltoodud tabelist, sisaldab faili tee teavet objekti t\u00fc\u00fcbi, skeemi ja nime kohta. Selline l\u00e4henemine lihtsustab dump'i navigeerimist ja andmebaasi muudatuste arvustamist.<\/p>\n<p><\/p>\n<blockquote><p>Laiendus <code>.sql<\/code> protseduuride l\u00e4htekoodifailide jaoks on valitud, et IDE-d pakuksid automaatselt t\u00f6\u00f6riistu andmebaasi interaktsiooniks faili avamisel.<\/p><\/blockquote>\n<p><\/p>\n<h2 id=\"kak-otslezhivat-izmeneniya-v-strukture-bd-posle-sohraneniya-dampa\">Kuidas j\u00e4lgida andmebaasi struktuuri muutusi p\u00e4rast varukoopia salvestamist<\/h2>\n<p><\/p>\n<p>Salvestades praeguse andmebaasi struktuuri VCS-s, saame kontrollida, kas struktuuri on p\u00e4rast dumpi loomist muudetud. Raamatukogus <noindex><a rel=\"nofollow\" href=\"https:\/\/packagist.org\/packages\/schema-keeper\/schema-keeper\">schema-keeper<\/a><\/noindex> andmebaasi struktuuri muutuste tuvastamiseks on ette n\u00e4htud funktsioon <code>verifyDump<\/code>, mis tagastab ilma k\u00f5rvalm\u00f5judeta teavet erinevuste kohta. <\/p>\n<p><\/p>\n<p>Alternatiivne kontrollimeetod \u2014 kutsuda uuesti v\u00e4lja funktsioon <code>saveDump<\/code>, m\u00e4rkides sama katalooge, ja kontrollida VCS-is muudatuste olemasolu. Kuna k\u00f5ik andmebaasi objektid on salvestatud eraldi failidesse, n\u00e4itab VCS ainult muudetud objekte.<br \/>\nPeamine miinus antud meetodi puhul \u2014 failide \u00fcmberkirjutamise vajadus muudatuste n\u00e4gemiseks.<\/p>\n<p><\/p>\n<h2 id=\"kak-perenosit-izmeneniya-v-strukture-bd-na-drugie-okruzheniya-bez-konfliktov-i-gigantskih-faylov-migraciy\">Kuidas edastada andmebaasi struktuuri muutusi teistele keskkondadele ilma konfliktideta ja suuremate migratsioonifailideta<\/h2>\n<p><\/p>\n<p>T\u00e4nu funktsioonile <code>deployDump<\/code> Salvestatud protseduuride l\u00e4htekoodi saab muuta sama lihtsalt nagu tavalise rakenduse l\u00e4htekoodi. Uusi koodiridasid saab lisada v\u00f5i eemaldada salvestatud protseduuride koodis ning kohe saab saata muudatused versioonihalduss\u00fcsteemi v\u00f5i luua v\u00f5i kustutada salvestatud protseduure, luues v\u00f5i kustutades vastavaid faile koopia kaustas. <\/p>\n<p><\/p>\n<p>N\u00e4iteks uue salvestatud protseduuri loomiseks skeemis <code>public<\/code> on piisav luua uus fail laiendiga <code>.sql<\/code> kaustas <code>public\/functions<\/code>, asetada sellesse salvestatud protseduuri l\u00e4htekood, sealhulgas plokk <code>CREATE OR REPLACE FUNCTION<\/code>, seej\u00e4rel kutsuda v\u00e4lja funktsioon <code>deployDump<\/code>. Sarnasel viisil toimub salvestatud protseduuri muutmine ja kustutamine. Seega satub kood samal ajal nii VCS-i kui ka andmebaasi. <\/p>\n<p><\/p>\n<p>Kui m\u00f5ne salvestatud protseduuri l\u00e4htekoodis ilmneb viga v\u00f5i tekib vastuolu faili nime ja salvestatud protseduuri vahel, siis <code>deployDump<\/code> ei toimu, kuvades veateate. Salvestatud protseduuride lahknevus koopia ja praeguse andmebaasi vahel on v\u00f5imatu, kui kasutatakse <code>deployDump<\/code>.<\/p>\n<p><\/p>\n<blockquote><p>Uue salvestatud protseduuri loomisel ei ole vaja k\u00e4sitsi sisestada \u00f5iget faili nime. Piisab, kui failil on laiend <code>.sql<\/code>. P\u00e4rast v\u00e4ljakutsumist <code>deployDump<\/code> veatekst sisaldab \u00f5iget nime, mida saab kasutada faili \u00fcmbernimetamiseks.<\/p><\/blockquote>\n<p><code>deployDump<\/code> v\u00f5imaldab muuta funktsiooni v\u00f5i tagastatava t\u00fc\u00fcbi parameetreid ilma t\u00e4iendavate toiminguteta, samas kui klassikalise l\u00e4henemise korral oleks olnud vajalik<br \/>\nesiteks teostada <code>DROP FUNCTION<\/code>, ja alles siis <code>CREATE OR REPLACE FUNCTION<\/code>.<\/p>\n<p><\/p>\n<p>Kahjuks on olukordi, kus <code>deployDump<\/code> ei ole suuteline automaatselt muudatusi rakendama. N\u00e4iteks, kui eemaldatakse k\u00e4ivitusfunktsioon, mida kasutab v\u00e4hemalt \u00fcks k\u00e4ivitus. Sellised olukorrad lahendatakse k\u00e4sitsi migratsioonifailide abil.<\/p>\n<p><\/p>\n<p>Kui muutuste eest h\u00e4lbivates protseduurides vastutab <noindex><a rel=\"nofollow\" href=\"https:\/\/packagist.org\/packages\/schema-keeper\/schema-keeper\">schema-keeper<\/a><\/noindex>, siis \u00fclej\u00e4\u00e4nud struktuuri muudatuste \u00fcleviimiseks tuleb kasutada migratsioonifaile. N\u00e4iteks on hea raamatukogu migratsioonide jaoks <noindex><a rel=\"nofollow\" href=\"https:\/\/packagist.org\/packages\/doctrine\/migrations\">doctrine\/migrations<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Migratsioonid peavad olema rakendatud enne <code>deployDump<\/code>. See v\u00f5imaldab teha k\u00f5ik muudatused struktuuris ja lahendada probleemsed olukorrad, et muudatused h\u00e4lbivates protseduurides saaks hiljem probleemideta \u00fcle kanda.<\/p>\n<p><\/p>\n<p>Migratsioonide t\u00f6\u00f6 kohta l\u00e4hemalt tuleb juttu j\u00e4rgmistes osades.<\/p>\n<p><\/p>\n<h2 id=\"kak-naladit-process-parallelnoy-raboty-nad-proektom-neskolkih-razrabotchikov\">Kuidas korraldada mitme arendaja paralleelset t\u00f6\u00f6tamist projekti kallal<\/h2>\n<p><\/p>\n<p>On oluline luua t\u00e4ieliku andmebaasi initsialiseerimise skript, mis k\u00e4ivitatakse arendaja oma t\u00f6\u00f6keskkonnas, et viia kohaliku andmebaasi struktuur vastavusse VCS-i salvestatud dumpiga. Lihtsaim on jagada kohaliku andmebaasi initsialiseerimine kolme etappi:<\/p>\n<p><\/p>\n<ol>\n<li>Importida fail p\u00f5histruktuuriga, mida saab n\u00e4iteks nimetada <code>base.sql<\/code> <\/li>\n<li>Rakendada migratsioone<\/li>\n<li>Kutse <code>deployDump<\/code><\/li>\n<\/ol>\n<p><\/p>\n<blockquote><p><code>base.sql<\/code> \u2014 see on l\u00e4htepunt, millele tuginedes rakendatakse migratsioone ja tehakse <code>deployDump<\/code>, st <code>base.sql + migratsioonid + deployDump = ajakohane andmebaasi struktuur<\/code>. Sellise faili genereerimiseks saab kasutada utiliiti <code>pg_dump<\/code>. Seda kasutatakse <code>base.sql<\/code> ainult andmebaasi initsialiseerimiseks nullist.<\/p><\/blockquote>\n<p>Nimetame t\u00e4ieliku andmebaasi initsialiseerimise skripti <code>refresh.sh<\/code>. T\u00f6\u00f6voog v\u00f5iks v\u00e4lja n\u00e4ha j\u00e4rgmiselt:<\/p>\n<p><\/p>\n<ol>\n<li>Arendaja k\u00e4ivitab oma keskkonnas <code>refresh.sh<\/code> ja saab ajakohase andmebaasi struktuuri<\/li>\n<li>Arendaja hakkab t\u00f6\u00f6tama seatud \u00fclesande kallal, muutes kohaliku andmebaasi vastavalt uue funktsiooni vajadustele (<code>ALTER TABLE ... ADD COLUMN<\/code> jne)<\/li>\n<li>P\u00e4rast \u00fclesande t\u00e4itmist kutsub arendaja v\u00e4lja funktsiooni <code>saveDump<\/code>, et fikseerida VCS-is andmebaasis tehtud muudatused<\/li>\n<li>Arendaja k\u00e4ivitab uuesti <code>refresh.sh<\/code>, seej\u00e4rel <code>verifyDump<\/code>, mis n\u00fc\u00fcd n\u00e4itab migratsiooni kaasamise muudatuste loendit<\/li>\n<li>Arendaja viib k\u00f5ik struktuuri muutused \u00fcle migratsioonifaili, k\u00e4ivitab selle uuesti <code>refresh.sh<\/code> ja <code>verifyDump<\/code>, ja kui migratsioon on korrektselt koostatud, <code>verifyDump<\/code> n\u00e4itab see erinevuste puudumist kohaliku andmebaasi ja salvestatud dumpi vahel<\/li>\n<\/ol>\n<p><\/p>\n<p>\u00dclaltoodud protsess on koosk\u00f5las gitflow p\u00f5him\u00f5tetega. Iga haru VCS-is sisaldab oma dumpi versiooni ning harude sulandumisel toimub dumpide \u00fchendamine. Enamasti ei ole p\u00e4rast sulandumist vaja teha t\u00e4iendavaid toiminguid, kuid kui erinevates harudes on tehtud muudatusi, n\u00e4iteks samasse tabelisse, v\u00f5ib tekkida konflikt.<\/p>\n<p><\/p>\n<p>Vaatame konfliktset olukorda n\u00e4itel: on haru <em>develop<\/em>, millest on v\u00e4lja kasvanud kaks haru: <em>feature1<\/em> ja <em>feature2<\/em>, mis ei sisalda konflikte <em>develop<\/em>, kuid omavad \u00fcksteisega konflikte. \u00dclesanne on sulandada m\u00f5lemad harud <em>develop<\/em>. Sellisel juhul soovitatakse k\u00f5igepealt sulandada \u00fcks harudest <em>develop<\/em>, seej\u00e4rel siis <em>develop<\/em> j\u00e4tta alles haru, lahendades konfliktid seal, p\u00e4rast mida sulandada viimane haru <em>develop<\/em>. Konfliktide lahendamise etapis v\u00f5ib olla vajalik migreerimisfaili muutmine viimases haru, et see vastaks l\u00f5ppdumpile, mis sisaldab liitumiste tulemusi.<\/p>\n<p><\/p>\n<h2 id=\"kak-bezopasno-deploit-bolshee-kolichestvo-izmeneniy-v-strukture-bd-na-production-okruzhenie\">Kuidas turvaliselt juurutada suurem hulk andmebaasi struktuuri muutusi tootmisringkonda<\/h2>\n<p><\/p>\n<p>T\u00e4nu VCS-s olevatele andmebaasi struktuuri dumpidele on v\u00f5imalik kontrollida tootmisbaasi t\u00e4pset vastavust n\u00f5utud struktuurile. See tagab, et tootmisbaasi on edukalt kantud k\u00f5ik muudatused, mida arendajad kavandasid.<\/p>\n<p><\/p>\n<p>Kuna <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/ddl.html\">DDL<\/a><\/noindex> PostgreSQL-is on <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.postgresql.org\/wiki\/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis\">tehinguline<\/a><\/noindex>, soovitatakse j\u00e4rgida j\u00e4rgmisi juurutamise etappe, et vajadusel 'valutult' teostada. <code>RULLI TAGASI<\/code>:<\/p>\n<p><\/p>\n<ol>\n<li>Alusta tehingut.<\/li>\n<li>Tehingus teosta k\u00f5ik migratsioonid.<\/li>\n<li>Samuti teosta selles tehingus <code>deployDump<\/code><\/li>\n<li>Ilma tehingut l\u00f5petamata teosta <code>verifyDump<\/code>. Kui vigu ei ole, teosta <code>COMMIT<\/code>. Kui vigu on, teosta <code>RULLI TAGASI<\/code><\/li>\n<\/ol>\n<p><\/p>\n<p>Need sammud on piisavalt lihtsalt integreeritavad olemasolevatesse rakenduste juurutamise meetoditesse, sealhulgas zero-downtime'i l\u00e4henemistesse.<\/p>\n<p><\/p>\n<h1 id=\"zaklyuchenie\">Kokkuv\u00f5te<\/h1>\n<p><\/p>\n<p>\u00dclaltoodud meetodite abil on v\u00f5imalik maksimeerida \u00abPHP + PostgreSQL\u00bb projektide j\u00f5udlust, ohverdades samas suhteliselt v\u00e4ikese arenduse mugavuse v\u00f5rreldes kogu \u00e4ri-logika realiseerimisega rakenduse p\u00f5hikoodis. Lisaks sellele, andmete t\u00f6\u00f6tlemine <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/plpgsql.html\">PL\/pgSQL<\/a><\/noindex> n\u00e4eb sageli v\u00e4lja l\u00e4bipaistvam ja n\u00f5uab v\u00e4hem koodi, kui sama funktsionaalsus, kirjutatud PHP-s.<\/p>\n<p>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/447746\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0426\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 schema-keeper \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 PHP-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u0421\u0423\u0411\u0414 PostgreSQL. \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0443 \u0445\u043e\u0442\u044f\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 PostgreSQL, \u043d\u043e \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438, \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u043d\u043e\u0439 \u0432 \u0411\u0414. \u0421\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-31385","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0426\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 schema-keeper \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 PHP-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u0421\u0423\u0411\u0414 PostgreSQL. \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0443 \u0445\u043e\u0442\u044f\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 PostgreSQL, \u043d\u043e \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438, \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u043d\u043e\u0439 \u0432 \u0411\u0414. \u0421\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/biznes-logika-v-baze-dannyh-pri-pomoshhi-schemakeeper\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0411\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 SchemaKeeper | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0426\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 schema-keeper \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 PHP-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u0421\u0423\u0411\u0414 PostgreSQL. \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0443 \u0445\u043e\u0442\u044f\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 PostgreSQL, \u043d\u043e \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438, \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u043d\u043e\u0439 \u0432 \u0411\u0414. \u0421\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/biznes-logika-v-baze-dannyh-pri-pomoshhi-schemakeeper\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:40:58+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:40:58+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47\u00c4riline loogika andmebaasis SchemaKeeperi abil | ProHoster","description":"K\u00e4esoleva artikli eesm\u00e4rk on n\u00e4idata, kasutades schema-keeper raamatukogu, t\u00f6\u00f6riistu, mis oluliselt lihtsustavad andmebaaside arendusprotsessi PHP projektide raames, mis kasutavad PostgreSQL andmebaasi. Artiklis sisalduv info on eelk\u00f5ige kasulik arendajatele, kes soovivad maksimaalselt \u00e4ra kasutada PostgreSQL v\u00f5imalusi, kuid seisavad silmitsi \u00e4ri-logika hooldamise probleemidega, mis on viidud andmebaasi. Artikkel ei k\u00e4sitle eeliseid","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/biznes-logika-v-baze-dannyh-pri-pomoshhi-schemakeeper","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0411\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 SchemaKeeper | ProHoster","og:description":"\u0426\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 schema-keeper \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 PHP-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u0421\u0423\u0411\u0414 PostgreSQL. \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0443 \u0445\u043e\u0442\u044f\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 PostgreSQL, \u043d\u043e \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438, \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u043d\u043e\u0439 \u0432 \u0411\u0414. \u0421\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/biznes-logika-v-baze-dannyh-pri-pomoshhi-schemakeeper","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:40:58+00:00","article:modified_time":"2019-10-31T18:40:58+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"31385","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 05:54:24","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:17:26","updated":"2026-01-21 05:54:24"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/31385","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=31385"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/31385\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=31385"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=31385"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=31385"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}