{"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\/da\/blog\/administrirovanie\/biznes-logika-v-baze-dannyh-pri-pomoshhi-schemakeeper","title":{"rendered":"Forretningslogik i databasen ved hj\u00e6lp af SchemaKeeper","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>M\u00e5let med denne artikel er at vise v\u00e6rkt\u00f8jer, der v\u00e6sentligt kan lette udviklingsprocessen af databaser i PHP-projekter, der bruger PostgreSQL, med hj\u00e6lp fra biblioteket <noindex><a rel=\"nofollow\" href=\"https:\/\/packagist.org\/packages\/schema-keeper\/schema-keeper\">schema-keeper<\/a><\/noindex> . Informationen fra denne artikel vil prim\u00e6rt v\u00e6re nyttig for udviklere, der \u00f8nsker at maksimere brugen af PostgreSQL, men som st\u00e5r over for problemer med vedligeholdelsen af forretningslogik, der er flyttet til databasen.<\/p>\n<p><\/p>\n<p>Artiklen vil ikke beskrive fordele eller ulemper ved at opbevare forretningslogik i databasen. Det antages, at l\u00e6seren allerede har truffet et valg. <\/p>\n<p><\/p>\n<p>Der vil blive overvejet f\u00f8lgende emner:<\/p>\n<p><\/p>\n<p>Hvordan skal man gemme en dump af databasens struktur i versionskontrolsystemet (herefter kaldet VCS)<\/p>\n<p><\/p>\n<ol>\n<li>Hvordan kan man spore \u00e6ndringer i databasens struktur efter gemme dumpen<\/li>\n<li>Hvordan kan man overf\u00f8re \u00e6ndringer i databasens struktur til andre milj\u00f8er uden konflikter og enorme migrationsfiler<\/li>\n<li>Hvordan kan man sikre en parallel arbejdsproces for flere udviklere p\u00e5 projektet<\/li>\n<li>Hvordan kan man sikkert deploye et st\u00f8rre antal \u00e6ndringer i databasens struktur til produktionsmilj\u00f8et<\/li>\n<li>SchemaKeeper<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<blockquote><p><strong>er designet til at arbejde med lagrede procedurer skrevet i<\/strong> PL\/pgSQL <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/plpgsql.html\">. Testning med andre sprog er ikke foretaget, s\u00e5 brugen kan muligvis ikke v\u00e6re s\u00e5 effektiv eller umulig.<\/a><\/noindex>Hvordan skal man gemme en dump af databasens struktur i VCS\n<\/p><\/blockquote>\n<\/li>\n<\/ol>\n<p><\/p>\n<h2 id=\"v-kakom-vide-hranit-damp-struktury-bd-v-vcs\">giver funktionen<\/h2>\n<p><\/p>\n<p>Bibliotek <noindex><a rel=\"nofollow\" href=\"https:\/\/packagist.org\/packages\/schema-keeper\/schema-keeper\">schema-keeper<\/a><\/noindex> saveDump <code>, som gemmer strukturen af alle objekter fra databasen som separate tekstfiler. Outputtet er et bibliotek, der indeholder databasens struktur opdelt i grupperede filer, som let kan tilf\u00f8jes til VCS.<\/code>Lad os se p\u00e5 transformationsprocessen af objekter fra databasen til filer med flere eksempler:<\/p>\n<p><\/p>\n<p>Objekttype<\/p>\n<p><\/p>\n<p>Relativ sti til filen<br \/>\nDiagram<br \/>\nNavn<br \/>\nTabel<\/p>\n<p>accounts<br \/>\npublic<br \/>\n.\/public\/tables\/accounts.txt<br \/>\n<code>Lagret procedure<\/code><\/p>\n<p>auth(hash bigint)<br \/>\npublic<br \/>\n.\/public\/functions\/auth(int8).sql<br \/>\n<code>Visning<\/code><\/p>\n<p>booking<br \/>\ntariffs<br \/>\n.\/booking\/views\/tariffs.txt<br \/>\n<code>Indholdet af filerne er en tekstlig repr\u00e6sentation af strukturen for det specifikke databaseobjekt. For eksempel vil indholdet af filen for lagrede procedurer v\u00e6re den fuldst\u00e6ndige definition, der starter med blokken<\/code><\/p>\n<p><\/p>\n<p>CREATE OR REPLACE FUNCTION <code>Som det fremg\u00e5r af tabellen ovenfor, indeholder stien til filen information om typen, skemaet og navnet p\u00e5 objektet. Denne tilgang letter navigeringen i dumpet og code review af \u00e6ndringer i databasen.<\/code>.<\/p>\n<p><\/p>\n<p>Udvidelse<\/p>\n<p><\/p>\n<blockquote><p>.sql <code>.sql<\/code> For files with the source code of stored procedures, it is selected so that the IDE automatically provides tools for interacting with the database when opening the file.<\/p><\/blockquote>\n<p><\/p>\n<h2 id=\"kak-otslezhivat-izmeneniya-v-strukture-bd-posle-sohraneniya-dampa\">Hvordan kan man overf\u00f8re \u00e6ndringer i databasens struktur til andre milj\u00f8er uden konflikter og enorme migrationsfiler<\/h2>\n<p><\/p>\n<p>By saving a dump of the current database structure in VCS, we gain the ability to check whether any changes were made to the structure of the database after the dump was created. In the library <noindex><a rel=\"nofollow\" href=\"https:\/\/packagist.org\/packages\/schema-keeper\/schema-keeper\">schema-keeper<\/a><\/noindex> to identify changes in the database structure, there is a function <code>verifyDump<\/code>, which returns information about the differences without side effects. <\/p>\n<p><\/p>\n<p>An alternative way to check is to call the function again, specifying the same directory, and check for changes in VCS. Since all objects from the database are saved in separate files, VCS will only show the changed objects. <code>, som gemmer strukturen af alle objekter fra databasen som separate tekstfiler. Outputtet er et bibliotek, der indeholder databasens struktur opdelt i grupperede filer, som let kan tilf\u00f8jes til VCS.<\/code>deployDump<br \/>\nThe main downside of this method is the need to overwrite files in order to see changes.<\/p>\n<p><\/p>\n<h2 id=\"kak-perenosit-izmeneniya-v-strukture-bd-na-drugie-okruzheniya-bez-konfliktov-i-gigantskih-faylov-migraciy\">Hvordan kan man sikre en parallel arbejdsproces for flere udviklere p\u00e5 projektet<\/h2>\n<p><\/p>\n<p>Takket v\u00e6re funktionen <code>The source code of stored procedures can be modified just like regular application source code. You can add\/remove new lines in the stored procedure code and immediately commit changes to the version control system, or create\/delete stored procedures by creating\/deleting the corresponding files in the dump directory.<\/code> For example, to create a new stored procedure in the schema <\/p>\n<p><\/p>\n<p>, it is sufficient to create a new file with the extension <code>public<\/code> in the directory <code>.sql<\/code> public\/functions <code>, place the source code of the stored procedure in it, including the block<\/code>, and then call the function <code>Som det fremg\u00e5r af tabellen ovenfor, indeholder stien til filen information om typen, skemaet og navnet p\u00e5 objektet. Denne tilgang letter navigeringen i dumpet og code review af \u00e6ndringer i databasen.<\/code>. Similarly, modification and deletion of stored procedures occur. Thus, the code is simultaneously sent to both VCS and the database. <code>The source code of stored procedures can be modified just like regular application source code. You can add\/remove new lines in the stored procedure code and immediately commit changes to the version control system, or create\/delete stored procedures by creating\/deleting the corresponding files in the dump directory.<\/code>If there is an error in the source code of any stored procedure, or a mismatch between the file name and the stored procedure name, then <\/p>\n<p><\/p>\n<p>will not execute, displaying the error message. Mismatches of stored procedures between the dump and the current database are not possible when using <code>The source code of stored procedures can be modified just like regular application source code. You can add\/remove new lines in the stored procedure code and immediately commit changes to the version control system, or create\/delete stored procedures by creating\/deleting the corresponding files in the dump directory.<\/code> When creating a new stored procedure, there is no need to manually enter the correct file name. It is enough for the file to have the extension <code>The source code of stored procedures can be modified just like regular application source code. You can add\/remove new lines in the stored procedure code and immediately commit changes to the version control system, or create\/delete stored procedures by creating\/deleting the corresponding files in the dump directory.<\/code>.<\/p>\n<p><\/p>\n<blockquote><p>. After calling <code>.sql<\/code>, the error message will contain the correct name that can be used to rename the file. <code>The source code of stored procedures can be modified just like regular application source code. You can add\/remove new lines in the stored procedure code and immediately commit changes to the version control system, or create\/delete stored procedures by creating\/deleting the corresponding files in the dump directory.<\/code> allows changing the function parameters or return type without additional actions, whereas with the classical approach, one would first have to<\/p><\/blockquote>\n<p><code>The source code of stored procedures can be modified just like regular application source code. You can add\/remove new lines in the stored procedure code and immediately commit changes to the version control system, or create\/delete stored procedures by creating\/deleting the corresponding files in the dump directory.<\/code> execute<br \/>\nDROP FUNCTION <code>, and only then.<\/code>, og f\u00f8rst derefter <code>Som det fremg\u00e5r af tabellen ovenfor, indeholder stien til filen information om typen, skemaet og navnet p\u00e5 objektet. Denne tilgang letter navigeringen i dumpet og code review af \u00e6ndringer i databasen.<\/code>.<\/p>\n<p><\/p>\n<p>Desv\u00e6rre er der nogle situationer, hvor <code>The source code of stored procedures can be modified just like regular application source code. You can add\/remove new lines in the stored procedure code and immediately commit changes to the version control system, or create\/delete stored procedures by creating\/deleting the corresponding files in the dump directory.<\/code> \u00e6ndringer ikke kan anvendes automatisk. For eksempel, hvis en triggerfunktion, der bruges af mindst \u00e9n trigger, slettes. S\u00e5danne situationer h\u00e5ndteres manuelt med migrationsfiler.<\/p>\n<p><\/p>\n<p>Hvis flytningen af \u00e6ndringerne i de gemte procedurer varetages af selve <noindex><a rel=\"nofollow\" href=\"https:\/\/packagist.org\/packages\/schema-keeper\/schema-keeper\">schema-keeper<\/a><\/noindex>, skal der bruges migrationsfiler til at overf\u00f8re de \u00f8vrige \u00e6ndringer i strukturen. For eksempel er et godt bibliotek til at arbejde med migrationer <noindex><a rel=\"nofollow\" href=\"https:\/\/packagist.org\/packages\/doctrine\/migrations\">doctrine\/migrations<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Migrationer skal anvendes inden <code>The source code of stored procedures can be modified just like regular application source code. You can add\/remove new lines in the stored procedure code and immediately commit changes to the version control system, or create\/delete stored procedures by creating\/deleting the corresponding files in the dump directory.<\/code>. Dette g\u00f8r det muligt at foretage alle \u00e6ndringer i strukturen og l\u00f8se problematiske situationer, s\u00e5 \u00e6ndringerne i de gemte procedurer kan flyttes uden problemer senere.<\/p>\n<p><\/p>\n<p>Arbejdet med migrationer vil blive beskrevet n\u00e6rmere i de f\u00f8lgende afsnit.<\/p>\n<p><\/p>\n<h2 id=\"kak-naladit-process-parallelnoy-raboty-nad-proektom-neskolkih-razrabotchikov\">Hvordan kan man sikkert deploye et st\u00f8rre antal \u00e6ndringer i databasens struktur til produktionsmilj\u00f8et<\/h2>\n<p><\/p>\n<p>Det er n\u00f8dvendigt at oprette et script til fuld initialisering af databasen, som vil blive k\u00f8rt af udvikleren p\u00e5 sin arbejdsstation, hvilket bringer strukturen af den lokale database i overensstemmelse med det gemte dump i VCS. Det er nemmest at opdele initialiseringen af den lokale database i 3 trin:<\/p>\n<p><\/p>\n<ol>\n<li>Import af en fil med den grundl\u00e6ggende struktur, som for eksempel vil blive kaldt <code>base.sql<\/code> <\/li>\n<li>Anvendelse af migrationer<\/li>\n<li>Kald <code>The source code of stored procedures can be modified just like regular application source code. You can add\/remove new lines in the stored procedure code and immediately commit changes to the version control system, or create\/delete stored procedures by creating\/deleting the corresponding files in the dump directory.<\/code><\/li>\n<\/ol>\n<p><\/p>\n<blockquote><p><code>base.sql<\/code> \u2014 dette er udgangspunktet, som migrationerne anvendes oven p\u00e5, og det udf\u00f8res <code>The source code of stored procedures can be modified just like regular application source code. You can add\/remove new lines in the stored procedure code and immediately commit changes to the version control system, or create\/delete stored procedures by creating\/deleting the corresponding files in the dump directory.<\/code>, alts\u00e5 <code>base.sql + migrationer + deployDump = aktuel database struktur<\/code>. En s\u00e5dan fil kan dannes ved hj\u00e6lp af v\u00e6rkt\u00f8jet <code>pg_dump<\/code>. Det bruges <code>base.sql<\/code> udelukkende ved initialisering af databasen fra bunden.<\/p><\/blockquote>\n<p>Lad os kalde scriptet til fuld initialisering af databasen <code>refresh.sh<\/code>. Arbejdsprocessen kan se s\u00e5ledes ud:<\/p>\n<p><\/p>\n<ol>\n<li>Udvikleren k\u00f8rer i sit milj\u00f8 <code>refresh.sh<\/code> og f\u00e5r den aktuelle database struktur<\/li>\n<li>Udvikleren begynder at arbejde p\u00e5 den tildelte opgave, idet han tilpasser den lokale database til behovene for den nye funktionalitet (<code>ALTER TABLE ... ADD COLUMN<\/code> osv.)<\/li>\n<li>Efter opgavens afslutning kalder udvikleren funktionen <code>, som gemmer strukturen af alle objekter fra databasen som separate tekstfiler. Outputtet er et bibliotek, der indeholder databasens struktur opdelt i grupperede filer, som let kan tilf\u00f8jes til VCS.<\/code>, for at registrere \u00e6ndringerne, der er foretaget i databasen, i VCS<\/li>\n<li>Udvikleren k\u00f8rer igen <code>refresh.sh<\/code>, og derefter <code>verifyDump<\/code>, som nu viser en liste over \u00e6ndringer, der skal inkluderes i migrationen<\/li>\n<li>Udvikleren overf\u00f8rer alle struktur\u00e6ndringer til migrationsfilen, k\u00f8rer igen <code>refresh.sh<\/code> og <code>verifyDump<\/code>, og hvis migrationen er sammensat korrekt, <code>verifyDump<\/code> vil den vise, at der ikke er nogen forskelle mellem den lokale database og det gemte dump.<\/li>\n<\/ol>\n<p><\/p>\n<p>Den beskrevne proces er kompatibel med gitflow-principperne. Hver gren i VCS vil indeholde sin version af dumpet, og n\u00e5r grene flettes, vil dumpene ogs\u00e5 blive flettet. I de fleste tilf\u00e6lde kr\u00e6ves der ikke yderligere handlinger efter fletningen, men hvis der er blevet foretaget \u00e6ndringer i forskellige grene, for eksempel i den samme tabel, kan der opst\u00e5 konflikter.<\/p>\n<p><\/p>\n<p>Lad os overveje en konfliktfyldt situation som et eksempel: der er en gren <em>develop<\/em>, fra hvilken to grene er afledt: <em>feature1<\/em> og <em>feature2<\/em>, som ikke har konflikter med <em>develop<\/em>, men som har konflikter med hinanden. Opgaven er at udf\u00f8re en sammenkobling af begge grene i <em>develop<\/em>. I dette tilf\u00e6lde anbefales det f\u00f8rst at udf\u00f8re fletningen af en af grenene til <em>develop<\/em>, og derefter fletningen af <em>develop<\/em> til den resterende gren, samtidig med at man l\u00f8ser konflikterne i den resterende gren, hvorefter den sidste gren kan flettes ind i <em>develop<\/em>. Under konfliktl\u00f8sningen kan det v\u00e6re n\u00f8dvendigt at rette migrationsfilen i den sidste gren, s\u00e5 den svarer til det endelige dump, der inkluderer resultaterne af sammenkoblingen.<\/p>\n<p><\/p>\n<h2 id=\"kak-bezopasno-deploit-bolshee-kolichestvo-izmeneniy-v-strukture-bd-na-production-okruzhenie\">SchemaKeeper<\/h2>\n<p><\/p>\n<p>Takket v\u00e6re tilg\u00e6ngeligheden af et dump af den aktuelle database-struktur i VCS opst\u00e5r muligheden for at kontrollere produktionsdatabasen for n\u00f8jagtig overensstemmelse med den kr\u00e6vede struktur. Dette garanterer, at alle \u00e6ndringer, som udviklerne havde til hensigt, er blevet overf\u00f8rt til produktionsdatabasen.<\/p>\n<p><\/p>\n<p>Da <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/ddl.html\">DDL<\/a><\/noindex> i PostgreSQL er <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.postgresql.org\/wiki\/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis\">transaktionel<\/a><\/noindex>, det anbefales at f\u00f8lge f\u00f8lgende r\u00e6kkef\u00f8lge for deployment, s\u00e5 man ved en uventet fejl kan udf\u00f8re en \"smertefri\" operation: <code>ROLLBACK<\/code>:<\/p>\n<p><\/p>\n<ol>\n<li>Start transaktionen<\/li>\n<li>Udf\u00f8r alle migrationer i transaktionen<\/li>\n<li>I den samme transaktion udf\u00f8r <code>The source code of stored procedures can be modified just like regular application source code. You can add\/remove new lines in the stored procedure code and immediately commit changes to the version control system, or create\/delete stored procedures by creating\/deleting the corresponding files in the dump directory.<\/code><\/li>\n<li>Uden at afslutte transaktionen, udf\u00f8r <code>verifyDump<\/code>. Hvis der ikke er fejl, udf\u00f8r <code>COMMIT<\/code>. Hvis der er fejl, udf\u00f8r <code>ROLLBACK<\/code><\/li>\n<\/ol>\n<p><\/p>\n<p>Disse trin kan let indarbejdes i eksisterende tilgange til deployment af applikationer, herunder zero-downtime.<\/p>\n<p><\/p>\n<h1 id=\"zaklyuchenie\">Konklusion<\/h1>\n<p><\/p>\n<p>Takket v\u00e6re de ovenfor beskrevne metoder kan man maksimere ydeevnen af \"PHP + PostgreSQL\" projekter, idet man ofrer en relativt lille m\u00e6ngde udviklingskomfort sammenlignet med implementeringen af al forretningslogik i applikationens hovedkode. Desuden virker databehandlingen i <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/plpgsql.html\">. Testning med andre sprog er ikke foretaget, s\u00e5 brugen kan muligvis ikke v\u00e6re s\u00e5 effektiv eller umulig.<\/a><\/noindex> ofte mere gennemsigtig og kr\u00e6ver mindre kode end den samme funktionalitet, der er skrevet i PHP.<\/p>\n<p>Kilde: <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\/da\/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=\"da_DK\" \/>\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\/da\/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\udd47Forretningslogik i databasen ved hj\u00e6lp af SchemaKeeper | ProHoster","description":"Form\u00e5let med denne artikel er at vise eksempler med biblioteket schema-keeper og de v\u00e6rkt\u00f8jer, der kan muligg\u00f8re betydelige forbedringer.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/biznes-logika-v-baze-dannyh-pri-pomoshhi-schemakeeper","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/31385","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=31385"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/31385\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=31385"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=31385"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=31385"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}