{"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\/sq\/blog\/administrirovanie\/istina-prezhde-vsego-ili-pochemu-sistemu-nuzhno-proektirovat-ishodya-iz-ustrojstva-bazy-dannyh","title":{"rendered":"E v\u00ebrteta mbi gjith\u00e7ka, ose pse sistemi duhet projektuar duke marr\u00eb parasysh nd\u00ebrtimin e baz\u00ebs s\u00eb t\u00eb dh\u00ebnave.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>P\u00ebrsh\u00ebndetje, Habr!<\/p>\n<p>Ne vazhdojm\u00eb t\u00eb eksplorojm\u00eb tem\u00ebn <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/all\/product\/sovremennyy-yazyk-java-lyambda-vyrazheniya-potoki-i-funktsionalnoe-programmirovanie\">Java<\/a><\/noindex> dhe <noindex><a rel=\"nofollow\" href=\"https:\/\/storage.piter.com\/upload\/contents\/978544611587\/978544611587_X.pdf\">Spring<\/a><\/noindex>, duke p\u00ebrfshir\u00eb, n\u00eb nivelin e bazave t\u00eb t\u00eb dh\u00ebnave. Sot ofrojm\u00eb t\u00eb lexoni p\u00ebrse, kur projektoni aplikacione t\u00eb m\u00ebdha, struktura e baz\u00ebs s\u00eb t\u00eb dh\u00ebnave duhet t\u00eb ket\u00eb r\u00ebndesi vendimtare, si funksionon kjo dhe cilat jan\u00eb p\u00ebrjashtimet nga ky rregull.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <br \/>\nN\u00eb k\u00ebt\u00eb artikull mjaft t\u00eb vonuar, do t\u00eb shpjegoj se p\u00ebrse e besoj se n\u00eb pothuajse t\u00eb gjitha rastet modeli i t\u00eb dh\u00ebnave n\u00eb nj\u00eb aplikacion duhet t\u00eb projektohet \u201cnga baza e t\u00eb dh\u00ebnave\u201d, jo \u201cnga mund\u00ebsit\u00eb e Java-s\u201d (ose ndonj\u00eb gjuhe tjet\u00ebr klienti me t\u00eb cil\u00ebn punoni). Duke zgjedhur qasjen e dyt\u00eb, ju hyni n\u00eb nj\u00eb rrug\u00eb t\u00eb gjat\u00eb dhimbjeje dhe vuajtjeje, sapo projekti juaj fillon t\u00eb rritet.<\/p>\n<p>Artikulli \u00ebsht\u00eb shkruar duke u mb\u00ebshtetur n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/50706556\/kotlin-with-jooq-and-write-table-models-manually-without-code-generation\">nj\u00eb pyetje<\/a><\/noindex>, e cila u b\u00eb n\u00eb Stack Overflow.<\/p>\n<p>Diskutime interesante n\u00eb reddit n\u00eb seksionet <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> dhe <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>Gjenerimi i kodit<\/h4>\n<p>\nSa shum\u00eb u befasova q\u00eb ekziston nj\u00eb grup i vog\u00ebl p\u00ebrdoruesish, t\u00eb cil\u00ebt, pasi u njoh\u00ebn me jOOQ, jan\u00eb t\u00eb habitur nga fakti se kur punoni me jOOQ, besoheni seriozisht n\u00eb gjenerimin e kodit burimor. Askush nuk ju pengon ta p\u00ebrdorni jOOQ ashtu si\u00e7 e konsideroni t\u00eb nevojshme, dhe askush nuk ju detyron t\u00eb p\u00ebrdorni gjenerimin e kodit. Por, si parazgjedhje (ashtu si\u00e7 p\u00ebrshkruhet n\u00eb manual), puna me jOOQ ndodh k\u00ebshtu: filloni me (nd\u00ebrprerjen) e skem\u00ebs s\u00eb baz\u00ebs s\u00eb t\u00eb dh\u00ebnave, b\u00ebni seksionin e saj si pasqyr\u00eb me ndihm\u00ebn e gjeneratorit t\u00eb kodit jOOQ, n\u00eb m\u00ebnyr\u00eb q\u00eb t\u00eb merrni nj\u00eb grup klasash q\u00eb p\u00ebrfaq\u00ebsojn\u00eb tabelat tuaja, dhe pastaj shkruani pyetje t\u00eb sigurta p\u00ebr k\u00ebto tabela:<\/p>\n<pre><code class=\"java\">\tfor (Record2 record : DSL.using(configuration)\n\/\/   ^^^^^^^^^^^^^^^^^^^^^^^ Informacioni p\u00ebr llojet \u00ebsht\u00eb nxjerr\u00eb\n\/\/   mbi baz\u00ebn e kodit t\u00eb gjeneruar, n\u00eb t\u00eb cilin i referohet kushti\n\/\/   SELECT\n\n       .select(ACTOR.FIRST_NAME, ACTOR.LAST_NAME)\n\/\/           vvvvv ^^^^^^^^^^^^  ^^^^^^^^^^^^^^^ emrat e gjeneruar\n       .from(ACTOR)\n       .orderBy(1, 2)) {\n    \/\/ ...\n}<\/code><\/pre>\n<p>\nKodi gjenerohet ose manualisht jasht\u00eb nd\u00ebrtimit, ose manualisht gjat\u00eb \u00e7do nd\u00ebrtimi. P\u00ebr shembull, nj\u00eb rregjenerim i till\u00eb mund t\u00eb ndodh\u00eb menj\u00ebher\u00eb pas <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.jooq.org\/2014\/06\/25\/flyway-and-jooq-for-unbeatable-sql-development-productivity\/\">migroms t\u00eb baz\u00ebs s\u00eb t\u00eb dh\u00ebnave Flyway, e cila gjithashtu mund t\u00eb realizohet manualisht ose automatikisht.<\/a><\/noindex>.<\/p>\n<h4>Gjenerimi i kodit burimor<\/h4>\n<p>\nMe k\u00ebto qasje p\u00ebr gjenerimin e kodit \u2013 manuale dhe automatike \u2013 lidhen filozofi t\u00eb ndryshme, p\u00ebrpar\u00ebsi dhe disavantazhe, t\u00eb cilat nuk kam nd\u00ebrmend t'i diskutoj n\u00eb detaje n\u00eb k\u00ebt\u00eb artikull. Por, p\u00ebr p\u00ebrgjith\u00ebsi, thelbi i kodit t\u00eb gjeneruar \u00ebsht\u00eb se ai lejon riprodhimin n\u00eb Java t\u00eb \u201ct\u00eb v\u00ebrtet\u00ebs\u201d q\u00eb e pranojm\u00eb si t\u00eb dh\u00ebn\u00eb, qoft\u00eb brenda sistemit ton\u00eb, apo jasht\u00eb saj. N\u00eb nj\u00eb far\u00eb kuptimi, t\u00eb nj\u00ebjt\u00ebn gj\u00eb b\u00ebjn\u00eb kompilator\u00ebt, q\u00eb gjenerojn\u00eb kod bajt, kod makine ose ndonj\u00eb lloj tjet\u00ebr kodi mbi baz\u00ebn e kodit burimor \u2013 marrim nj\u00eb p\u00ebrfaq\u00ebsim t\u00eb \u201ct\u00eb v\u00ebrtet\u00ebs\u201d son\u00eb n\u00eb nj\u00eb gjuh\u00eb tjet\u00ebr, pavar\u00ebsisht nga arsyet specifike. <\/p>\n<p>Ekzistojn\u00eb shum\u00eb gjenerues t\u00eb till\u00eb t\u00eb kodit. P\u00ebr shembull, <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/technotes\/tools\/unix\/xjc.html\">XJC mund t\u00eb gjeneroj\u00eb kod Java n\u00eb baz\u00eb t\u00eb skedave XSD ose WSDL.<\/a><\/noindex>Parimi \u00ebsht\u00eb gjithmon\u00eb i nj\u00ebjt\u00eb:<\/p>\n<ul>\n<li>Ekziston nj\u00eb e v\u00ebrtet\u00eb e caktuar (brenda apo jasht\u00eb) \u2013 p\u00ebr shembull, specifikimi, modeli i t\u00eb dh\u00ebnave, etj.<\/li>\n<li>Na nevojitet nj\u00eb p\u00ebrfaq\u00ebsim lokal i k\u00ebsaj t\u00eb v\u00ebrtete n\u00eb gjuh\u00ebn ton\u00eb t\u00eb programimit.<\/li>\n<\/ul>\n<p>\nDhe \u00ebsht\u00eb gjithmon\u00eb e arsyeshme t\u00eb gjenerohet nj\u00eb p\u00ebrfaq\u00ebsim i till\u00eb \u2013 p\u00ebr t\u00eb shmangur p\u00ebrs\u00ebritjen.<\/p>\n<h4>Ofruesit e llojeve dhe p\u00ebrpunimi i annotimeve<\/h4>\n<p>\nP\u00ebr t'u mbajtur mend: nj\u00eb qasje m\u00eb moderne dhe specifike p\u00ebr gjenerimin e kodit p\u00ebr jOOQ \u00ebsht\u00eb e lidhur me p\u00ebrdorimin e ofruesve t\u00eb llojeve, <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/fsharp\/tutorials\/type-providers\/\">n\u00eb formatin e saj si ajo \u00ebsht\u00eb implementuar n\u00eb F#.<\/a><\/noindex>N\u00eb k\u00ebt\u00eb rast, kodi gjenerohet nga kompilator, n\u00eb fakt n\u00eb faz\u00ebn e kompilimit. N\u00eb form\u00ebn e burimor\u00ebve, ky kod nuk ekziston n\u00eb parim. N\u00eb Java ekzistojn\u00eb mjete t\u00eb ngjashme, edhe pse ndoshta jo aq elegante \u2013 ato jan\u00eb procesor\u00ebt e annotimeve. p\u00ebr shembull, <noindex><a rel=\"nofollow\" href=\"https:\/\/projectlombok.org\">Lombok<\/a><\/noindex>.<\/p>\n<p>N\u00eb nj\u00eb far\u00eb kuptimi, k\u00ebtu ndodhin t\u00eb nj\u00ebjtat gj\u00ebra si n\u00eb rastin e par\u00eb, p\u00ebrve\u00e7se:<\/p>\n<ul>\n<li>Nuk e shihni kodin e gjeneruar (ndoshta kjo situat\u00eb dikujt i dukej jo aq e frikshme?)<\/li>\n<li>Duhet t\u00eb garantoni q\u00eb llojet mund t\u00eb ofrohen, dmth, \u201ce v\u00ebrteta\u201d duhet t\u00eb jet\u00eb gjithmon\u00eb e qasshme. Kjo \u00ebsht\u00eb e leht\u00eb n\u00eb rastin e Lombok, i cili annoton \u201ct\u00eb v\u00ebrtet\u00ebn\u201d. M\u00eb e v\u00ebshtir\u00eb me modelet e bazave t\u00eb t\u00eb dh\u00ebnave, puna e t\u00eb cilave varet nga nj\u00eb lidhje aktive dhe gjithmon\u00eb e disponueshme.<\/li>\n<\/ul>\n<p><\/p>\n<h4>Cila \u00ebsht\u00eb problemi me gjenerimin e kodit?<\/h4>\n<p>\nP\u00ebrve\u00e7 pyetjes se si \u00ebsht\u00eb m\u00eb mir\u00eb t\u00eb nisni gjenerimin e kodit \u2013 manualisht apo automatikisht, duhet t\u00eb p\u00ebrmendim edhe ata q\u00eb besojn\u00eb se gjenerimi i kodit nuk \u00ebsht\u00eb i nevojsh\u00ebm fare. Justifikimi m\u00eb i zakonsh\u00ebm p\u00ebr k\u00ebt\u00eb pik\u00ebpamje \u00ebsht\u00eb se e b\u00ebn t\u00eb v\u00ebshtir\u00eb konfigurimin e linj\u00ebs s\u00eb nd\u00ebrtimit. Po, \u00ebsht\u00eb me t\u00eb v\u00ebrtet\u00eb e v\u00ebshtir\u00eb. Kemi kosto t\u00eb shtes\u00eb infrastrukturore. N\u00ebse sapo keni filluar t\u00eb punoni me nj\u00eb produkt t\u00eb caktuar (qoft\u00eb jOOQ, JAXB, Hibernate, etj.), ju nevojitet koh\u00eb p\u00ebr t\u00eb vendosur mjedisin e pun\u00ebs, koh\u00eb q\u00eb do t\u00eb d\u00ebshironit ta shpenzonit p\u00ebr t\u00eb m\u00ebsuar API-n\u00eb, p\u00ebr t\u00eb nxjerr\u00eb pastaj vler\u00eb prej saj.<\/p>\n<p>N\u00ebse kostot p\u00ebr t\u00eb kuptuar funksionimin e gjeneratorit jan\u00eb tep\u00ebr t\u00eb m\u00ebdha \u2013 at\u00ebher\u00eb, me t\u00eb v\u00ebrtet\u00eb, API-ja ka b\u00ebr\u00eb pun\u00eb t\u00eb keqe n\u00eb p\u00ebrdorshm\u00ebrin\u00eb e gjeneratorit t\u00eb kodit (nd\u00ebrsa m\u00eb von\u00eb ndodh q\u00eb edhe konfigurimi i p\u00ebrdoruesit n\u00eb t\u00eb \u00ebsht\u00eb i v\u00ebshtir\u00eb). Leht\u00ebsia e p\u00ebrdorimit duhet t\u00eb jet\u00eb prioriteti m\u00eb i lart\u00eb p\u00ebr \u00e7do API t\u00eb till\u00eb. Por kjo \u00ebsht\u00eb vet\u00ebm nj\u00eb argument kund\u00ebr gjenerimit t\u00eb kodit. Pjesa tjet\u00ebr \u00ebsht\u00eb se absolutisht do t\u00eb duhet ta shkruani manualisht p\u00ebrfaq\u00ebsimin lokal t\u00eb s\u00eb v\u00ebrtet\u00ebs s\u00eb brendshme ose t\u00eb jashtme.<\/p>\n<p>Shum\u00eb do t\u00eb thon\u00eb se nuk kan\u00eb koh\u00eb p\u00ebr t\u00eb gjith\u00eb k\u00ebto pun\u00eb. Ata kan\u00eb afate t\u00eb ngushta n\u00eb Super-Produktin e tyre. Ndonj\u00ebher\u00eb m\u00eb von\u00eb do t\u2019i p\u00ebrmir\u00ebsojm\u00eb linjat e nd\u00ebrtimit, do t\u00eb na dal\u00eb. At\u00ebher\u00eb do t'u p\u00ebrgjigjem:<\/p>\n<p><img decoding=\"async\" alt=\"E v\u00ebrteta mbi gjith\u00e7ka, ose pse sistemi duhet projektuar duke marr\u00eb parasysh nd\u00ebrtimin e baz\u00ebs s\u00eb t\u00eb dh\u00ebnave.\" 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\/\">Origjinali<\/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>Por n\u00eb Hibernate\/JPA \u00ebsht\u00eb kaq e leht\u00eb t\u00eb shkruash kod \"p\u00ebr Java\". <\/b><\/p>\n<p>E v\u00ebrtet\u00eb. P\u00ebr Hibernate dhe p\u00ebrdoruesit e tij, kjo \u00ebsht\u00eb nj\u00ebher\u00ebsh nj\u00eb bekim dhe nj\u00eb mallkim. N\u00eb Hibernate mund t\u00eb shkruash leht\u00ebsisht disa entitete, k\u00ebshtu:<\/p>\n<pre><code class=\"java\">\t@Entity\nclass Book {\n  @Id\n  int id;\n  String title;\n}<\/code><\/pre>\n<p>\nDhe pothuajse gjith\u00e7ka \u00ebsht\u00eb gati. Tani, fokusi i Hibernate \u00ebsht\u00eb t\u00eb gjeneroj\u00eb detaje t\u00eb komplikuara se si do t\u00eb p\u00ebrcaktohet kjo entitet n\u00eb DDL t\u00eb SQL \u201cdialektit\u201d tuaj:<\/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\u2026 dhe fillojm\u00eb t\u00eb ekzekutojm\u00eb aplikacionin. Nj\u00eb mund\u00ebsi v\u00ebrtet e shk\u00eblqyer p\u00ebr t\u00eb filluar shpejt dhe p\u00ebr t\u00eb provuar gj\u00ebra t\u00eb ndryshme.<\/p>\n<p>Megjithat\u00eb, lejoni. Kam g\u00ebnjyer.<\/p>\n<ul>\n<li>A do t\u00eb aplikoj\u00eb v\u00ebrtet Hibernate p\u00ebrcaktimin e k\u00ebtij \u00e7el\u00ebsi primar t\u00eb em\u00ebruar?<\/li>\n<li>A do t\u00eb krijoj\u00eb Hibernate indeksin n\u00eb TITLE? \u2013 un\u00eb e di sakt\u00ebsisht, do ta kemi nevoj\u00eb. <\/li>\n<li>A do ta b\u00ebj\u00eb Hibernate k\u00ebt\u00eb \u00e7el\u00ebs identifikues n\u00eb Specifikimin Identity?<\/li>\n<\/ul>\n<p>\nMe siguri se jo. N\u00ebse po zhvilloni projektin tuaj nga zero, \u00ebsht\u00eb gjithmon\u00eb e leht\u00eb t\u00eb hiqni baz\u00ebn e t\u00eb dh\u00ebnave t\u00eb vjeter dhe t\u00eb gjeneroni nj\u00eb t\u00eb re, sa her\u00eb q\u00eb t\u00eb shtoni annotimet e nevojshme. K\u00ebshtu, entiteti Book n\u00eb fund do t\u00eb marr\u00eb k\u00ebt\u00eb pamje: <\/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>\nShk\u00eblqyer. Riperitni nga e para. Prap\u00eb, n\u00eb nj\u00eb rast t\u00eb till\u00eb do t\u00eb jet\u00eb shum\u00eb e leht\u00eb n\u00eb fillim.<\/p>\n<h4>Por m\u00eb von\u00eb do t\u00eb duhet t\u00eb paguani p\u00ebr k\u00ebt\u00eb.<\/h4>\n<p>\nHer\u00ebt ose von\u00eb do t\u00eb duhet t\u00eb kaloni n\u00eb prodhim. Pik\u00ebrisht at\u00ebher\u00eb nj\u00eb model i till\u00eb do t\u00eb ndaloj\u00eb s\u00eb funksionuari. Sepse: <\/p>\n<p>N\u00eb prodhim nuk do t\u00eb jeni n\u00eb gjendje t\u00eb hiqni baz\u00ebn e t\u00eb dh\u00ebnave t\u00eb vjeter dhe t\u00eb filloni gjith\u00e7ka nga e para. Baza juaj e t\u00eb dh\u00ebnave do t\u00eb b\u00ebhet e trash\u00ebguar.<\/p>\n<p>Q\u00eb nga tani e tutje do t\u00eb duhet t\u00eb shkruani <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.jooq.org\/2014\/06\/25\/flyway-and-jooq-for-unbeatable-sql-development-productivity\/\">skripta migrimi DDL, p.sh., me ndihm\u00ebn e Flyway<\/a><\/noindex>. E \u00e7far\u00eb do t\u00eb ndodh\u00eb n\u00eb k\u00ebt\u00eb rast me entitetet tuaja? Ju do t\u00eb mund t\u00eb adaptoni ato manualisht (dhe k\u00ebshtu do t\u00eb dyfishoni pun\u00ebn tuaj), ose do t'i thoni Hibernate t\u00eb gjeneroj\u00eb p\u00ebrs\u00ebri ato p\u00ebr ju (sa t\u00eb m\u00ebdha jan\u00eb shanset q\u00eb kjo gjenerat\u00eb t\u00eb p\u00ebrputhet me pritshm\u00ebrit\u00eb tuaja?) N\u00eb \u00e7do rast, ju humbni.<\/p>\n<p>Prandaj, sapo t\u00eb kaloni n\u00eb prodhim, do t'ju nevojiten patches t\u00eb nxehta. Dhe ato duhet t\u00eb ndodhin shpejt n\u00eb prodhim. P\u00ebrve\u00e7se nuk jeni p\u00ebrgatitur dhe nuk keni organizuar nj\u00eb rrjedh\u00eb t\u00eb qet\u00eb t\u00eb migrimeve tuaja p\u00ebr prodhim, do t\u00eb jeni t\u00eb ngarkuar me patching. Dhe pastaj do t\u00eb filloni t\u00eb mos arrini t\u00eb b\u00ebni gjith\u00e7ka si\u00e7 duhet. Dhe do ta faj\u00ebsoni Hibernate, sepse gjithmon\u00eb \u00ebsht\u00eb fajtor kushdo tjet\u00ebr, p\u00ebrve\u00e7 jush\u2026<\/p>\n<p>N\u00eb vend t\u00eb k\u00ebsaj, q\u00eb nga fillimi mund ta b\u00ebni gjith\u00e7ka ndryshe. P\u00ebr shembull, t\u00eb vendosni goma t\u00eb rrethit n\u00eb bi\u00e7iklet\u00eb.<\/p>\n<h4>Fillimisht baza e t\u00eb dh\u00ebnave<\/h4>\n<p>\nE v\u00ebrteta e v\u00ebrtet\u00eb e skem\u00ebs s\u00eb baz\u00ebs suaj t\u00eb t\u00eb dh\u00ebnave dhe \"sovraniteti\" mbi t\u00eb q\u00ebndron brenda baz\u00ebs s\u00eb t\u00eb dh\u00ebnave. Skema p\u00ebrcaktohet vet\u00ebm brenda baz\u00ebs s\u00eb t\u00eb dh\u00ebnave dhe asnj\u00ebvend tjet\u00ebr, dhe \u00e7do klient ka nj\u00eb kopje t\u00eb k\u00ebsaj skeme, k\u00ebshtu q\u00eb \u00ebsht\u00eb krejt\u00ebsisht e arsyeshme t\u00eb insistoni n\u00eb respektimin e skem\u00ebs dhe integritetit t\u00eb saj, ta b\u00ebni k\u00ebt\u00eb n\u00eb vet\u00eb baz\u00ebn e t\u00eb dh\u00ebnave \u2013 aty ku ruhet informacioni. <br \/>\nKjo \u00ebsht\u00eb nj\u00eb men\u00e7uri e vjet\u00ebr dhe e p\u00ebrdorur. \u00c7el\u00ebsat primar\u00eb dhe unik\u00eb jan\u00eb t\u00eb mir\u00eb. \u00c7el\u00ebsat e jasht\u00ebm \u2013 t\u00eb mir\u00eb. Kontrolli i kufizimeve \u2013 i mir\u00eb. <noindex><a rel=\"nofollow\" href=\"https:\/\/community.oracle.com\/ideas\/13028\">K\u00ebrkesat<\/a><\/noindex> \u2013 t\u00eb mir\u00eb. <\/p>\n<p>P\u00ebr m\u00eb tep\u00ebr, kjo nuk \u00ebsht\u00eb gjith\u00e7ka. P\u00ebr shembull, duke p\u00ebrdorur Oracle, ndoshta do t\u00eb d\u00ebshironit t\u00eb specifikoni:<\/p>\n<ul>\n<li>N\u00eb cilin hap\u00ebsir\u00eb tabelash ndodhet tabela juaj <\/li>\n<li>Cila \u00ebsht\u00eb vlera e saj PCTFREE <\/li>\n<li>Cili \u00ebsht\u00eb madh\u00ebsia e caches n\u00eb sekuenc\u00ebn tuaj (pas identifikuesit)<\/li>\n<\/ul>\n<p>\nMund t\u00eb mos jet\u00eb gjith\u00e7ka kaq e r\u00ebnd\u00ebsishme n\u00eb sistemet e vogla, por nuk \u00ebsht\u00eb e nevojshme t\u00eb prisni kalimin n\u00eb fush\u00ebn e \"t\u00eb dh\u00ebnave t\u00eb m\u00ebdha\" \u2014 mund t\u00eb filloni t\u00eb shfryt\u00ebzoni p\u00ebrfitimet e optimizimeve t\u00eb ruajtjes s\u00eb t\u00eb dh\u00ebnave q\u00eb ofrohen nga ofruesi shum\u00eb m\u00eb her\u00ebt, si ato t\u00eb p\u00ebrmendura m\u00eb sip\u00ebr. Asnj\u00eb nga ORM-t\u00eb q\u00eb kam par\u00eb (p\u00ebrfshir\u00eb jOOQ) nuk ofron qasje n\u00eb t\u00eb gjitha opsionet DDL q\u00eb mund t\u00eb d\u00ebshironi t\u00eb p\u00ebrdorni n\u00eb baz\u00ebn tuaj t\u00eb t\u00eb dh\u00ebnave. ORM-t\u00eb ofrojn\u00eb disa mjete q\u00eb ndihmojn\u00eb n\u00eb shkruarjen e DDL.<\/p>\n<p>Por, n\u00eb fund t\u00eb fundit, nj\u00eb skem\u00eb e mir\u00eb e dizajnuar \u00ebsht\u00eb shkruar manualisht n\u00eb DDL. \u00c7do DDL i gjeneruar \u00ebsht\u00eb vet\u00ebm nj\u00eb aproximim i saj.<\/p>\n<h4>\u00c7far\u00eb ndodh me modelin e klientit?<\/h4>\n<p>\nSi\u00e7 u p\u00ebrmend m\u00eb sip\u00ebr, n\u00eb klient do t'ju nevojitet nj\u00eb kopje e skem\u00ebs s\u00eb baz\u00ebs suaj t\u00eb t\u00eb dh\u00ebnave, nj\u00eb paraqitje klienti. Nuk \u00ebsht\u00eb e nevojshme t\u00eb p\u00ebrmendet q\u00eb kjo paraqitje klienti duhet t\u00eb jet\u00eb e sinkronizuar me modelin e v\u00ebrtet\u00eb. Si \u00ebsht\u00eb m\u00ebnyra m\u00eb e mir\u00eb p\u00ebr ta arritur at\u00eb? N\u00ebp\u00ebrmjet nj\u00eb gjeneruesi kod.<\/p>\n<p>T\u00eb gjitha bazat e t\u00eb dh\u00ebnave ofrojn\u00eb metainformacionin e tyre p\u00ebrmes SQL. Ja se si t\u00eb merrni t\u00eb gjitha tabelat nga baza juaj e t\u00eb dh\u00ebnave n\u00eb dialekte t\u00eb ndryshme SQL:<\/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>\nK\u00ebto pyetje (ose t\u00eb ngjashme, var\u00ebsisht nga n\u00ebse duhet gjithashtu t\u00eb llogariten paraqitjet, paraqitjet e materializuara, funksionet me vler\u00eb tabelare) gjithashtu ekzekutohen n\u00ebp\u00ebrmjet thirrjes <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> n\u00eb JDBC, apo n\u00ebp\u00ebrmjet modulit t\u00eb metainformacionit jOOQ.<\/p>\n<p>Nga rezultatet e k\u00ebtyre pyetjeve \u00ebsht\u00eb mjaft e leht\u00eb t\u00eb gjeneroni \u00e7do paraqitje klienti t\u00eb modelit t\u00eb baz\u00ebs suaj t\u00eb t\u00eb dh\u00ebnave, pavar\u00ebsisht nga teknologjia q\u00eb p\u00ebrdorni n\u00eb klient.<\/p>\n<ul>\n<li>N\u00ebse p\u00ebrdorni JDBC ose Spring, mund t\u00eb krijoni nj\u00eb set konstantash string <\/li>\n<li>N\u00ebse p\u00ebrdorni JPA, mund t\u00eb gjeneroni entitetet tuaja <\/li>\n<li>N\u00ebse p\u00ebrdorni jOOQ, mund t\u00eb gjeneroni metamodelin e jOOQ<\/li>\n<\/ul>\n<p>\nVar\u00ebsisht nga sasia e mund\u00ebsive q\u00eb ofron API juaj i klientit (p.sh. jOOQ ose JPA), metamodeli i gjeneruar mund t\u00eb jet\u00eb me t\u00eb v\u00ebrtet\u00eb i pasur dhe i plot\u00eb. Merrni, p\u00ebr shembull, mund\u00ebsin\u00eb e bashkimeve t\u00eb implicit q\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.jooq.org\/2018\/02\/20\/type-safe-implicit-join-through-path-navigation-in-jooq-3-11\/\">ka ardhur n\u00eb jOOQ 3.11<\/a><\/noindex>, e cila mb\u00ebshtetet n\u00eb metainformacionin e gjeneruar p\u00ebr marr\u00ebdh\u00ebniet e \u00e7el\u00ebsave t\u00eb jasht\u00ebm q\u00eb veprojn\u00eb midis tabelave tuaja.<\/p>\n<p>Tani \u00e7do rritje e baz\u00ebs s\u00eb t\u00eb dh\u00ebnave do t\u00eb \u00e7oj\u00eb automatikisht n\u00eb p\u00ebrdit\u00ebsimin e kodit t\u00eb klientit. Imagjinoni, p\u00ebr shembull:<\/p>\n<pre><code class=\"sql\">ALTER TABLE book RENAME COLUMN title TO book_title;<\/code><\/pre>\n<p>\nA do t\u00eb d\u00ebshironit v\u00ebrtet ta b\u00ebnit k\u00ebt\u00eb pun\u00eb dy her\u00eb? Aspak. Thjesht regjistrojeni DDL-n\u00eb, kalojeni p\u00ebrmes linj\u00ebs s\u00eb nd\u00ebrtimit dhe merrni entitetin e p\u00ebrdit\u00ebsuar:<\/p>\n<pre><code class=\"java\">@Entity\n@Table(name = \"book\", indexes = {\n \n  \/\/ A e keni menduar p\u00ebr k\u00ebt\u00eb?\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>\nOse klasa e p\u00ebrmir\u00ebsuar jOOQ. Shumica e ndryshimeve DDL gjithashtu reflektohen n\u00eb semantik\u00eb, jo vet\u00ebm n\u00eb sintaks\u00eb. Prandaj, ndonj\u00ebher\u00eb \u00ebsht\u00eb e dobishme t\u00eb shikoni n\u00eb kodin e kompiluar se cili kod do t\u00eb (ose mund t\u00eb) preket nga rritja e baz\u00ebs suaj t\u00eb t\u00eb dh\u00ebnave.<\/p>\n<h4>E v\u00ebrteta e vetme<\/h4>\n<p>\nPavar\u00ebsisht nga teknologjia q\u00eb p\u00ebrdorni, gjithmon\u00eb ka nj\u00eb model q\u00eb \u00ebsht\u00eb burimi i vet\u00ebm i v\u00ebrtet\u00eb i s\u00eb v\u00ebrtet\u00ebs p\u00ebr nj\u00eb n\u00ebn-sistem \u2013 ose, t\u00eb pakt\u00ebn, ne duhet t\u00eb p\u00ebrpiqemi p\u00ebr k\u00ebt\u00eb dhe t\u00eb shmangim at\u00eb ndotjen sip\u00ebrmarr\u00ebse, ku \"e v\u00ebrteta\" \u00ebsht\u00eb menj\u00ebher\u00eb kudo dhe askund. Gjith\u00e7ka mund t\u00eb jet\u00eb shum\u00eb m\u00eb e thjesht\u00eb. N\u00ebse thjesht shk\u00ebmbeni skedar\u00eb XML me ndonj\u00eb sistem tjet\u00ebr, thjesht p\u00ebrdorni XSD. Shikoni metamodelin e INFORMATION_SCHEMA nga jOOQ n\u00eb formatin XML:<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 \u00ebsht\u00eb e leht\u00eb p\u00ebr tu kuptuar<\/li>\n<li>XSD e ndan shum\u00eb mir\u00eb p\u00ebrmbajtjen XML dhe lejon validimin n\u00eb t\u00eb gjitha gjuh\u00ebt e klientit <\/li>\n<li>XSD ka versionim t\u00eb shk\u00eblqyer dhe ka nj\u00eb p\u00ebrputhshm\u00ebri t\u00eb zhvilluar me versionet e m\u00ebparshme <\/li>\n<li>XSD mund t\u00eb testohet n\u00eb kod Java duke p\u00ebrdorur XJC<\/li>\n<\/ul>\n<p>\nPika e fundit \u00ebsht\u00eb e r\u00ebnd\u00ebsishme. Kur komunikojm\u00eb me nj\u00eb sistem t\u00eb jasht\u00ebm p\u00ebrmes mesazheve XML, duam t\u00eb jemi t\u00eb sigurt p\u00ebr vlefshm\u00ebrin\u00eb e mesazheve tona. Kjo \u00ebsht\u00eb shum\u00eb e leht\u00eb t\u00eb arrihet duke p\u00ebrdorur JAXB, XJC dhe XSD. Do t\u00eb ishte nj\u00eb marr\u00ebzi t\u00eb mendojm\u00eb se, me qasjen e dizajnit \"Java si prioritet\", ku i b\u00ebjm\u00eb mesazhet tona n\u00eb form\u00ebn e objekteve Java, ato do t\u00eb mund t\u00eb shnd\u00ebrrohen n\u00eb XML dhe t\u00eb d\u00ebrgohen p\u00ebr konsum n\u00eb nj\u00eb sistem tjet\u00ebr. XML i gjeneruar n\u00eb k\u00ebt\u00eb m\u00ebnyr\u00eb do t\u00eb ishte me cil\u00ebsi t\u00eb dob\u00ebt, pa dokumentim, dhe e v\u00ebshtir\u00eb p\u00ebr t\u2019u zhvilluar. N\u00ebse do t\u00eb kishte nj\u00eb marr\u00ebveshje p\u00ebr nivelin e cil\u00ebsis\u00eb s\u00eb sh\u00ebrbimit (SLA) p\u00ebr k\u00ebt\u00eb nd\u00ebrfaqe, do ta kishim sabotuar menjeher\u00eb.<\/p>\n<p>Sinqerisht, kjo \u00ebsht\u00eb gjithmon\u00eb ajo q\u00eb ndodh me API-t\u00eb n\u00eb JSON, por kjo \u00ebsht\u00eb nj\u00eb tjet\u00ebr histori, her\u00ebn tjet\u00ebr do ta kritikoj\u2026 <\/p>\n<h4>Baza t\u00eb dh\u00ebnash: \u00ebsht\u00eb e nj\u00ebjta gj\u00eb<\/h4>\n<p>\nDuke punuar me baza t\u00eb dh\u00ebnash, kupton se t\u00eb gjitha ato, n\u00eb thelb, jan\u00eb t\u00eb ngjashme. Baza zot\u00ebron t\u00eb dh\u00ebnat e saj dhe duhet t\u00eb drejtoj\u00eb skem\u00ebn. \u00c7do modifikim q\u00eb b\u00ebhet n\u00eb skem\u00eb duhet t\u00eb realizohet drejtp\u00ebrdrejt n\u00eb DDL, n\u00eb m\u00ebnyr\u00eb q\u00eb t\u00eb p\u00ebrdit\u00ebsohet burimi i vet\u00ebm i s\u00eb v\u00ebrtet\u00ebs.<\/p>\n<p>Kur burimi \u00ebsht\u00eb p\u00ebrdit\u00ebsuar, t\u00eb gjitha klient\u00ebt gjithashtu duhet t\u00eb p\u00ebrdit\u00ebsojn\u00eb kopjet e tyre t\u00eb modelit. Disa klient\u00eb mund t\u00eb jen\u00eb shkruajtur n\u00eb Java duke p\u00ebrdorur jOOQ dhe Hibernate ose JDBC (ose t\u00eb gjitha nj\u00ebherazi). Klient\u00eb t\u00eb tjer\u00eb mund t\u00eb jen\u00eb shkruar n\u00eb Perl (t\u00eb gjith\u00eb vet\u00ebm mund t'u urojm\u00eb fat), t\u00eb tjer\u00eb \u2013 n\u00eb C#. Nuk ka r\u00ebnd\u00ebsi. Modeli kryesor ndodhet n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave. Modelet e gjeneruara me ORM jan\u00eb zakonisht t\u00eb dob\u00ebta, pa dokumentim t\u00eb mir\u00eb, dhe t\u00eb v\u00ebshtira p\u00ebr t'u zhvilluar.<\/p>\n<p>Prandaj, mos b\u00ebni gabime. Mos b\u00ebni gabime q\u00eb nga fillimi. Punoni duke u bazuar n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave. Nd\u00ebrtoni nj\u00eb pipeline deploye q\u00eb mund t\u00eb automatizohet. N\u00ebfshini gjenerator\u00ebt e kodit n\u00eb m\u00ebnyr\u00eb q\u00eb t\u00eb ishte e leht\u00eb t\u00eb kopjonit modelin e baz\u00ebs suaj t\u00eb t\u00eb dh\u00ebnave dhe ta d\u00ebrgoni at\u00eb te klient\u00ebt. Dhe ndaloni s\u00eb shqet\u00ebsuari p\u00ebr gjenerator\u00ebt e kodit. Ata jan\u00eb t\u00eb mir\u00eb. Me ta do t\u00eb b\u00ebheni m\u00eb produktiv\u00eb. Duhet vet\u00ebm t\u00eb shpenzoni pak koh\u00eb n\u00eb fillim p\u00ebr t'i konfiguruar ata \u2013 dhe m\u00eb pas ju presin vite produktiviteti t\u00eb rritur, nga t\u00eb cilat do t\u00eb krijohet historia e projektit tuaj.<\/p>\n<p>Mos m\u00eb falenderoni tani, m\u00eb von\u00eb.<\/p>\n<h4>Shpjegim<\/h4>\n<p>\nP\u00ebr qart\u00ebsi: Ky artikull nuk propagandon aspak q\u00eb modeli i baz\u00ebs suaj t\u00eb dh\u00ebnash duhet t\u00eb imponoj\u00eb gjith\u00eb sistemin (dmth., zon\u00ebn e subjektit, logjik\u00ebn e biznesit, etj.). N\u00eb k\u00ebt\u00eb artikull po flas se kodi i klientit, q\u00eb interakton me baz\u00ebn e t\u00eb dh\u00ebnave, duhet t\u00eb veproj\u00eb duke u nisur nga modeli i baz\u00ebs s\u00eb t\u00eb dh\u00ebnave, n\u00eb m\u00ebnyr\u00eb q\u00eb n\u00eb vet\u00eb t\u00eb mos riprodhoj modelin e baz\u00ebs s\u00eb t\u00eb dh\u00ebnave n\u00eb statusin e \"klas\u00ebs s\u00eb par\u00eb\". Nj\u00eb logjik\u00eb e till\u00eb zakonisht ndodhet n\u00eb nivelin e aksesit n\u00eb t\u00eb dh\u00ebna nga ana juaj n\u00eb klient.<\/p>\n<p>N\u00eb arkitekturat me dy nivele, q\u00eb kan\u00eb mbetur ende ndonj\u00ebher\u00eb, nj\u00eb model i till\u00eb sistemi mund t\u00eb jet\u00eb i vetmi i mundsh\u00ebm. Megjithat\u00eb, n\u00eb shumic\u00ebn e sistemeve niveli i aksesit n\u00eb t\u00eb dh\u00ebna m\u00eb duket si nj\u00eb \"n\u00ebn sistem\", q\u00eb inkapsulon modelin e baz\u00ebs s\u00eb t\u00eb dh\u00ebnave.<\/p>\n<h4>P\u00ebrjashtimet<\/h4>\n<p>\nNga \u00e7do rregull ka p\u00ebrjashtime, dhe kam th\u00ebn\u00eb m\u00eb par\u00eb se qasja me prioritet t\u00eb baz\u00ebs s\u00eb t\u00eb dh\u00ebnave dhe gjenerimin e kodit mund t\u00eb duket ndonj\u00ebher\u00eb e pap\u00ebrshtatshme. Ja disa p\u00ebrjashtime t\u00eb tilla (me siguri do t\u00eb ket\u00eb edhe t\u00eb tjera):<\/p>\n<ul>\n<li>Kur skema \u00ebsht\u00eb e panjohur, dhe duhet hapur. P\u00ebr shembull, jeni nj\u00eb ofrues mjeti, q\u00eb ndihmon p\u00ebrdoruesit t\u00eb orientohen n\u00eb \u00e7do skem\u00eb. Uf. K\u00ebtu nuk ka gjenerim kodi. Por prap\u00ebseprap\u00eb \u2013 baza e t\u00eb dh\u00ebnave \u00ebsht\u00eb e para.<\/li>\n<li>Kur skema duhet t\u00eb gjenerohet n\u00eb flutur p\u00ebr t\u00eb zgjidhur nj\u00eb detyr\u00eb t\u00eb caktuar. Ky shembull duket si nj\u00eb version paksa i \u00e7uditsh\u00ebm i modelit <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity%E2%80%93attribute%E2%80%93value_model\">entity attribute value<\/a><\/noindex>, dmth., n\u00eb t\u00eb v\u00ebrtet\u00eb nuk keni nj\u00eb skem\u00eb t\u00eb qart\u00eb t\u00eb p\u00ebrcaktuar. N\u00eb k\u00ebt\u00eb rast shpesh madje nuk \u00ebsht\u00eb e sigurt se do t'ju p\u00ebrshtatet nj\u00eb RDBMS.<\/li>\n<\/ul>\n<p>\nP\u00ebrjashtimet p\u00ebr natyr\u00ebn e tyre jan\u00eb p\u00ebrjashtuese. N\u00eb shumic\u00ebn e rasteve q\u00eb lidhen me p\u00ebrdorimin e RDBMS, skema \u00ebsht\u00eb e njohur paraprakisht, ajo ndodhet brenda RDBMS dhe \u00ebsht\u00eb burimi i vet\u00ebm i \"t\u00eb v\u00ebrtet\u00ebs\", dhe t\u00eb gjith\u00eb klient\u00ebt duhet t\u00eb fitojn\u00eb kopje t\u00eb saj, t\u00eb nxjerra prej saj. N\u00eb m\u00ebnyr\u00eb ideale, n\u00eb k\u00ebt\u00eb rast duhet p\u00ebrdorur nj\u00eb gjenerator kodi.<br \/>\n<br \/>Burimi: <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\/sq\/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=\"sq_AL\" \/>\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\/sq\/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\udd47E v\u00ebrteta \u00ebsht\u00eb mbi t\u00eb gjitha, ose pse sistemi duhet t\u00eb projektohet duke u bazuar n\u00eb struktur\u00ebn e baz\u00ebs s\u00eb t\u00eb dh\u00ebnave | ProHoster","description":"P\u00ebrsh\u00ebndetje, Habr! Ne vazhdojm\u00eb t\u00eb eksplorojm\u00eb tem\u00ebn e Java dhe Spring, duke p\u00ebrfshir\u00eb edhe nivelin e bazave t\u00eb t\u00eb dh\u00ebnave. Sot po ofrojm\u00eb t\u00eb lexoni p\u00ebrse, kur projektojm\u00eb aplikacione t\u00eb m\u00ebdha, struktura e baz\u00ebs s\u00eb t\u00eb dh\u00ebnave, dhe jo kodi Java, duhet t\u00eb ket\u00eb nj\u00eb r\u00ebnd\u00ebsi t\u00eb ve\u00e7ant\u00eb, si b\u00ebhet kjo dhe cilat p\u00ebrjashtime ekzistojn\u00eb nga ky rregull. N\u00eb k\u00ebt\u00eb artikull t\u00eb vonuar, do t\u00eb shpjegoj,","canonical_url":"https:\/\/prohoster.info\/sq\/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":"sq_AL","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\/sq\/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\/sq\/wp-json\/wp\/v2\/posts\/79465","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=79465"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/79465\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/79466"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=79465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=79465"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=79465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}