{"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\/nl\/blog\/administrirovanie\/biznes-logika-v-baze-dannyh-pri-pomoshhi-schemakeeper","title":{"rendered":"Bedrijfslogica in de database met SchemaKeeper","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Het doel van dit artikel is om aan de hand van de bibliotheek <noindex><a rel=\"nofollow\" href=\"https:\/\/packagist.org\/packages\/schema-keeper\/schema-keeper\">schema-keeper<\/a><\/noindex> de tools te laten zien die het proces van databaseontwikkeling binnen PHP-projecten die PostgreSQL gebruiken, aanzienlijk vergemakkelijken.<\/p>\n<p><\/p>\n<p>Informatie uit dit artikel zal vooral nuttig zijn voor ontwikkelaars die de mogelijkheden van PostgreSQL maximaal willen benutten, maar problemen ondervinden bij het onderhouden van de bedrijfslogica die in de database is geplaatst. <\/p>\n<p><\/p>\n<p>Dit artikel zal de voordelen of nadelen van het opslaan van bedrijfslogica in de database niet beschrijven. Er wordt aangenomen dat de keuze al door de lezer is gemaakt.<\/p>\n<p><\/p>\n<p>De volgende vragen zullen worden behandeld:<\/p>\n<p><\/p>\n<ol>\n<li>In welke vorm de dump van de database-structuur in het versiebeheersysteem (hierna VCS) moet worden opgeslagen<\/li>\n<li>Hoe wijzigingen in de database-structuur na het opslaan van de dump kunnen worden gevolgd<\/li>\n<li>Hoe wijzigingen in de database-structuur naar andere omgevingen te verplaatsen zonder conflicten en gigantische migratiebestanden<\/li>\n<li>Hoe het proces van parallel werken aan het project door meerdere ontwikkelaars kan worden georganiseerd<\/li>\n<li>Hoe veilig een groter aantal wijzigingen in de database-structuur naar de productieomgeving kan worden gedeployed<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<blockquote><p><strong>SchemaKeeper<\/strong> is ontworpen voor het werken met opgeslagen procedures, geschreven in de taal <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/plpgsql.html\">PL\/pgSQL<\/a><\/noindex>. Testen met andere talen zijn niet uitgevoerd, dus het gebruik kan minder effectief of zelfs onmogelijk zijn.\n<\/p><\/blockquote>\n<\/li>\n<\/ol>\n<p><\/p>\n<h2 id=\"v-kakom-vide-hranit-damp-struktury-bd-v-vcs\">In welke vorm de dump van de database-structuur in VCS moet worden opgeslagen<\/h2>\n<p><\/p>\n<p>Bibliotheek <noindex><a rel=\"nofollow\" href=\"https:\/\/packagist.org\/packages\/schema-keeper\/schema-keeper\">schema-keeper<\/a><\/noindex> biedt de functie <code>saveDump<\/code>, die de structuur van alle objecten uit de database opslaat als afzonderlijke tekstbestanden. Het resultaat is een map die de database-structuur bevat, verdeeld in gegroepeerde bestanden die gemakkelijk aan VCS kunnen worden toegevoegd.<\/p>\n<p><\/p>\n<p>Laten we de conversie van objecten uit de database naar bestanden aan de hand van enkele voorbeelden bekijken:<\/p>\n<p><\/p>\n<p>Type object<br \/>\nSchema<br \/>\nNaam<br \/>\nRelatief pad naar bestand<\/p>\n<p>Tabel<br \/>\npublic<br \/>\naccounts<br \/>\n<code>.\\\/public\\\/tables\\\/accounts.txt<\/code><\/p>\n<p>Opgeslagen procedure<br \/>\npublic<br \/>\nauth(hash bigint)<br \/>\n<code>.\\\/public\\\/functions\\\/auth(int8).sql<\/code><\/p>\n<p>Representatie<br \/>\nbooking<br \/>\ntariffs<br \/>\n<code>.\\\/booking\\\/views\\\/tariffs.txt<\/code><\/p>\n<p><\/p>\n<p>De inhoud van de bestanden is een tekstuele weergave van de structuur van het specifieke databaseobject. Voor opgeslagen procedures is de inhoud van het bestand de volledige definitie van de opgeslagen procedure, die begint met het blok <code>CREATE OR REPLACE FUNCTION<\/code>.<\/p>\n<p><\/p>\n<p>Zoals te zien is in de bovenstaande tabel, bevat het pad naar het bestand informatie over het type, de schema en de naam van het object. Deze aanpak vergemakkelijkt de navigatie door de dump en de codebeoordeling van wijzigingen in de database.<\/p>\n<p><\/p>\n<blockquote><p>Uitbreiding <code>.sql<\/code> Voor bestanden met de broncode van opgeslagen procedures is gekozen, zodat de IDE automatisch hulpmiddelen voor interactie met de database biedt bij het openen van het bestand.<\/p><\/blockquote>\n<p><\/p>\n<h2 id=\"kak-otslezhivat-izmeneniya-v-strukture-bd-posle-sohraneniya-dampa\">Hoe wijzigingen in de database-structuur na het opslaan van de dump kunnen worden gevolgd<\/h2>\n<p><\/p>\n<p>Door een dump van de huidige database-structuur in VCS op te slaan, kunnen we controleren of er wijzigingen in de database-structuur zijn aangebracht na het maken van de dump. In de bibliotheek <noindex><a rel=\"nofollow\" href=\"https:\/\/packagist.org\/packages\/schema-keeper\/schema-keeper\">schema-keeper<\/a><\/noindex> is een functie voorzien voor het identificeren van wijzigingen in de database-structuur, <code>verifyDump<\/code>, die zonder bijwerkingen informatie over de verschillen retourneert. <\/p>\n<p><\/p>\n<p>Een alternatieve manier van controle is om de functie opnieuw aan te roepen, <code>saveDump<\/code>, met dezelfde directory op te geven en in VCS te controleren op wijzigingen. Aangezien alle objecten uit de database zijn opgeslagen in aparte bestanden, toont VCS alleen de gewijzigde objecten.<br \/>\nHet belangrijkste nadeel van deze methode is de noodzaak om bestanden opnieuw te schrijven om wijzigingen te zien.<\/p>\n<p><\/p>\n<h2 id=\"kak-perenosit-izmeneniya-v-strukture-bd-na-drugie-okruzheniya-bez-konfliktov-i-gigantskih-faylov-migraciy\">Hoe wijzigingen in de database-structuur naar andere omgevingen te verplaatsen zonder conflicten en gigantische migratiebestanden<\/h2>\n<p><\/p>\n<p>Dankzij de functie <code>deployDump<\/code> de broncode van opgeslagen procedures kan net zo worden aangepast als de gewone broncode van de applicatie. Nieuwe regels kunnen aan de code van opgeslagen procedures worden toegevoegd\/verwijderd en wijzigingen kunnen onmiddellijk naar het versiebeheersysteem worden gestuurd, of opgeslagen procedures kunnen worden aangemaakt\/verwijderd door de bijbehorende bestanden in de dumpdirectory aan te maken\/verwijderen. <\/p>\n<p><\/p>\n<p>Bijvoorbeeld, om een nieuwe opgeslagen procedure in het schema <code>public<\/code> te cre\u00ebren, is het voldoende om een nieuw bestand met de extensie <code>.sql<\/code> in de directory <code>public\/functions<\/code>aan te maken, de broncode van de opgeslagen procedure erin te plaatsen, inclusief het blok <code>CREATE OR REPLACE FUNCTION<\/code>, en vervolgens de functie aan te roepen. <code>deployDump<\/code>Op dezelfde manier worden opgeslagen procedures gewijzigd en verwijderd. Zo komt de code tegelijkertijd in VCS en in de database. <\/p>\n<p><\/p>\n<p>Als er een fout optreedt in de broncode van een opgeslagen procedure, of als er een discrepantie is tussen de bestandsnaam en de opgeslagen procedure, dan zal <code>deployDump<\/code> niet worden uitgevoerd, en verschijnt de foutmelding. <code>deployDump<\/code>.<\/p>\n<p><\/p>\n<blockquote><p>Een discrepantie tussen opgeslagen procedures in de dump en de huidige database is onmogelijk bij gebruik van <code>.sql<\/code>Bij het cre\u00ebren van een nieuwe opgeslagen procedure is het niet nodig om handmatig de juiste bestandsnaam in te voeren. Het is voldoende dat het bestand de extensie <code>deployDump<\/code> heeft. Na het aanroepen zal<\/p><\/blockquote>\n<p><code>deployDump<\/code> de foutmelding de juiste naam bevatten die kan worden gebruikt voor het hernoemen van het bestand.<br \/>\nmaakt het mogelijk om parameters van de functie of het geretourneerde type te wijzigen zonder extra stappen, terwijl bij de klassieke aanpak eerst <code>DROP FUNCTION<\/code>moet worden uitgevoerd, en pas daarna <code>CREATE OR REPLACE FUNCTION<\/code>.<\/p>\n<p><\/p>\n<p>Helaas zijn er situaties waarin <code>deployDump<\/code> het niet mogelijk is om wijzigingen automatisch toe te passen. Bijvoorbeeld, als een triggerfunctie wordt verwijderd die door ten minste \u00e9\u00e9n trigger wordt gebruikt. Dergelijke situaties worden handmatig opgelost met behulp van migratiebestanden.<\/p>\n<p><\/p>\n<p>Als de verantwoordelijk voor het overbrengen van wijzigingen in opgeslagen procedures ligt bij <noindex><a rel=\"nofollow\" href=\"https:\/\/packagist.org\/packages\/schema-keeper\/schema-keeper\">schema-keeper<\/a><\/noindex>, dan moeten migratiebestanden worden gebruikt om de overige wijzigingen in de structuur over te brengen. Een goede bibliotheek voor het werken met migraties is <noindex><a rel=\"nofollow\" href=\"https:\/\/packagist.org\/packages\/doctrine\/migrations\">doctrine\/migrations<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Migraties moeten worden toegepast v\u00f3\u00f3r de lancering <code>deployDump<\/code>. Dit maakt het mogelijk om alle wijzigingen in de structuur aan te brengen en problematische situaties op te lossen, zodat wijzigingen in opgeslagen procedures later probleemloos kunnen worden overgebracht.<\/p>\n<p><\/p>\n<p>Een uitvoerige beschrijving van het werken met migraties zal in de volgende secties worden gegeven.<\/p>\n<p><\/p>\n<h2 id=\"kak-naladit-process-parallelnoy-raboty-nad-proektom-neskolkih-razrabotchikov\">Hoe het proces van parallel werken aan het project door meerdere ontwikkelaars kan worden georganiseerd<\/h2>\n<p><\/p>\n<p>Het is noodzakelijk om een volledig initialisatiescript voor de database te maken, dat door de ontwikkelaar op zijn werkplek wordt uitgevoerd, zodat de structuur van de lokale database in overeenstemming is met de dump die in VCS is opgeslagen. Het is het gemakkelijkst om de initialisatie van de lokale database in drie stappen te verdelen:<\/p>\n<p><\/p>\n<ol>\n<li>Importeren van een bestand met de basisstructuur, dat bijvoorbeeld <code>base.sql<\/code> <\/li>\n<li>zal worden genoemd.<\/li>\n<li>Aanroep <code>deployDump<\/code><\/li>\n<\/ol>\n<p><\/p>\n<blockquote><p><code>base.sql<\/code> Toepassing van migraties <code>deployDump<\/code>, namelijk de <code>\u2014 dit is het uitgangspunt waarboven migraties worden toegepast en<\/code>base.sql + migraties + deployDump = actuele structuur van de database <code>pg_dump<\/code>. Dit bestand kan worden gevormd met behulp van de utility <code>base.sql<\/code> . Het wordt<\/p><\/blockquote>\n<p>uitsluitend gebruikt bij de initialisatie van de database vanaf nul. <code>Laten we het volledige initialisatiescript voor de database noemen<\/code>refresh.sh<\/p>\n<p><\/p>\n<ol>\n<li>. Het werkproces kan er als volgt uitzien: <code>Laten we het volledige initialisatiescript voor de database noemen<\/code> De ontwikkelaar voert in zijn omgeving uit<\/li>\n<li>en ontvangt de actuele structuur van de database.<code>De ontwikkelaar begint te werken aan de toegewezen taak, waarbij hij de lokale database aanpast aan de vereisten van de nieuwe functionaliteit (<\/code> ALTER TABLE ... ADD COLUMN<\/li>\n<li>enzovoort) <code>saveDump<\/code>Na voltooiing van de taak roept de ontwikkelaar de functie aan<\/li>\n<li>, om de wijzigingen die in de database zijn aangebracht, in VCS vast te leggen. <code>Laten we het volledige initialisatiescript voor de database noemen<\/code>, dan <code>verifyDump<\/code>De ontwikkelaar voert opnieuw uit<\/li>\n<li>, wat nu een lijst van wijzigingen toont om op te nemen in de migratie. <code>Laten we het volledige initialisatiescript voor de database noemen<\/code> en <code>verifyDump<\/code>De ontwikkelaar draagt alle wijzigingen in de structuur over naar het migratiebestand, voert opnieuw uit <code>verifyDump<\/code> , en als de migratie correct is samengesteld, zal deze geen verschillen tonen tussen de lokale database en de opgeslagen dump.<\/li>\n<\/ol>\n<p><\/p>\n<p>Het hierboven beschreven proces is compatibel met de principes van gitflow. Elke branch in de VCS bevat zijn eigen versie van de dump, en bij het samenvoegen van branches vindt er een samenvoegen van dumps plaats. In de meeste gevallen zijn er na het samenvoegen geen extra stappen nodig, maar als in verschillende branches wijzigingen zijn aangebracht, bijvoorbeeld in dezelfde tabel, kan er een conflict ontstaan.<\/p>\n<p><\/p>\n<p>Laten we een conflictsituatie bekijken aan de hand van het voorbeeld: er is een branch <em>develop<\/em>, waaruit twee branches zijn afgeleid: <em>feature1<\/em> en <em>feature2<\/em>, die geen conflicten hebben met <em>develop<\/em>, maar wel conflicten tussen elkaar. De taak is om beide branches samen te voegen in <em>develop<\/em>. Voor dit geval is het aanbevolen om eerst een van de branches samen te voegen in <em>develop<\/em>, en daarna <em>develop<\/em> in de resterende branch, terwijl de conflicten in de resterende branch worden opgelost, waarna de laatste branch in <em>develop<\/em>wordt samengevoegd. Tijdens het oplossen van conflicten kan het nodig zijn om het migratiebestand in de laatste branch aan te passen, zodat het overeenkomt met de uiteindelijke dump, die de resultaten van de samenvoegingen omvat.<\/p>\n<p><\/p>\n<h2 id=\"kak-bezopasno-deploit-bolshee-kolichestvo-izmeneniy-v-strukture-bd-na-production-okruzhenie\">Hoe veilig een groter aantal wijzigingen in de database-structuur naar de productieomgeving kan worden gedeployed<\/h2>\n<p><\/p>\n<p>Dankzij de dump van de actuele database-structuur in de VCS is het mogelijk om de productie-database te controleren op nauwkeurige overeenstemming met de vereiste structuur. Dit garandeert dat alle wijzigingen die de ontwikkelaars in gedachten hadden succesvol naar de productie-database zijn overgebracht.<\/p>\n<p><\/p>\n<p>Aangezien <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/ddl.html\">DDL<\/a><\/noindex> in PostgreSQL is <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.postgresql.org\/wiki\/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis\">transacties<\/a><\/noindex>, het wordt aangeraden om de volgende volgorde van deployment aan te houden, zodat, in geval van een onverwachte fout, het \"pijnlijk\" kan worden uitgevoerd. <code>ROLLBACK<\/code>:<\/p>\n<p><\/p>\n<ol>\n<li>Start de transactie<\/li>\n<li>Voer binnen de transactie alle migraties uit<\/li>\n<li>Voer binnen dezelfde transactie <code>deployDump<\/code><\/li>\n<li>Zonder de transactie af te sluiten, voer <code>verifyDump<\/code>uit. Als er geen fouten zijn, voer <code>COMMIT<\/code>uit. Als er fouten zijn, voer <code>ROLLBACK<\/code><\/li>\n<\/ol>\n<p><\/p>\n<p>Deze stappen zijn vrij gemakkelijk in te passen in bestaande benaderingen voor het deployen van applicaties, inclusief zero-downtime.<\/p>\n<p><\/p>\n<h1 id=\"zaklyuchenie\">Conclusie<\/h1>\n<p><\/p>\n<p>Dankzij de hierboven beschreven methoden kan er het meeste uit \"PHP + PostgreSQL\" projecten worden gehaald, met een relatief kleine opoffering van gebruiksgemak in vergelijking met de implementatie van de gehele bedrijfslogica in de hoofdcode van de applicatie. Bovendien ziet het verwerken van gegevens in <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/plpgsql.html\">PL\/pgSQL<\/a><\/noindex> er vaak transparanter uit en vereist het minder code dan dezelfde functionaliteit geschreven in PHP.<\/p>\n<p>Bron: <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.3 - 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\/nl\/blog\/administrirovanie\/biznes-logika-v-baze-dannyh-pri-pomoshhi-schemakeeper\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\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\/nl\/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\udd47Zakelijke logica in de database met SchemaKeeper | ProHoster","description":"Het doel van dit artikel is om aan de hand van de schema-keeper bibliotheek de hulpmiddelen te tonen die aanzienlijk kunnen helpen.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/biznes-logika-v-baze-dannyh-pri-pomoshhi-schemakeeper","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/31385","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=31385"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/31385\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=31385"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=31385"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=31385"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}