{"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":"Ettev\u00f5tte loogika andmebaasis SchemaKeeperi abil","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>K\u00e4esoleva artikli eesm\u00e4rk on n\u00e4idata raamatukogu n\u00e4itel <noindex><a rel=\"nofollow\" href=\"https:\/\/packagist.org\/packages\/schema-keeper\/schema-keeper\">schema-keeper<\/a><\/noindex> t\u00f6\u00f6riistu, mis suudavad oluliselt lihtsustada andmebaaside arendamise protsessi PHP-projektides, mis kasutavad andmebaasis\u00fcsteemi PostgreSQL.<\/p>\n<p><\/p>\n<p>Selle artikli teave on eelk\u00f5ige kasulik arendajatele, kes soovivad maksimaalselt \u00e4ra kasutada PostgreSQL-i v\u00f5imalusi, kuid seisavad silmitsi probleemidega, mis on seotud ettev\u00f5tte loogika s\u00e4ilitamisega andmebaasis. <\/p>\n<p><\/p>\n<p>Artikkel ei k\u00e4sitle ettev\u00f5tte loogika s\u00e4ilitamise eeliseid ega puudusi andmebaasis. Eeldatakse, et lugeja on juba valiku teinud.<\/p>\n<p><\/p>\n<p>K\u00e4esolevas t\u00f6\u00f6ks uuritakse j\u00e4rgmisi teemasid:<\/p>\n<p><\/p>\n<ol>\n<li>Millises vormis hoida andmebaasi struktuuri dump versioonihalduss\u00fcsteemis (edaspidi - VCS)<\/li>\n<li>Kuidas j\u00e4lgida andmebaasi struktuuri muudatusi p\u00e4rast dumpi salvestamist<\/li>\n<li>Kuidas edastada andmebaasi struktuuri muudatusi teistesse keskkondadesse ilma konfliktide ja hiiglaslike migratsioonifailideta<\/li>\n<li>Kuidas korraldada mitme arendaja paralleelset t\u00f6\u00f6d projekti kallal<\/li>\n<li>Kuidas turvaliselt juurutada suurem hulk muudatusi andmebaasi struktuuris tootmiskeskkonnas<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<blockquote><p><strong>SchemaKeeper<\/strong> on kohandatud salvestatud protseduuridega, mis on kirjutatud keeles <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/plpgsql.html\">PL\/pgSQL<\/a><\/noindex>. Testimist teiste keeltes ei ole tehtud, seega v\u00f5ib kasutamine olla v\u00e4hem t\u00f5hus v\u00f5i v\u00f5imatu.\n<\/p><\/blockquote>\n<\/li>\n<\/ol>\n<p><\/p>\n<h2 id=\"v-kakom-vide-hranit-damp-struktury-bd-v-vcs\">Millises vormis hoida 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 andmebaasi k\u00f5igi objektide struktuuri eraldi tekstifailidena. V\u00e4ljundina luuakse kataloog, mis sisaldab andmebaasi struktuuri eraldatud failides, mis on h\u00f5lpsasti lisatav VCS-i.<\/p>\n<p><\/p>\n<p>Vaatleme andmebaasi objektide teisendamist failideks mitme n\u00e4ite abil:<\/p>\n<p><\/p>\n<p>Objekti t\u00fc\u00fcp<br \/>\nSchema<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 konkreetse andmebaasi objekti struktuuri tekstiline esitus. N\u00e4iteks salvestatud protseduuride korral on faili sisuks salvestatud protseduuri t\u00e4ielik m\u00e4\u00e4ratlemine, mis algab plokist <code>CREATE OR REPLACE FUNCTION<\/code>.<\/p>\n<p><\/p>\n<p>Nagu on n\u00e4ha \u00fclaltoodud tabelist, hoiab faili tee endas teavet objekti t\u00fc\u00fcbi, skeemi ja nime kohta. Selline l\u00e4henemine lihtsustab dumpis navigeerimist ja andmebaasi muudatuste \u00fclevaatamist.<\/p>\n<p><\/p>\n<blockquote><p>Laien <code>.sql<\/code> n\u00e4idatud, et IDE-de automaatselt pakkuda t\u00f6\u00f6riistu andmebaasiga suhtlemiseks, kui fail on avatud.<\/p><\/blockquote>\n<p><\/p>\n<h2 id=\"kak-otslezhivat-izmeneniya-v-strukture-bd-posle-sohraneniya-dampa\">Kuidas j\u00e4lgida andmebaasi struktuuri muudatusi p\u00e4rast dumpi salvestamist<\/h2>\n<p><\/p>\n<p>Salvestades hetke andmebaasi struktuuri dump VCS-i, saame kontrollida, kas andmebaasi 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> muutuste tuvastamiseks andmebaasi struktuuris on ette n\u00e4htud funktsioon <code>verifyDump<\/code>, mis tagastab teabe erinevuste kohta ilma k\u00f5rvaltoimeteta. <\/p>\n<p><\/p>\n<p>Alternatiivne kontrollimeetod on funktsiooni uuesti kutsumine <code>saveDump<\/code>, m\u00e4\u00e4rates sama kausta ja kontrollides VCS-is muutuste olemasolu. Kuna k\u00f5ik andmebaasi objektid on salvestatud eraldi failidesse, n\u00e4itab VCS ainult muudetud objekte.<br \/>\nSelle meetodi peamine miinus on failide \u00fclekirjutamise vajadus, et n\u00e4ha muudatusi.<\/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 muudatusi teistesse keskkondadesse ilma konfliktide ja hiiglaslike migratsioonifailideta<\/h2>\n<p><\/p>\n<p>T\u00e4nu funktsioonile <code>deployDump<\/code> saab salvestatud protseduuride algkoodi redigeerida t\u00e4pselt samamoodi nagu tavalist rakenduse algkoodi. Saame lisada\/maha v\u00f5tta uusi ridu salvestatud protseduuride koodis ja saata muudatused kohe versioonihalduss\u00fcsteemi, v\u00f5i luua\/kustutada salvestatud protseduure, luues\/kustutades vastavaid faile dumpi kaustas. <\/p>\n<p><\/p>\n<p>N\u00e4iteks, et luua uus salvestatud protseduur skeemis <code>public<\/code> on piisav luua uus fail, millel on laiend <code>.sql<\/code> kaustas <code>public\/functions<\/code>, panna sinna salvestatud protseduuri algkood, sealhulgas plokk <code>CREATE OR REPLACE FUNCTION<\/code>, ja seej\u00e4rel kutsuda funktsiooni <code>deployDump<\/code>. Samuti toimub salvestatud protseduuri muutmine ja kustutamine. Seega satub kood samal ajal nii VCS-i kui ka andmebaasi. <\/p>\n<p><\/p>\n<p>Kui salvestatud protseduuri algkoodis ilmneb viga v\u00f5i erimeelsus faili ja salvestatud protseduuri nimede vahel, siis <code>deployDump<\/code> ei toimi, kuvades viga. Salvestatud protseduuride erisus dumpi ja praeguse andmebaasi vahel on v\u00f5imatu kasutada <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 kutsumist <code>deployDump<\/code> kuvab vea tekst \u00f5ige nime, mida saab faili \u00fcmbernimetamiseks kasutada.<\/p><\/blockquote>\n<p><code>deployDump<\/code> v\u00f5imaldab funktsiooni parameetreid v\u00f5i tagastatavat t\u00fc\u00fcpi muuta ilma t\u00e4iendavate toiminguteta, samas kui klassikalise l\u00e4henemise korral oleks pidanud<br \/>\nesmaj\u00e4rjekorras t\u00e4itma <code>KUSTUTA FUNKTSIOON<\/code>, ja alles seej\u00e4rel <code>CREATE OR REPLACE FUNCTION<\/code>.<\/p>\n<p><\/p>\n<p>Kahjuks on olukordi, kus <code>deployDump<\/code> ei suudeta muudatusi automaatselt rakendada. N\u00e4iteks juhul, kui kustutatakse k\u00e4ivitaja funktsioon, mida kasutab v\u00e4hemalt \u00fcks k\u00e4ivitaja. Sellised olukorrad lahendatakse k\u00e4sitsi migratsioonifailide abil.<\/p>\n<p><\/p>\n<p>Kui muutuste \u00fclekande eest salvestatud protseduurides vastutab ise <noindex><a rel=\"nofollow\" href=\"https:\/\/packagist.org\/packages\/schema-keeper\/schema-keeper\">schema-keeper<\/a><\/noindex>, siis teiste struktuurimuudatuste \u00fclekandmiseks tuleb kasutada migratsioonifaile. N\u00e4iteks on hea migratsioonidega t\u00f6\u00f6tamiseks raamatukogu <noindex><a rel=\"nofollow\" href=\"https:\/\/packagist.org\/packages\/doctrine\/migrations\">doctrine\/migrations<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Migratsioonid tuleb rakendada enne k\u00e4ivitamist <code>deployDump<\/code>. See v\u00f5imaldab teha k\u00f5ik struktuuri muudatused ja lahendada probleemsed olukorrad, et salvestatud protseduurides tehtud muudatused saaksid hiljem probleemideta edasi kanduda.<\/p>\n<p><\/p>\n<p>Migratsioonide t\u00f6\u00f6 kohta on rohkem teavet j\u00e4rgmistes jaotistes.<\/p>\n<p><\/p>\n<h2 id=\"kak-naladit-process-parallelnoy-raboty-nad-proektom-neskolkih-razrabotchikov\">Kuidas korraldada mitme arendaja paralleelset t\u00f6\u00f6d projekti kallal<\/h2>\n<p><\/p>\n<p>On vaja luua DB t\u00e4ieliku initsialiseerimise skript, mida arendaja k\u00e4ivitab oma t\u00f6\u00f6masinas, viies kohaliku DB struktuuri vastavusse VCS-s salvestatud dumpiga. K\u00f5ige lihtsam on jagada kohaliku DB initsialiseerimine kolmeks sammuks:<\/p>\n<p><\/p>\n<ol>\n<li>Baasskeemi faili importimine, mis kannab nime n\u00e4iteks <code>base.sql<\/code> <\/li>\n<li>Migratsioonide rakendamine<\/li>\n<li>Kutsumine <code>deployDump<\/code><\/li>\n<\/ol>\n<p><\/p>\n<blockquote><p><code>base.sql<\/code> \u2014 see on l\u00e4htepunkt, mille peale rakendatakse migratsioonid ja t\u00e4idetakse <code>deployDump<\/code>, see t\u00e4hendab <code>base.sql + migratsioonid + deployDump = ajakohane DB struktuur<\/code>. Sellise faili saab genereerida utiliidiga <code>pg_dump<\/code>. Kasutatakse <code>base.sql<\/code> ainult DB algse initsialiseerimise ajal.<\/p><\/blockquote>\n<p>Nimetame DB t\u00e4ieliku initsialiseerimise skripti <code>refresh.sh<\/code>. T\u00f6\u00f6protsess v\u00f5ib v\u00e4lja n\u00e4ha j\u00e4rgmine:<\/p>\n<p><\/p>\n<ol>\n<li>Arendaja k\u00e4ivitab oma keskkonnas <code>refresh.sh<\/code> ja saab ajakohase DB struktuuri<\/li>\n<li>Arendaja hakkab t\u00f6\u00f6tama m\u00e4\u00e4ratud \u00fclesande kallal, muutes kohaliku DB uue funktsionaalsuse vajadustele vastavaks (<code>ALTER TABLE ... lisa veerg<\/code> jne)<\/li>\n<li>P\u00e4rast \u00fclesande t\u00e4itmist kutsub arendaja v\u00e4lja funktsiooni <code>saveDump<\/code>, et fikseerida VCS-is DB-s tehtud muudatused<\/li>\n<li>Arendaja k\u00e4ivitab uuesti <code>refresh.sh<\/code>, seej\u00e4rel <code>verifyDump<\/code>, mis n\u00fc\u00fcd n\u00e4itab muudatuste nimekirja migreerimiseks<\/li>\n<li>Arendaja kannab k\u00f5ik struktuuri muudatused migratsioonifaili, k\u00e4ivitab uuesti <code>refresh.sh<\/code> ja <code>verifyDump<\/code>, ja kui migratsioon on korrektselt koostatud, <code>verifyDump<\/code> n\u00e4itab, et kohaliku DB ja salvestatud dumpi vahel pole erinevusi.<\/li>\n<\/ol>\n<p><\/p>\n<p>\u00dclaltoodud protsess on koosk\u00f5las gitflow p\u00f5him\u00f5tetega. Iga haru VCS-is sisaldab oma dump'i versiooni ning harude \u00fchendamisel toimub dump'ide liitmine. Enamikul juhtudel ei ole p\u00e4rast liitmist vaja mingit t\u00e4iendavat tegevust, kuid kui erinevates harudes on tehtud muudatusi, n\u00e4iteks samas tabelis, v\u00f5ib konflikt tekkida.<\/p>\n<p><\/p>\n<p>Vaatleme konfliktset olukorda n\u00e4ite abil: on haru <em>develop<\/em>, millest on harunenud kaks haru: <em>feature1<\/em> ja <em>feature2<\/em>, mis ei ole konfliktis <em>develop<\/em>, kuid on konfliktis omavahel. Eesm\u00e4rk on m\u00f5lema haru liitmine <em>develop<\/em>. Selle jaoks soovitatakse esmalt liita \u00fcks haru <em>develop<\/em>, seej\u00e4rel liita <em>develop<\/em> j\u00e4\u00e4kharusse, lahendades sealjuures konfliktid j\u00e4\u00e4nud haru osas, p\u00e4rast mida liita viimane haru <em>develop<\/em>. Konfliktide lahendamise etapis v\u00f5ib osutuda vajalikuks parandada migratsioonifail viimasel harul, et see vastaks l\u00f5ppdump'ile, mis sisaldab liitmise 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 muudatusi andmebaasi struktuuris tootmiskeskkonnas<\/h2>\n<p><\/p>\n<p>T\u00e4nu VCS-is oleva aktuaalse andmebaasi struktuuri dump'ile on v\u00f5imalik kontrollida production-andmebaasi t\u00e4pset vastavust n\u00f5utavale struktuurile. See tagab, et k\u00f5ik arendajate soovitud muudatused on edukalt toodetud andmebaasi viidud.<\/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>, on soovitatav j\u00e4rgida j\u00e4rgmist juurutamise j\u00e4rjekorda, et juhuslike vigade korral oleks v\u00f5imalik \"valutult\" teostada <code>ROLLBACK<\/code>:<\/p>\n<p><\/p>\n<ol>\n<li>Alusta tehingut<\/li>\n<li>Tehingu raames teosta k\u00f5ik migratsioonid<\/li>\n<li>Samas tehingus teosta <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>ROLLBACK<\/code><\/li>\n<\/ol>\n<p><\/p>\n<p>Need sammud on piisavalt lihtsad, et neid saaks integreerida olemasolevatesse rakenduste juurutamise l\u00e4henemistesse, sealhulgas zero-downtime.<\/p>\n<p><\/p>\n<h1 id=\"zaklyuchenie\">Kokkuv\u00f5te<\/h1>\n<p><\/p>\n<p>\u00dclaltoodud meetodite abil on v\u00f5imalik maksimeerida \"PHP + PostgreSQL\" projektide j\u00f5udlust, ohverdades samal ajal suhteliselt v\u00e4ikese mugavuse arendamisel v\u00f5rreldes kogu \u00e4ri loogika rakendamisega rakenduse p\u00f5hiprogrammis. Veelgi enam, 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 vajab v\u00e4hem koodi kui sama funktsionaalsus, mis on 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 5.0.1.1 - 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.\" \/>\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) 5.0.1.1\" \/>\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.\" \/>\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\u00c4riloogika andmebaasis SchemaKeeperi abil | ProHoster","description":"Selle artikli eesm\u00e4rk on n\u00e4idata schema-keeperi raamatukogul p\u00f5hinevaid t\u00f6\u00f6riistu, mis v\u00f5imaldavad olulisi kohandusi.","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.","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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}