{"id":79465,"date":"2020-04-27T07:42:20","date_gmt":"2020-04-27T05:42:20","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/istina-prezhde-vsego-ili-pochemu-sistemu-nuzhno-proektirovat-ishodya-iz-ustrojstva-bazy-dannyh"},"modified":"2020-04-27T07:42:20","modified_gmt":"2020-04-27T05:42:20","slug":"istina-prezhde-vsego-ili-pochemu-sistemu-nuzhno-proektirovat-ishodya-iz-ustrojstva-bazy-dannyh","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/istina-prezhde-vsego-ili-pochemu-sistemu-nuzhno-proektirovat-ishodya-iz-ustrojstva-bazy-dannyh","title":{"rendered":"T\u00f5de on peamine, v\u00f5i miks s\u00fcsteemi tuleks projekteerida l\u00e4htudes andmebaasist","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Tere, Habr!<\/p>\n<p>Me j\u00e4tkame teema uurimist <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/all\/product\/sovremennyy-yazyk-java-lyambda-vyrazheniya-potoki-i-funktsionalnoe-programmirovanie\">Java<\/a><\/noindex> ja <noindex><a rel=\"nofollow\" href=\"https:\/\/storage.piter.com\/upload\/contents\/978544611587\/978544611587_X.pdf\">Spring<\/a><\/noindex>, sealhulgas andmebaaside tasandil. T\u00e4na pakume lugeda, miks suurte rakenduste projekteerimisel peaks andmebaasi struktuur, mitte Java kood, m\u00e4ngima m\u00e4\u00e4ravat rolli, kuidas seda teha ja millised erandid sellest reeglist on.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <br \/>\nSelles \u00fcsna hilises artiklis selgitan, miks arvan, et peaaegu k\u00f5igis juhtudel tuleks rakenduse andmemudelit projekteerida \u00abandmebaasist l\u00e4htudes\u00bb, mitte \u00abJava v\u00f5imalustest l\u00e4htudes\u00bb (v\u00f5i m\u00f5nest muust kliendi keelest, millega te t\u00f6\u00f6tate). Valides teise l\u00e4henemise, astud pika valude ja kannatuste teele, niipea kui su projekt hakkab kasvama.<\/p>\n<p>Artikkel on kirjutatud <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/50706556\/kotlin-with-jooq-and-write-table-models-manually-without-code-generation\">\u00fche k\u00fcsimuse<\/a><\/noindex>, mille esitasid Stack Overflow's.<\/p>\n<p>Huvitavad arutelud reddit'is osades <noindex><a rel=\"nofollow\" href=\"https:\/\/www.reddit.com\/r\/java\/comments\/8p0uj3\/truth_first_or_why_you_should_mostly_implement\/\">\/r\/java<\/a><\/noindex> ja <noindex><a rel=\"nofollow\" href=\"https:\/\/www.reddit.com\/r\/programming\/comments\/8p0qle\/truth_first_or_why_you_should_mostly_implement\/\">\/r\/programming<\/a><\/noindex>.<\/p>\n<h4>Koodigeneratsioon<\/h4>\n<p>\nOlin v\u00e4ga \u00fcllatunud, et on nii v\u00e4he kasutajaid, kes, tutvudes jOOQ-iga, kurdavad selle \u00fcle, et jOOQ puhul tuginedakse t\u00f5siselt koodigeneratsioonile. Keegi ei takista sind kasutamast jOOQ-d nii, nagu sa arvad olevat vajalik, ja ei sunni kasutama koodigeneerimist. Kuid vaikimisi (nagu on kirjeldatud juhendis) toimub jOOQ kasutamine nii: alustad (p\u00e4randatud) andmebaasi skeemist, teed selle tagasiprojekteerimise jOOQ koodigeneraatori abil, et saada klasside kogum, mis esindab sinu tabeleid, ja siis kirjutad t\u00fc\u00fcbikindlaid p\u00e4ringuid nende tabelite j\u00e4rgi:<\/p>\n<pre><code class=\"java\">\tfor (Record2 record : DSL.using(configuration)\n\/\/   ^^^^^^^^^^^^^^^^^^^^^^^ T\u00fc\u00fcpide teave on saadud\n\/\/   genereeritud koodi p\u00f5hjal, millele viitab allj\u00e4rgnev\n\/\/   SELECT tingimus\n \n       .select(ACTOR.FIRST_NAME, ACTOR.LAST_NAME)\n\/\/           vvvvv ^^^^^^^^^^^^  ^^^^^^^^^^^^^^^ genereeritud nimed\n       .from(ACTOR)\n       .orderBy(1, 2)) {\n    \/\/ ...\n}<\/code><\/pre>\n<p>\nKood genereeritakse kas k\u00e4sitsi v\u00e4ljaspool kogumist v\u00f5i k\u00e4sitsi iga kogumise k\u00e4igus. N\u00e4iteks v\u00f5ib selline regeneerimine toimuda kohe p\u00e4rast <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.jooq.org\/2014\/06\/25\/flyway-and-jooq-for-unbeatable-sql-development-productivity\/\">Flyway andmebaasi migreerimist, mida saab samuti teha k\u00e4sitsi v\u00f5i automaatselt.<\/a><\/noindex>.<\/p>\n<h4>Koodigeneratsioon<\/h4>\n<p>\nSelliste koodigeneratsiooni l\u00e4henemiste \u2013 nii manuaalsete kui automaatsete \u2013 taga on erinevad filosoofiad, eelised ja puudused, millest ma ei kavatse selle artikli raames pikalt r\u00e4\u00e4kida. Kuid \u00fcldiselt on genereeritud koodi tuum selles, et see v\u00f5imaldab Java-s esindada seda \u00abt\u00f5de\u00bb, mida me peame iseenesestm\u00f5istetavaks, kas meie s\u00fcsteemis v\u00f5i v\u00e4ljaspool seda. Teatud m\u00f5ttes teevad sama ka kompilaatorid, kes genereerivad vahelood, masinkoodi v\u00f5i m\u00f5nd muud koodi vormi, p\u00f5hinedes l\u00e4htekoodile \u2013 me saame esitluse meie \u00abt\u00f5est\u00bb teises keeles, s\u00f5ltumata konkreetsetest p\u00f5hjustest. <\/p>\n<p>Selliseid koodigeneraatoreid on palju. N\u00e4iteks <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/technotes\/tools\/unix\/xjc.html\">XJC v\u00f5ib genereerida Java koodi XSD v\u00f5i WSDL failide p\u00f5hjal.<\/a><\/noindex>Printsiip on alati sama:<\/p>\n<ul>\n<li>On olemas mingi t\u00f5de (sisemine v\u00f5i v\u00e4line) \u2013 n\u00e4iteks spetsifikatsioon, andmemudel jne.<\/li>\n<li>Me vajame selle t\u00f5e kohalikke esitlusi meie programmeerimiskeeles.<\/li>\n<\/ul>\n<p>\nPealegi on sellise esitluse genereerimine peaaegu alati m\u00f5istlik \u2013 et v\u00e4ltida liigset koormust.<\/p>\n<h4>T\u00fc\u00fcpide pakkujad ja annotatsioonide t\u00f6\u00f6tlemine<\/h4>\n<p>\nM\u00e4rkuseks: teine, kaasaegsem ja spetsiifilisem l\u00e4henemine jOOQ koodigeneratsioonile on seotud t\u00fc\u00fcbi pakkujate kasutamisega, <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/fsharp\/tutorials\/type-providers\/\">nagu need on rakendatud F#-is.<\/a><\/noindex>Sel juhul genereerib koodi kompilaator tegelikult kompileerimise k\u00e4igus. Sellist koodi l\u00e4htekoodina ei eksisteeri. Java-s on sarnased, kuigi mitte nii elegantne t\u00f6\u00f6riistad \u2013 need on annotatsiooniprotsessorid, n\u00e4iteks <noindex><a rel=\"nofollow\" href=\"https:\/\/projectlombok.org\">Lombok.<\/a><\/noindex>.<\/p>\n<p>Teatud m\u00f5ttes toimub siin sama, mis esimeses juhul, erandiga:<\/p>\n<ul>\n<li>Sa ei n\u00e4e genereeritud koodi (v\u00f5ib-olla tundub see kellelegi mitte nii heidutav?)<\/li>\n<li>Sa pead garanteerima, et t\u00fc\u00fcbid on k\u00e4ttesaadavad, st \u00abt\u00f5de\u00bb peab olema alati kergesti k\u00e4ttesaadav. See on lihtne juhul, kui Lombok, mis annotatsioonib \u00abt\u00f5e\u00bb. Veidi keerulisem on andmebaasi mudelitega, mille t\u00f6\u00f6 s\u00f5ltub pidevalt kergesti k\u00e4ttesaadava elava \u00fchenduse olemasolust.<\/li>\n<\/ul>\n<p><\/p>\n<h4>Mis probleem on koodigeneratsiooniga?<\/h4>\n<p>\nLisaks nutikale k\u00fcsimusele selle kohta, kas koodi genereerimist peaks korraldama k\u00e4sitsi v\u00f5i automaatselt, tuleb mainida ka, et on inimesi, kes usuvad, et koodi genereerimine ei ole vajalik. Selle vaate k\u00f5ige sagedasem p\u00f5hjendus, millega ma olen kokku puutunud, on, et siis on raske seadistada kogumise konveierit. Jah, t\u00f5epoolest, see on keeruline. Tekkivad t\u00e4iendavad infrastruktuuri kulud. Kui alles hakkate teatud tootega (olgu see jOOQ, JAXB, v\u00f5i Hibernate jne) t\u00f6\u00f6le, kulub aega, mille te tahaksite p\u00fchendada API \u00f5ppimisele, et hiljem sellest v\u00e4\u00e4rtust v\u00e4lja v\u00f5tta.<\/p>\n<p>Kui kulud, mis on seotud genereerija t\u00f6\u00f6 arusaamisega, on liiga suured, siis t\u00f5epoolest, on API-s halvasti t\u00f6\u00f6d tehtud koodi genereerimise kasutatavuse osas (ja hiljem selgub, et ka kasutaja seadistamine on keeruline). Kasutajas\u00f5bralikkus peaks olema igasuguste API-de k\u00f5rgeim prioriteet. Kuid see on vaid \u00fcks argument koodi genereerimise vastu. \u00dclej\u00e4\u00e4nud osas on t\u00e4ielikult k\u00e4sitsi kirjutada kohalik esitlus sisemisest v\u00f5i v\u00e4limisest t\u00f5est.<\/p>\n<p>Paljud \u00fctlevad, et neil ei ole aega sellega tegeleda. Neil on t\u00e4htajad oma Super-Toote osas. Kunagi hiljem ajame konveiere korda, j\u00f5uab. Ma vastan neile:<\/p>\n<p><img decoding=\"async\" alt=\"T\u00f5de on peamine, v\u00f5i miks s\u00fcsteemi tuleks projekteerida l\u00e4htudes andmebaasist\" src=\"\/wp-content\/uploads\/2020\/04\/cd9aca1e0365fa5af28cfc72c201cb8c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.flickr.com\/photos\/toddle_email_newsletters\/15596940251\/in\/photostream\/\">Originaal<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"http:\/\/audiencestack.com\/static\/blog.html\">Alan O&#8217;Rourke, Audience Stack<\/a><\/noindex> <\/p>\n<p><b>Aga Hibernate'i \/ JPA ei ole nii lihtne kirjutada koodi \"Java\" jaoks. <\/b><\/p>\n<p>T\u00f5epoolest. Hibernate'i jaoks on see samal ajal \u00f5nn ja needus. Hibernate'is saab lihtsalt kirjutada paar entiteeti, nagu n\u00e4iteks:<\/p>\n<pre><code class=\"java\">\t@Entity\nclass Book {\n  @Id\n  int id;\n  String title;\n}<\/code><\/pre>\n<p>\nJa peaaegu k\u00f5ik on valmis. N\u00fc\u00fcd on Hibernate'i \u00fclesanne genereerida keerulised \"detailid\" selle kohta, kuidas see entiteet m\u00e4\u00e4ratakse teie SQL \"dialekti\" DDL-is:<\/p>\n<pre><code class=\"sql\">\tCREATE TABLE book (\n  id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,\n  title VARCHAR(50),\n \n  CONSTRAINT pk_book PRIMARY KEY (id)\n);\n \nCREATE INDEX i_book_title ON book (title);<\/code><\/pre>\n<p>\n... ja hakkame rakendust k\u00e4ivitama. T\u00f5eliselt lahe v\u00f5imalus, et kiiresti t\u00f6\u00f6le asuda ja erinevaid asju proovida.<\/p>\n<p>Kuid oodake. Ma vale r\u00e4\u00e4kisin.<\/p>\n<ul>\n<li>Kas Hibernate rakendab t\u00f5epoolest selle nimetatud primaarv\u00f5tme m\u00e4\u00e4ratlust?<\/li>\n<li>Kas Hibernate loob indeksi TITLE-s? \u2013 ma tean kindlasti, et meil seda on vaja. <\/li>\n<li>Kas Hibernate t\u00f5epoolest muudab selle v\u00f5tme identifitseerivaks Identity Specificationis?<\/li>\n<\/ul>\n<p>\nT\u00f5en\u00e4oliselt mitte. Kui arendate oma projekti nullist, on alati mugav lihtsalt vana andmebaas k\u00f5rvale visata ja genereerida uus, niipea kui lisate vajalikud annotatsioonid. Seega muutub entiteet Book l\u00f5puks n\u00f5nda: <\/p>\n<pre><code class=\"java\">\t@Entity\n@Table(name = \"book\", indexes = {\n  @Index(name = \"i_book_title\", columnList = \"title\")\n})\nclass Book {\n  @Id\n  @GeneratedValue(strategy = IDENTITY)\n  int id;\n  String title;\n}\n<\/code><\/pre>\n<p>\nLahe. Generoida uuesti. Taaskord, sel juhul on alguses v\u00e4ga lihtne.<\/p>\n<h4>Kuid hiljem tuleb selle eest maksta.<\/h4>\n<p>\nVarem v\u00f5i hiljem peate minema tootmisse. Just siis lakkab see mudel toimimast. Sest: <\/p>\n<p>Tootmises ei saa vanast andmebaasist vajadusel loobuda ja k\u00f5ike puhtalt lehelt alustada. Teie andmebaas muutub p\u00e4randiks.<\/p>\n<p>N\u00fc\u00fcd ja igaveseks peate kirjutama <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.jooq.org\/2014\/06\/25\/flyway-and-jooq-for-unbeatable-sql-development-productivity\/\">DDL migratsiooniskeemid, n\u00e4iteks kasutades Flyway<\/a><\/noindex>. Mis siis juhtuma hakkab teie entiteetidega? Saate neid kas k\u00e4sitsi kohandada (ja seel\u00e4bi kahekordistada oma t\u00f6\u00f6mahtu) v\u00f5i k\u00e4skida Hibernate'il need uuesti genereerida (kui t\u00f5en\u00e4oliselt vastavad genereeritud entiteedid teie ootustele?) Igal juhul olete kaotaja.<\/p>\n<p>Seega, niipea kui te l\u00e4hete tootmisse, vajate kiireid plaastriteid. Ja neid tuleb tootmisse v\u00e4ga kiiresti anda. Kuna te ei ole ette valmistatud ja ei ole korraldanud oma migratsioonide sujuvat konveierimist, siis pat\u0161itakse k\u00f5ike tohutult. Ja p\u00e4rast te ei saa k\u00f5ike \u00f5igesti teha. Ja s\u00fc\u00fcdistate Hibernate'i, sest alati on s\u00fc\u00fcdi keegi teine, ainult mitte teie...<\/p>\n<p>Selle asemel oleks saanud alustada k\u00f5ike t\u00e4iesti teisiti. N\u00e4iteks v\u00f5ite paigaldada \u00fcmarad rattad jalgratta peale.<\/p>\n<h4>Esiteks andmebaas.<\/h4>\n<p>\nT\u00f5eline \"t\u00f5de\" teie andmebaasi skeemis ja \"suver\u00e4\u00e4nsus\" selle \u00fcle peitub andmebaasis. Skeem m\u00e4\u00e4ratakse ainult andmebaasis ja mitte kusagil mujal, ja igal kliendil on selle skeemi koopia, seega on t\u00e4iesti m\u00f5istlik rakendada skeemi ja selle terviklikkuse j\u00e4rgimist otse andmebaasis \u2013 seal, kus teave asub. <br \/>\nSee on vana, isegi kulunud tarkus. Primaar- ja unikaalsed v\u00f5tmed on head. V\u00e4lised v\u00f5tmed \u2013 head. Piirangute kontrollimine \u2013 hea. <noindex><a rel=\"nofollow\" href=\"https:\/\/community.oracle.com\/ideas\/13028\">Adekvaatsed v\u00e4ited<\/a><\/noindex> \u2013 on head. <\/p>\n<p>Kuid see pole veel k\u00f5ik. N\u00e4iteks, kui kasutate Oracle'i, t\u00f5en\u00e4oliselt soovite m\u00e4\u00e4rata:<\/p>\n<ul>\n<li>Millises tabeliruumis asub teie tabel <\/li>\n<li>Mis on selle PCTFREE v\u00e4\u00e4rtus <\/li>\n<li>Mis on teie j\u00e4rjestuse (ID j\u00e4rgi) vahem\u00e4lu suurus<\/li>\n<\/ul>\n<p>\nV\u00f5ib-olla ei ole see k\u00f5ik v\u00e4ikeses s\u00fcsteemis oluline, kuid ei pea ootama, kuni j\u00f5uate \u201esuuremate andmete\u201d valdkonda \u2014 saate varakult hakata l\u00f5ikama kasu andmesalvestuse optimeerimistest, nagu eespool mainitud. \u00dckski ORM, mida olen n\u00e4inud (sealhulgas jOOQ), ei paku juurdep\u00e4\u00e4su t\u00e4ielikule DDL valikule, mida v\u00f5ite oma andmebaasis kasutada. ORM-id pakuvad m\u00f5ningaid t\u00f6\u00f6riistu, mis aitavad kirjutada DDL-d.<\/p>\n<p>Aga l\u00f5puks on h\u00e4sti kavandatud skeem k\u00e4sitsi kirjutatud DDL-l. Iga genereeritud DDL on vaid selle ligikaudne versioon.<\/p>\n<h4>Ent mis teie kliendimudeli puhul?<\/h4>\n<p>\nNagu eespool mainitud, vajate kliendis koopia oma andmebaasi skeemist, klientide vaadet. \u00dcksikasjalikult \u00f6eldes, peab see klientide vaade olema s\u00fcnkroniseeritud tegeliku mudeliga. Kuidas seda k\u00f5ige paremini saavutada? Koode genereerimise abil.<\/p>\n<p>K\u00f5ik andmebaasid pakuvad oma metaandmeid SQL-i kaudu. Siin on, kuidas saada oma andmebaasist k\u00f5ik tabelid erinevates SQL-i dialektides:<\/p>\n<pre><code class=\"sql\">\t-- H2, HSQLDB, MySQL, PostgreSQL, SQL Server\nSELECT table_schema, table_name\nFROM information_schema.tables\n\n-- DB2\nSELECT tabschema, tabname\nFROM syscat.tables\n\n-- Oracle\nSELECT owner, table_name\nFROM all_tables\n\n-- SQLite\nSELECT name\nFROM sqlite_master\n\n-- Teradata\nSELECT databasename, tablename\nFROM dbc.tables\n<\/code><\/pre>\n<p>\nNeed p\u00e4ringud (v\u00f5i neile sarnased, s\u00f5ltuvalt sellest, kas tuleb arvestada ka vaateid, materialiseeritud vaateid, tabeliv\u00e4\u00e4rtusega funktsioone) saab samuti teostada <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.oracle.com\/javase\/10\/docs\/api\/java\/sql\/DatabaseMetaData.html#getTables(java.lang.String,java.lang.String,java.lang.String,java.lang.String%5B%5D)\"><code>DatabaseMetaData.getTables()<\/code><\/a><\/noindex> JDBC kaudu v\u00f5i jOOQ meta-moduli kaudu.<\/p>\n<p>Selliste p\u00e4ringute tulemustest on suhteliselt lihtne genereerida mis tahes kliendi vaade teie andmebaasi mudelist, s\u00f5ltumata sellest, millist tehnoloogiat kasutate oma kliendis.<\/p>\n<ul>\n<li>Kui kasutate JDBC-d v\u00f5i Springi, saate luua stringi konstantide komplekti. <\/li>\n<li>Kui kasutate JPA-d, saate genereerida ise entiteedid. <\/li>\n<li>Kui kasutate jOOQ-d, saate genereerida jOOQ meta-mudeli.<\/li>\n<\/ul>\n<p>\nS\u00f5ltuvalt teie kliendi API-st pakutavatest v\u00f5imalustest (nt jOOQ v\u00f5i JPA) v\u00f5ib genereeritud meta-mudel olla t\u00f5eliselt rikas ja t\u00e4ielik. V\u00f5tame n\u00e4iteks vaikimisi \u00fchendused, <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.jooq.org\/2018\/02\/20\/type-safe-implicit-join-through-path-navigation-in-jooq-3-11\/\">mis tuli jOOQ 3.11-sse<\/a><\/noindex>, mis toetub teie tabelite vahelise v\u00e4lisv\u00f5tme suhete genereeritud metaandmetele.<\/p>\n<p>N\u00fc\u00fcd toob iga andmebaasi valik automaatselt kaasa kliendi koodi v\u00e4rskendamise. Kujutage n\u00e4iteks ette:<\/p>\n<pre><code class=\"sql\">ALTER TABLE book RENAME COLUMN title TO book_title;<\/code><\/pre>\n<p>\nKas te t\u00f5eliselt soovite seda t\u00f6\u00f6d kaks korda teha? Absoluutselt mitte. Lihtsalt salvestame DDL-i, k\u00e4ivitame selle teie ehitustoru kaudu ja saame v\u00e4rskendatud entiteedi:<\/p>\n<pre><code class=\"java\">@Entity\n@Table(name = \"book\", indexes = {\n \n  \/\/ Olete m\u00f5elnud sellele?\n  @Index(name = \"i_book_title\", columnList = \"book_title\")\n})\nclass Book {\n  @Id\n  @GeneratedValue(strategy = IDENTITY)\n  int id;\n \n  @Column(\"book_title\")\n  String bookTitle;\n}<\/code><\/pre>\n<p>\nV\u00f5i v\u00e4rskendatud jOOQ klass. Suurem osa DDL muudatustest kajastuvad ka semantikas, mitte ainult s\u00fcntaksis. Seet\u00f5ttu on mugav vaadata kompileeritud koodi, milline kood v\u00f5ib olla (v\u00f5i on) m\u00f5jutatud teie andmebaasi kasvust.<\/p>\n<h4>Ainus t\u00f5de<\/h4>\n<p>\n\u00dcksk\u00f5ik, millist tehnoloogiat te kasutate, on alati olemas \u00fcks mudel, mis on mingi alams\u00fcsteemi ainus t\u00f5eallikas \u2013 v\u00f5i v\u00e4hemalt peaksime sellele p\u00fc\u00fcdlema ja v\u00e4ltima sellist ettev\u00f5tluse segadust, kus \"t\u00f5de\" on korraga igal pool ja mitte kusagil. K\u00f5ik v\u00f5iks olla palju lihtsam. Kui te lihtsalt vahetate XML-faile m\u00f5ne muu s\u00fcsteemiga, kasutage lihtsalt XSD-d. Vaadake jOOQ meta-mudelit XML-vormingus:<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.jooq.org\/xsd\/jooq-meta-3.10.0.xsd\">https:\/\/www.jooq.org\/xsd\/jooq-meta-3.10.0.xsd<\/a><\/noindex><\/p>\n<ul>\n<li>XSD on h\u00e4sti arusaadav<\/li>\n<li>XSD t\u00e4histab XML-i sisu v\u00e4ga h\u00e4sti ja v\u00f5imaldab valideerimist k\u00f5igis kliendi keeltes <\/li>\n<li>XSD-l on hea versioonimisel ja v\u00e4lja arendatud tagurpidi \u00fchilduvus <\/li>\n<li>XSD-d saab Java koodi teisendada XJC abil<\/li>\n<\/ul>\n<p>\nViimane punkt on oluline. Suheldes v\u00e4lise s\u00fcsteemiga XML-s\u00f5numite kaudu, tahame me olla kindlad, et meie s\u00f5numid on kehtivad. Seda on v\u00e4ga lihtne saavutada, kasutades JAXB, XJC ja XSD. Oleks t\u00e4ielik hullumeelsus loota, et Java-p\u00f5hise projekteerimise l\u00e4henemise korral, kus me loome meie s\u00f5numid Java objektide kujul, oleks neid v\u00f5imalik kuidagi \u00f5igesti XML-ile kaardistada ja saata teise s\u00fcsteemi tarbimiseks. Selliselt genereeritud XML oleks v\u00e4ga madala kvaliteediga, dokumenteerimata ja seda oleks raske arendada. Kui sellistele liidesele oleks olemas teenuse kvaliteedi leping (SLA), siis rikuksime me selle kohe \u00e4ra.<\/p>\n<p>Ausalt \u00f6eldes juhtub see pidevalt JSON API-dega, aga see on juba teine lugu, j\u00e4rgmisel korral r\u00e4\u00e4gin\u2026 <\/p>\n<h4>Andmebaasid: see on k\u00f5ik sama.<\/h4>\n<p>\nT\u00f6\u00f6tades andmebaasidega, m\u00f5istate, et need on k\u00f5ik p\u00f5him\u00f5tteliselt sarnased. Andmebaas omab oma andmeid ja peab haldama skeemi. S\u00fcsteemi muutmised peavad olema rakendatud otse DDL-le, et v\u00e4rskendada ainsat t\u00f5e allikat.<\/p>\n<p>Kui allika uuendamine on toimunud, peavad k\u00f5ik kliendid samuti v\u00e4rskendama oma versioone mudelist. M\u00f5ned kliendid v\u00f5ivad olla kirjutatud Java-s, kasutades jOOQ-d ja Hibernate-i v\u00f5i JDBC-d (v\u00f5i k\u00f5ike koos). Teised kliendid v\u00f5ivad olla kirjutatud Perl-is (soovin neile edu), kolmandad \u2013 C#-is. See ei ole oluline. Peamine mudel asub andmebaasis. ORM-iga genereeritud mudelid on tavaliselt halva kvaliteediga, halvasti dokumenteeritud ja neid on raske arendada.<\/p>\n<p>Seega \u00e4rge tehke vigu. \u00c4rge tehke vigu algusest peale. T\u00f6\u00f6delge andmebaasist l\u00e4htuvalt. Looge selline juurutamisprotsess, mida on v\u00f5imalik automatiseerida. Lisage koodigeneraatorid, et oleks mugav kopeerida oma andmebaasi mudelit ja edastada see klientidele. Ja l\u00f5petage koodigeneraatorite p\u00e4rast muretsemine. Need on head. Nende abil saate t\u00f5husamaks. Tuleb lihtsalt alguses natuke aega nende seadistamiseks kulutada \u2013 ja teie ees ootavad aastaid suurenenud tootlikkust, millest hargneb teie projekti lugu.<\/p>\n<p>\u00c4rge t\u00e4nage veel, hiljem.<\/p>\n<h4>Selgitus<\/h4>\n<p>\nSelguse huvides: see artikkel ei propageeri mingil juhul, et kogu s\u00fcsteem tuleks \u00fcles ehitada andmebaasi mudeli kohaselt (st, aineala, \u00e4ri loogika jne). Selle artikli m\u00f5te on, et kliendi kood, mis suhtleb andmebaasiga, peaks toimima andmebaasi mudelist l\u00e4htuvalt, nii et see ei peegeldaks andmebaasi mudelit 'esmaklassilisena'. Selline loogika asub tavaliselt andmebaasi juurde p\u00e4\u00e4semise tasemel teie kliendil.<\/p>\n<p>Kaheetapilistes arhitektuurides, mis on veel m\u00f5nes kohas alles, v\u00f5ib selline s\u00fcsteemi mudel olla ainus v\u00f5imalik. Kuid enamikus s\u00fcsteemides tundub, et andme juurde p\u00e4\u00e4semise tase on 'alam s\u00fcsteem', mis kapseldab andmebaasi mudelit.<\/p>\n<h4>Erandid<\/h4>\n<p>\nIga reegli kohta on erandeid, ja ma olen juba \u00f6elnud, et andmebaasi esmasuse ja l\u00e4htekoodi genereerimise l\u00e4henemine v\u00f5ib m\u00f5nikord osutuda sobimatuks. Siin on paar sellist erandit (v\u00f5imalik, et leidub ka teisi):<\/p>\n<ul>\n<li>Kui skeem on teadmata ja seda tuleb avada. N\u00e4iteks, kui olete t\u00f6\u00f6riistade pakkuja, mis aitab kasutajatel igasugustes skeemides orienteeruda. Uff. Siin ilma koodigeneratsioonita l\u00e4bi ei saa. Aga siiski \u2013 andmebaas on esikohal.<\/li>\n<li>Kui skeem tuleb genereerida jooksvalt teatud \u00fclesande t\u00e4itmiseks. See n\u00e4ide tundub olema veidi keeruline versioon mustrist <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity%E2%80%93attribute%E2%80%93value_model\">entity attribute value<\/a><\/noindex>, st teil pole tegelikult selgelt m\u00e4\u00e4ratletud skeemi. Sellisel juhul ei saa sageli olla kindel, kas RDBMS teile sobib.<\/li>\n<\/ul>\n<p>\nErandid on oma olemuselt erandlikud. Enamikus RDBMS-t seotud juhtumites on skeem eelnevalt teada, see on RDBMS-is ja on ainus 't\u00f5e' allikas ning k\u00f5ik kliendid peavad hankima oma versioonid, mis on sellest derivaadid. Ideaalis tuleks kasutada koodigeneraatorit.<br \/>\n<br \/>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/piter\/blog\/498816\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043c\u0443 Java \u0438 Spring, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435, \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u043d\u0435 \u043a\u043e\u0434 Java, \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u043c\u0435\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f, \u0438 \u043a\u0430\u043a\u0438\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0435\u0441\u0442\u044c \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430. \u0412 \u044d\u0442\u043e\u0439 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u043e\u0437\u0434\u0430\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043e\u0431\u044a\u044f\u0441\u043d\u044e, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":79466,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-79465","post","type-post","status-publish","format-standard","has-post-thumbnail","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=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043c\u0443 Java \u0438 Spring, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435, \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u043d\u0435 \u043a\u043e\u0434 Java, \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u043c\u0435\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f, \u0438 \u043a\u0430\u043a\u0438\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0435\u0441\u0442\u044c \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430. \u0412 \u044d\u0442\u043e\u0439 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u043e\u0437\u0434\u0430\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043e\u0431\u044a\u044f\u0441\u043d\u044e,\" \/>\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\/istina-prezhde-vsego-ili-pochemu-sistemu-nuzhno-proektirovat-ishodya-iz-ustrojstva-bazy-dannyh\" \/>\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\u0418\u0441\u0442\u0438\u043d\u0430 \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u0438\u043b\u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043c\u0443 Java \u0438 Spring, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435, \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u043d\u0435 \u043a\u043e\u0434 Java, \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u043c\u0435\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f, \u0438 \u043a\u0430\u043a\u0438\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0435\u0441\u0442\u044c \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430. \u0412 \u044d\u0442\u043e\u0439 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u043e\u0437\u0434\u0430\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043e\u0431\u044a\u044f\u0441\u043d\u044e,\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/istina-prezhde-vsego-ili-pochemu-sistemu-nuzhno-proektirovat-ishodya-iz-ustrojstva-bazy-dannyh\" \/>\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=\"2020-04-27T05:42:20+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-04-27T05:42:20+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\udd47T\u00f5de k\u00f5igepealt, v\u00f5i miks s\u00fcsteem tuleks projekteerida, l\u00e4htudes andmebaasi struktuurist | ProHoster","description":"Tere, Habr! Me j\u00e4tkame Java ja Spring teema uurimist, sealhulgas andmebaasi tasandil. T\u00e4na pakume lugeda, miks suurte rakenduste projekteerimisel peaks olema m\u00e4\u00e4rav andmebaasi struktuur, mitte Java kood, kuidas seda tehakse ja millised erandid selle reegli rikka on. Selles \u00fcsna hilises artiklis selgitan ma,","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/istina-prezhde-vsego-ili-pochemu-sistemu-nuzhno-proektirovat-ishodya-iz-ustrojstva-bazy-dannyh","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\u0418\u0441\u0442\u0438\u043d\u0430 \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u0438\u043b\u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043c\u0443 Java \u0438 Spring, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435, \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u043d\u0435 \u043a\u043e\u0434 Java, \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u043c\u0435\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f, \u0438 \u043a\u0430\u043a\u0438\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0435\u0441\u0442\u044c \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430. \u0412 \u044d\u0442\u043e\u0439 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u043e\u0437\u0434\u0430\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043e\u0431\u044a\u044f\u0441\u043d\u044e,","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/istina-prezhde-vsego-ili-pochemu-sistemu-nuzhno-proektirovat-ishodya-iz-ustrojstva-bazy-dannyh","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":"2020-04-27T05:42:20+00:00","article:modified_time":"2020-04-27T05:42:20+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"79465","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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:37:24","updated":"2022-09-29 16:13:15"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/79465","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=79465"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/79465\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/79466"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=79465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=79465"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=79465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}