{"id":83649,"date":"2020-06-02T07:42:21","date_gmt":"2020-06-02T05:42:21","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/database-as-sode-experience"},"modified":"2020-06-02T07:42:21","modified_gmt":"2020-06-02T05:42:21","slug":"database-as-sode-experience","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/database-as-sode-experience","title":{"rendered":"P\u00ebrvoja \u00abDatabase as Code\u00bb","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"P\u00ebrvoja \u00abDatabase as Code\u00bb\" src=\"\/wp-content\/uploads\/2020\/06\/a1ac23deeded97559fbe787ed09184a5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>SQL \u2014 \u00e7far\u00eb mund t\u00eb jet\u00eb m\u00eb e thjesht\u00eb? Secili prej nesh mund t\u00eb shkruaj\u00eb nj\u00eb query t\u00eb thjesht\u00eb \u2014 shkruajm\u00eb <strong><em>select<\/em><\/strong>, rendisim kolonat e nevojshme, pastaj <strong><em>from<\/em><\/strong>, emrin e tabel\u00ebs, pak kushte te <strong><em>ku<\/em><\/strong> dhe kaq \u2014 t\u00eb dh\u00ebnat e dobishme i kemi n\u00eb xhep, thuajse pavar\u00ebsisht se cila DBMS fshihet pas sken\u00ebs n\u00eb at\u00eb moment (madje ndoshta <noindex><a rel=\"nofollow\" href=\"https:\/\/osquery.io\/\">as nuk \u00ebsht\u00eb fare DBMS<\/a><\/noindex>). Si p\u00ebrfundim, puna me praktikisht \u00e7do burim t\u00eb dh\u00ebnash (relacional dhe jo shum\u00eb) mund t\u00eb shqyrtohet nga k\u00ebndv\u00ebshtrimi i kodit t\u00eb zakonsh\u00ebm (me t\u00eb gjitha pasojat \u2014 version control, code review, analiza statike, teste automatike dhe gjith\u00eb kjo gj\u00eb). Dhe kjo vlen jo vet\u00ebm p\u00ebr vet\u00eb t\u00eb dh\u00ebnat, skemat dhe migrimet, por p\u00ebr t\u00eb gjith\u00eb jet\u00ebn e depozit\u00ebs. N\u00eb k\u00ebt\u00eb artikull do t\u00eb flasim p\u00ebr detyrat dhe problemet e p\u00ebrditshme t\u00eb pun\u00ebs me baza t\u00eb ndryshme n\u00ebn objektivin e &quot;database as code&quot;.<\/p>\n<p><\/p>\n<p>Dhe do ta nisim pik\u00ebrisht me <noindex><a rel=\"nofollow\" href=\"https:\/\/www.yegor256.com\/2014\/12\/01\/orm-offensive-anti-pattern.html\">ORM<\/a><\/noindex>. Betejat e para t\u00eb tipit &quot;SQL vs ORM&quot; jan\u00eb v\u00ebn\u00eb re q\u00eb n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/www.sql.ru\/forum\/904343\/orm-vs-sql\">koh\u00eb shum\u00eb t\u00eb hershme<\/a><\/noindex>.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h5 id=\"obektno-relyacionnyy-maping\">Mapimi objekt-relacional<\/h5>\n<p><\/p>\n<p>Mb\u00ebshtet\u00ebsit e ORM tradicionalisht vler\u00ebsojn\u00eb shpejt\u00ebsin\u00eb dhe thjesht\u00ebsin\u00eb e zhvillimit, pavar\u00ebsin\u00eb nga DBMS dhe past\u00ebrtin\u00eb e kodit. P\u00ebr shum\u00eb prej nesh, kodi p\u00ebr pun\u00ebn me DB (dhe shpesh edhe vet\u00eb DB)<\/p>\n<p><\/p>\n<p>                        <b class=\"spoiler_title\">zakonisht duket p\u00ebraf\u00ebrsisht k\u00ebshtu\u2026<\/b><\/p>\n<pre><code class=\"java\">@Entity\n@Table(name = &quot;stock&quot;, catalog = &quot;maindb&quot;, uniqueConstraints = {\n        @UniqueConstraint(columnNames = &quot;STOCK_NAME&quot;),\n        @UniqueConstraint(columnNames = &quot;STOCK_CODE&quot;) })\npublic class Stock implements java.io.Serializable {\n\n    @Id\n    @GeneratedValue(strategy = IDENTITY)\n    @Column(name = &quot;STOCK_ID&quot;, unique = true, nullable = false)\n    public Integer getStockId() {\n        return this.stockId;\n    }\n  ...<\/code><\/pre>\n<p><\/p>\n<p>Modeli \u00ebsht\u00eb i mbushur me anotime inteligjente, nd\u00ebrsa diku prapa sken\u00ebs ORM-ja trim\u00ebrore gjeneron dhe ekzekuton tonelata kodi SQL. Meq\u00eb ra fjala, zhvilluesit p\u00ebrpiqen me t\u00eb gjitha forcat t\u00eb distancohen nga DB-ja e tyre p\u00ebrmes kilometrash abstraksionesh, gj\u00eb q\u00eb flet p\u00ebr nj\u00ebfar\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/www.sql.ru\/forum\/1303231\/prichiny-nenavisti-k-yazyku-sql\">&quot;SQL e urrejtjes&quot;<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Nga ana tjet\u00ebr e barricad\u00ebs, mb\u00ebshtet\u00ebsit e &quot;handmade&quot;-SQL-it v\u00ebn\u00eb n\u00eb dukje mund\u00ebsin\u00eb e shfryt\u00ebzimit t\u00eb plot\u00eb t\u00eb struktur\u00ebs s\u00eb tyre t\u00eb t\u00eb dh\u00ebnave pa shtresa dhe abstraksione t\u00eb tjera. Si pasoj\u00eb e k\u00ebsaj shfaqen projekte &quot;data-centric&quot;, ku baza merret me njer\u00ebz t\u00eb trajnuar posa\u00e7\u00ebrisht (ata quhen gjithashtu &quot;bazist\u00eb&quot;, &quot;bazovik\u00eb&quot;, &quot;bazd\u00ebnj\u00ebs&quot; etj.), nd\u00ebrsa zhvilluesit nuk kan\u00eb asgj\u00eb tjet\u00ebr ve\u00e7se t\u00eb q\u00ebndrojn\u00eb t\u00eb lidhur me pamjet dhe procedurat e ruajtura, pa hyr\u00eb n\u00eb detaje.<\/p>\n<p><\/p>\n<p>Po sikur t\u00eb marrim m\u00eb t\u00eb mir\u00ebn nga t\u00eb dy bot\u00ebt? Pik\u00ebrisht si\u00e7 \u00ebsht\u00eb b\u00ebr\u00eb n\u00eb mjetin e shk\u00eblqyer me emrin optimist <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krisajenkins\/yesql\">Yesql<\/a><\/noindex>. Do t\u00eb sjell disa rreshta nga koncepti i p\u00ebrgjithsh\u00ebm n\u00eb p\u00ebrkthimin tim t\u00eb lir\u00eb, nd\u00ebrsa me t\u00eb mund t\u00eb njiheni m\u00eb n\u00eb holl\u00ebsi <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krisajenkins\/yesql#rationale\">k\u00ebtu<\/a><\/noindex>.<\/p>\n<p><\/p>\n<blockquote><p>Clojure \u00ebsht\u00eb nj\u00eb gjuh\u00eb fantastike p\u00ebr t\u00eb krijuar DSL\u2019je, por SQL vet\u00eb \u00ebsht\u00eb nj\u00eb DSL i shk\u00eblqyer, dhe nuk na nevojitet nj\u00eb tjet\u00ebr. S-shprehjet jan\u00eb t\u00eb bukura, por k\u00ebtu nuk sjellin asgj\u00eb t\u00eb re. Rezultati \u00ebsht\u00eb se krijojm\u00eb kllapa p\u00ebr shkakun e kllapave. Nuk e pranon? At\u00ebher\u00eb presim momentin kur abstraksioni mbi baz\u00ebn do t\u00eb lejoj\u00eb rrjedhje, dhe do t\u00eb filloni luft\u00ebn me funksionin <em>(raw-sql)<\/em><\/p>\n<p>Dhe \u00e7far\u00eb t\u00eb b\u00ebjm\u00eb? Le ta l\u00ebm\u00eb SQL t\u00eb mbetet SQL i zakonsh\u00ebm \u2014 nj\u00eb skedar p\u00ebr \u00e7do k\u00ebrkes\u00eb:<\/p><\/blockquote>\n<p><\/p>\n<pre><code class=\"sql\">-- name: users-by-country\nselect *\n  from users\n where country_code = :country_code<\/code><\/pre>\n<p><\/p>\n<blockquote><p>\u2026 dhe m\u00eb pas lexoni k\u00ebt\u00eb skedar, duke e kthyer n\u00eb nj\u00eb funksion t\u00eb zakonsh\u00ebm Clojure:<\/p><\/blockquote>\n<p><\/p>\n<pre><code class=\"lisp\">(defqueries &quot;some\/where\/users_by_country.sql&quot;\n   {:connection db-spec})\n\n;;; Nj\u00eb funksion me emrin `users-by-country` \u00ebsht\u00eb krijuar.\n;;; Le ta p\u00ebrdorim:\n(users-by-country {:country_code &quot;GB&quot;})\n;=&gt; ({:name &quot;Kris&quot; :country_code &quot;GB&quot; ...} ...)<\/code><\/pre>\n<p><\/p>\n<blockquote><p>Duke e ndjekur parimin &quot;SQL ve\u00e7mas, Clojure ve\u00e7mas&quot;, ju merrni:<\/p>\n<ul>\n<li>Asnj\u00eb surpriz\u00eb sintaksore. Baza juaj e t\u00eb dh\u00ebnave (si \u00e7do tjet\u00ebr) nuk p\u00ebrputhet 100% me standardin SQL \u2014 por p\u00ebr Yesql kjo nuk ka r\u00ebnd\u00ebsi. Nuk do t\u00eb humbni kurr\u00eb koh\u00eb duke k\u00ebrkuar funksione me sintaks\u00eb ekuivalente me SQL. Nuk do t\u2019ju duhet kurr\u00eb t\u00eb ktheheni te funksioni <em>(raw-sql &quot;some (&#8216;funky&#8217; :: SYNTAX)&quot;))<\/em>.<\/li>\n<li>Mb\u00ebshtetje m\u00eb e mir\u00eb nga editori. Editori juaj tashm\u00eb ka mb\u00ebshtetje t\u00eb shk\u00eblqyer p\u00ebr SQL. Duke e ruajtur SQL-in si SQL, thjesht mund ta p\u00ebrdorni at\u00eb.<\/li>\n<li>P\u00ebrputhshm\u00ebri m\u00eb e mir\u00eb me ekipin. DBA-t\u00eb tuaj mund t\u00eb lexojn\u00eb dhe t\u00eb shkruajn\u00eb SQL-in q\u00eb p\u00ebrdorni n\u00eb projektin tuaj Clojure.<\/li>\n<li>Konfigurim m\u00eb i thjesht\u00eb i performanc\u00ebs. Duhet t\u00eb nd\u00ebrtoni planin p\u00ebr nj\u00eb k\u00ebrkes\u00eb problematike? Nuk \u00ebsht\u00eb problem, kur k\u00ebrkesa juaj \u00ebsht\u00eb SQL i zakonsh\u00ebm.<\/li>\n<li>Rip\u00ebrdorim i k\u00ebrkesave. Merrini k\u00ebta skedar\u00eb SQL dhe p\u00ebrdorini n\u00eb projekte t\u00eb tjera, sepse \u00ebsht\u00eb thjesht SQL i vjet\u00ebr i mir\u00eb \u2014 mjafton ta ndani.<\/li>\n<\/ul>\n<p>\n<\/p><\/blockquote>\n<p>Mendoj se ideja \u00ebsht\u00eb shum\u00eb e bukur dhe nj\u00ebkoh\u00ebsisht shum\u00eb e thjesht\u00eb, prandaj projekti ka fituar shum\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krisajenkins\/yesql#other-languages\">ndjek\u00ebsve<\/a><\/noindex> n\u00eb gjuh\u00eb nga m\u00eb t\u00eb ndryshmet. Nd\u00ebrsa m\u00eb tej do t\u00eb p\u00ebrpiqemi t\u00eb zbatojm\u00eb nj\u00eb filozofi t\u00eb ngjashme t\u00eb ndarjes s\u00eb kodit SQL nga gjith\u00e7ka tjet\u00ebr, shum\u00eb p\u00ebrtej ORM.<\/p>\n<p><\/p>\n<h5 id=\"ide--db-menedzhery\">IDE &amp; DB-menaxher\u00eb<\/h5>\n<p><\/p>\n<p>T\u00eb fillojm\u00eb me nj\u00eb detyr\u00eb t\u00eb thjesht\u00eb t\u00eb p\u00ebrditshme. Shpesh na duhet t\u00eb k\u00ebrkojm\u00eb objekte n\u00eb DB, p\u00ebr shembull, t\u00eb gjejm\u00eb nj\u00eb tabel\u00eb n\u00eb skem\u00eb dhe t\u00eb studiojm\u00eb struktur\u00ebn e saj (cilat jan\u00eb kolonat, \u00e7el\u00ebsat, indekset, kufizimet dhe t\u00eb tjera). Dhe nga \u00e7do IDE grafike ose menaxher DB i thjesht\u00eb, fillimisht presim sakt\u00ebsisht k\u00ebto aft\u00ebsi. Q\u00eb t\u00eb jet\u00eb e shpejt\u00eb dhe t\u00eb mos presim p\u00ebr gjysm\u00eb ore derisa dritarja me informacionin e nevojsh\u00ebm t\u00eb shfaqet (ve\u00e7an\u00ebrisht n\u00ebse lidhja me DB-n\u00eb e larg\u00ebt \u00ebsht\u00eb e ngadalshme), dhe gjithashtu q\u00eb informacioni t\u00eb jet\u00eb i fresk\u00ebt dhe aktual, e jo nj\u00eb arkeologji e vjet\u00ebr. Po aq m\u00eb kompleks dhe m\u00eb i madh \u00ebsht\u00eb DB dhe sa m\u00eb shum\u00eb jan\u00eb, aq m\u00eb e v\u00ebshtir\u00eb \u00ebsht\u00eb kjo.<\/p>\n<p><\/p>\n<p>Por zakonisht un\u00eb hedh miun e anash dhe thjesht shkruaj kod. Le t\u00eb themi, nevojitet t\u00eb dihet se cilat tabela (dhe me cilat veti) p\u00ebrmbahen n\u00eb skem\u00ebn \"HR\". N\u00eb shumic\u00ebn e DBMS-ve, rezultatet e k\u00ebrkuara mund t\u00eb arrihen me nj\u00eb pyetje t\u00eb till\u00eb t\u00eb thjesht\u00eb nga information_schema:<\/p>\n<p><\/p>\n<pre><code class=\"sql\">select table_name\n     , ...\n  from information_schema.tables\n where schema = 'HR'<\/code><\/pre>\n<p><\/p>\n<p>Nga nj\u00eb baz\u00eb te tjetra, p\u00ebrmbajtja e k\u00ebtyre tabelave referuese ndryshon n\u00eb var\u00ebsi t\u00eb mund\u00ebsive t\u00eb secilit DBMS. P\u00ebr shembull, n\u00eb MySQL nga i nj\u00ebjti katalog mund t\u00eb merren parametrat e tabel\u00ebs specifik\u00eb p\u00ebr k\u00ebt\u00eb DBMS:<\/p>\n<p><\/p>\n<pre><code class=\"sql\">select table_name\n     , storage_engine -- Motorin e p\u00ebrdorur (\"MyISAM\", \"InnoDB\" etj)\n     , row_format     -- Formati i rreshtit (\"Fixed\", \"Dynamic\" etj)\n     , ...\n  from information_schema.tables\n where schema = 'HR'<\/code><\/pre>\n<p><\/p>\n<p>Oracle nuk e mb\u00ebshtet information_schema, por ka <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Oracle_metadata\">Oracle metadata<\/a><\/noindex>, ndaj nuk lindin probleme t\u00eb m\u00ebdha:<\/p>\n<p><\/p>\n<pre><code class=\"sql\">select table_name\n     , pct_free       -- Minimumi i hap\u00ebsir\u00ebs s\u00eb lir\u00eb n\u00eb bllokun e t\u00eb dh\u00ebnave (%)\n     , pct_used       -- Minimumi i hap\u00ebsir\u00ebs s\u00eb p\u00ebrdorur n\u00eb bllokun e t\u00eb dh\u00ebnave (%)\n     , last_analyzed  -- Data e mbledhjes s\u00eb fundit t\u00eb statistikave\n     , ...\n  from all_tables\n where owner = 'HR'<\/code><\/pre>\n<p><\/p>\n<p>As ClickHouse nuk b\u00ebn p\u00ebrjashtim:<\/p>\n<p><\/p>\n<pre><code class=\"sql\">select name\n     , engine -- Motorin e p\u00ebrdorur (\"MergeTree\", \"Dictionary\" etj)\n     , ...\n  from system.tables\n where database = 'HR'<\/code><\/pre>\n<p><\/p>\n<p>Nj\u00eb gj\u00eb t\u00eb ngjashme mund ta b\u00ebjm\u00eb edhe n\u00eb Cassandra (ku ka columnfamilies n\u00eb vend t\u00eb tabelave dhe keyspace'\u00eb n\u00eb vend t\u00eb skemave):<\/p>\n<p><\/p>\n<pre><code class=\"sql\">select columnfamily_name\n     , compaction_strategy_class  -- Strategjia e grumbullimit t\u00eb mbeturinave\n     , gc_grace_seconds           -- Koha e jet\u00ebs s\u00eb mbeturinave\n     , ...\n  from system.schema_columnfamilies\n where keyspace_name = 'HR'<\/code><\/pre>\n<p><\/p>\n<p>Edhe p\u00ebr shumic\u00ebn e DB-ve t\u00eb tjera mund t\u00eb krijohen query t\u00eb ngjashme (madje edhe Mongo ka <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/system-collections\/#%3Cdatabase%3E.system.namespaces\">koleksion t\u00eb posa\u00e7\u00ebm sistemor<\/a><\/noindex>, i cili p\u00ebrmban informacion p\u00ebr t\u00eb gjitha koleksionet n\u00eb sistem).<\/p>\n<p><\/p>\n<p>Natyrisht, n\u00eb k\u00ebt\u00eb m\u00ebnyr\u00eb mund t\u00eb marrim informacion jo vet\u00ebm p\u00ebr tabelat, por n\u00eb p\u00ebrgjith\u00ebsi p\u00ebr \u00e7do objekt. Her\u00eb pas here njer\u00ebz t\u00eb mir\u00eb ndajn\u00eb nj\u00eb kod t\u00eb till\u00eb p\u00ebr DB t\u00eb ndryshme, si\u00e7 \u00ebsht\u00eb n\u00eb serin\u00eb e artikujve n\u00eb Habr \"Funksionet p\u00ebr dokumentimin e bazave t\u00eb t\u00eb dh\u00ebnave PostgreSQL\" (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/post\/415575\">ib<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/post\/415897\">ben<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/post\/418597\">gim<\/a><\/noindex>). Natyrisht, mbajtja e gjith\u00eb k\u00ebsaj grumbulli t\u00eb k\u00ebrkesave n\u00eb mendje dhe vazhdimi i shkruarjes s\u00eb tyre \u00ebsht\u00eb \"nj\u00eb k\u00ebnaq\u00ebsi\" e till\u00eb, prandaj n\u00eb IDE-n\u00eb\/editorin tim t\u00eb preferuar kam nj\u00eb set t\u00eb p\u00ebrgatitur paraprakisht me snippet p\u00ebr k\u00ebrkesat q\u00eb p\u00ebrdoren shpesh, dhe mbetet vet\u00ebm t\u00eb futem emrat e objekteve n\u00eb shablon.<\/p>\n<p><\/p>\n<p>N\u00eb fund, kjo m\u00ebnyr\u00eb navigimi dhe k\u00ebrkimi t\u00eb objekteve \u00ebsht\u00eb shum\u00eb m\u00eb fleksib\u00ebl, kursen shum\u00eb koh\u00eb dhe ju lejon t\u00eb merrni pik\u00ebrisht at\u00eb informacion dhe n\u00eb at\u00eb form\u00eb q\u00eb ju nevojitet n\u00eb at\u00eb moment (si\u00e7 p\u00ebrshkruhet, p\u00ebr shembull, n\u00eb postimin <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/JetBrains\/blog\/342094\">\"Eksportimi i t\u00eb dh\u00ebnave nga DB n\u00eb \u00e7do format: \u00e7far\u00eb din\u00eb t\u00eb b\u00ebjn\u00eb IDE-t\u00eb n\u00eb \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u00ebn IntelliJ\"<\/a><\/noindex>).<\/p>\n<p><\/p>\n<h5 id=\"operacii-s-obektami\">Veprime me objektet<\/h5>\n<p><\/p>\n<p>Pasi kemi gjetur dhe shqyrtuar objektet e nevojshme, \u00ebsht\u00eb koha t\u00eb b\u00ebjm\u00eb me to di\u00e7ka t\u00eb dobishme. Natyrisht, pa i hequr duart nga tastiera.<\/p>\n<p><\/p>\n<p>Nuk \u00ebsht\u00eb sekret q\u00eb fshirja e thjesht\u00eb e nj\u00eb tabele do t\u00eb duket pothuajse nj\u00ebsoj n\u00eb pothuajse t\u00eb gjitha DB:<\/p>\n<p><\/p>\n<pre><code class=\"sql\">drop table hr.persons<\/code><\/pre>\n<p><\/p>\n<p>Krijimi i nj\u00eb tabele \u00ebsht\u00eb m\u00eb interesant. Praktikisht \u00e7do DBMS (p\u00ebrfshir\u00eb shum\u00eb NoSQL) n\u00eb nj\u00eb form\u00eb ose tjet\u00ebr di t\u00eb b\u00ebj\u00eb \"create table\", dhe pjesa kryesore e saj nuk do t\u00eb ndryshoj\u00eb shum\u00eb (emri, lista e kolonave, tipet e t\u00eb dh\u00ebnave), por detajet e tjera mund t\u00eb ndryshojn\u00eb ndjesh\u00ebm dhe varen nga struktura dhe mund\u00ebsit\u00eb e ve\u00e7anta t\u00eb secilit DBMS. Shembulli im i preferuar \u00ebsht\u00eb se vet\u00ebm \"BNF t\u00eb pastra\" t\u00eb sintaks\u00ebs \"create table\" jan\u00eb n\u00eb dokumentacionin Oracle. <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/19\/sqlrf\/sql-language-reference.pdf\">z\u00ebn\u00eb 31 faqe<\/a><\/noindex>. DBMS t\u00eb tjera kan\u00eb mund\u00ebsi m\u00eb modeste, por secila prej tyre gjithashtu ofron shum\u00eb ve\u00e7ori interesante dhe unike p\u00ebr krijimin e tabelave (<noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/sql-createtable.html\">postgres<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/create-table.html\">mysql<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.cockroachlabs.com\/docs\/stable\/create-table.html#expanded\">cockroach<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.datastax.com\/en\/cql\/3.3\/cql\/cql_reference\/cqlCreateTable.html\">cassandra<\/a><\/noindex>). \u00cbsht\u00eb e dyshimt\u00eb n\u00ebse ndonj\u00eb \"wizard\" grafik nga ndonj\u00eb IDE (sidomos nj\u00eb universale) do t\u00eb jet\u00eb n\u00eb gjendje t\u00eb mbuloj\u00eb plot\u00ebsisht t\u00eb gjitha k\u00ebto aft\u00ebsi, dhe n\u00ebse do t\u00eb mundet, do t\u00eb jet\u00eb nj\u00eb spektak\u00ebl jo p\u00ebr t\u00eb dob\u00ebtit. N\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb, nj\u00eb operator i shkruar si\u00e7 duhet dhe n\u00eb koh\u00eb <strong><em>create table<\/em><\/strong> e shkruar sakt\u00eb dhe n\u00eb koh\u00ebn e duhur do t\u2019ju lejoj\u00eb t\u2019i shfryt\u00ebzoni pa v\u00ebshtir\u00ebsi t\u00eb gjitha k\u00ebto, duke e b\u00ebr\u00eb ruajtjen dhe qasjen n\u00eb t\u00eb dh\u00ebnat tuaja t\u00eb besueshme, optimale dhe sa m\u00eb komode.<\/p>\n<p><\/p>\n<p>Po ashtu, shum\u00eb DBMS kan\u00eb tipe specifike objektesh q\u00eb mungojn\u00eb n\u00eb DBMS t\u00eb tjer\u00eb. Gjithashtu, mund t\u00eb kryejm\u00eb operacione jo vet\u00ebm mbi objektet e DB, por edhe mbi vet\u00eb DBMS-n\u00eb, p\u00ebr shembull \"t\u00eb vrasim\" nj\u00eb proces, t\u00eb \u00e7lirojm\u00eb ndonj\u00eb zon\u00eb kujtese, t\u00eb aktivizojm\u00eb gjurmimin, t\u00eb kalojm\u00eb n\u00eb modin \"read only\" dhe shum\u00eb t\u00eb tjera.<\/p>\n<p><\/p>\n<h5 id=\"a-teper-nemnogo-porisuem\">Dhe tani t\u00eb vizatojm\u00eb pak<\/h5>\n<p><\/p>\n<p>Nj\u00eb nga detyrat m\u00eb t\u00eb zakonshme \u00ebsht\u00eb t\u00eb nd\u00ebrtohet nj\u00eb diagram me objektet e DB, p\u00ebr t\u00eb par\u00eb n\u00eb nj\u00eb figur\u00eb t\u00eb bukur objektet dhe lidhjet midis tyre. Praktikisht \u00e7do IDE grafike, disa utilitar\u00eb \"command line\", mjete grafike t\u00eb specializuara dhe modelues ndajn\u00eb k\u00ebt\u00eb aft\u00ebsi. Atyre do t'u vizatohet di\u00e7ka \"ashtu si\u00e7 din\u00eb\", dhe pak mund t\u00eb ndikoni n\u00eb k\u00ebt\u00eb proces vet\u00ebm p\u00ebrmes disa parametrave n\u00eb skedarin e konfigurimit ose tick-boxeve n\u00eb nd\u00ebrfaqe.<\/p>\n<p><\/p>\n<p>Por kjo \u00e7\u00ebshtje mund t\u00eb zgjidhet shum\u00eb m\u00eb thjesht, m\u00eb fleksib\u00ebl dhe m\u00eb elegant, dhe sigurisht me ndihm\u00ebn e kodit. P\u00ebr nd\u00ebrtimin e diagrameve t\u00eb \u00e7do kompleksiteti kemi disa gjuh\u00eb t\u00eb specializuara markimi (DOT, GraphML etc), si dhe nj\u00eb gam\u00eb t\u00eb t\u00ebr\u00eb aplikacionesh (GraphViz, PlantUML, Mermaid), q\u00eb din\u00eb t\u00eb lexojn\u00eb k\u00ebto udh\u00ebzime dhe t\u2019i vizualizojn\u00eb n\u00eb formate t\u00eb ndryshme. Nd\u00ebrsa informacionin p\u00ebr objektet dhe lidhjet mes tyre tashm\u00eb e dim\u00eb si ta marrim.<\/p>\n<p><\/p>\n<p>Le t\u00eb japim nj\u00eb shembull t\u00eb shkurt\u00ebr se si mund t\u00eb dukej kjo, duke p\u00ebrdorur PlantUML dhe <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/316428\/\">baz\u00ebn demonstrative t\u00eb t\u00eb dh\u00ebnave p\u00ebr PostgreSQL<\/a><\/noindex> (majtas \u00ebsht\u00eb SQL-k\u00ebrkesa q\u00eb gjeneron udh\u00ebzimin e nevojsh\u00ebm p\u00ebr PlantUML, nd\u00ebrsa djathtas rezultati):<\/p>\n<p>\n<img decoding=\"async\" alt=\"P\u00ebrvoja \u00abDatabase as Code\u00bb\" src=\"\/wp-content\/uploads\/2020\/06\/c5cb2a138df1527abe47cbf8d695cb36.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<pre><code class=\"sql\">select '@startuml'||chr(10)||'hide methods'||chr(10)||'hide stereotypes' union all\nselect distinct ccu.table_name || ' --|&gt; ' ||\n       tc.table_name as val\n  from table_constraints as tc\n  join key_column_usage as kcu\n    on tc.constraint_name = kcu.constraint_name\n  join constraint_column_usage as ccu\n    on ccu.constraint_name = tc.constraint_name\n where tc.constraint_type = 'FOREIGN KEY'\n   and tc.table_name ~ '.*' union all\nselect '@enduml'<\/code><\/pre>\n<p><\/p>\n<p>Dhe n\u00ebse b\u00ebjm\u00eb pak m\u00eb shum\u00eb p\u00ebrpjekje, at\u00ebher\u00eb mbi baz\u00ebn e <noindex><a rel=\"nofollow\" href=\"https:\/\/gist.github.com\/QuantumGhost\/0955a45383a0b6c0bc24f9654b3cb561\">shabllonit ER p\u00ebr PlantUML<\/a><\/noindex> mund t\u00eb marrim di\u00e7ka shum\u00eb t\u00eb ngjashme me nj\u00eb diagram\u00eb t\u00eb v\u00ebrtet\u00eb ER:<\/p>\n<p><\/p>\n<p>                        <b class=\"spoiler_title\">Nj\u00eb SQL-k\u00ebrkes\u00eb paksa m\u00eb e nd\u00ebrlikuar<\/b><\/p>\n<pre><code class=\"sql\">-- Koka\nselect &#039;@startuml\n        !define Table(name,desc) class name as &quot;desc&quot; &lt;&lt; (T,#FFAAAA) &gt;&amp;gt;\n        !define primary_key(x) &lt;b&gt;x&lt;\/b&gt;\n        !define unique(x) &lt;color:green&gt;x&lt;\/color&gt;\n        !define not_null(x) &lt;u&gt;x&lt;\/u&gt;\n        hide methods\n        hide stereotypes&#039;\n union all\n-- Tabelat\nselect format(&#039;Table(%s, &quot;%s n informacion rreth %s&quot;) {&#039;||chr(10), table_name, table_name, table_name) ||\n       (select string_agg(column_name || &#039; &#039; || upper(udt_name), chr(10))\n          from information_schema.columns\n         where table_schema = &#039;public&#039;\n           and table_name = t.table_name) || chr(10) || &#039;}&#039;\n  from information_schema.tables t\n where table_schema = &#039;public&#039;\n union all\n-- Marr&euml;dh&euml;niet midis tabelave\nselect distinct ccu.table_name || &#039; &quot;1&quot; --&amp;gt; &quot;0..N&quot; &#039; || tc.table_name || format(&#039; : &quot;Nj&euml; %s mund t&euml; ket&euml; shum&euml; %s&quot;&#039;, ccu.table_name, tc.table_name)\n  from information_schema.table_constraints as tc\n  join information_schema.key_column_usage as kcu on tc.constraint_name = kcu.constraint_name\n  join information_schema.constraint_column_usage as ccu on ccu.constraint_name = tc.constraint_name\n where tc.constraint_type = &#039;FOREIGN KEY&#039;\n   and ccu.constraint_schema = &#039;public&#039;\n   and tc.table_name ~ &#039;.*&#039;\n union all\n-- Fundi\nselect &#039;@enduml&#039;<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"P\u00ebrvoja \u00abDatabase as Code\u00bb\" src=\"\/wp-content\/uploads\/2020\/06\/bd45420a4fd1bdfcf20cbe74a0638c7b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>N\u00ebse e shikoni me v\u00ebmendje, shum\u00eb mjete vizualizimi n\u00ebn kapak p\u00ebrdorin pik\u00ebrisht k\u00ebrkesa t\u00eb ngjashme. V\u00ebrtet, k\u00ebto k\u00ebrkesa zakonisht jan\u00eb thell\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pgmodeler\/pgmodeler\/blob\/9c615c0b0871df3cd649983ce61e802b0ff0137b\/schemas\/catalog\/table.sch\">\"t\u00eb mbrojtura\" n\u00eb kodin e aplikacionit vet\u00eb dhe jan\u00eb t\u00eb v\u00ebshtira p\u00ebr t'u kuptuar<\/a><\/noindex>, pa folur fare p\u00ebr ndonj\u00eb modifikim t\u00eb tyre.<\/p>\n<p><\/p>\n<h5 id=\"metriki-i-monitoring\">Metrikat dhe monitorimi<\/h5>\n<p><\/p>\n<p>T\u00eb kalojm\u00eb te nj\u00eb tem\u00eb tradicionalisht t\u00eb komplikuar \u2014 monitorimi i performanc\u00ebs s\u00eb DB. Do t\u00eb kujtoj nj\u00eb histori t\u00eb vog\u00ebl t\u00eb v\u00ebrtet\u00eb, t\u00eb treguar nga \"nj\u00eb mik i imi\". N\u00eb nj\u00eb projekt tjet\u00ebr kishte nj\u00eb DBA t\u00eb fuqish\u00ebm, dhe pak nga zhvilluesit e njihnin at\u00eb personalisht, madje nuk e kishin par\u00eb kurr\u00eb n\u00eb sy (ndon\u00ebse, sipas thashethemeve, ai punonte dikund n\u00eb zyr\u00ebn p\u00ebrball\u00eb). N\u00eb or\u00ebn \"X\", kur sistemi production i nj\u00eb retailer t\u00eb madh fillonte s\u00ebrish t\u00eb \"ndjehej keq\", ai heshtur d\u00ebrgonte screenshot-e t\u00eb grafik\u00ebve nga Oracle Enterprise Manager, ku me kujdes shfk\u00ebqente vendet kritike me nj\u00eb marker t\u00eb kuq p\u00ebr \"kuptim m\u00eb t\u00eb mir\u00eb\" (kjo, le t\u00eb themi, ndihmonte pak). Dhe k\u00ebshtu, sipas k\u00ebtij \"fotografi\", duhej t\u00eb sh\u00ebrohej. P\u00ebr m\u00eb tep\u00ebr, askush nuk kishte qasje n\u00eb Enterprise Manager-in e \u00e7muar (n\u00eb t\u00eb dy kuptimet e fjal\u00ebs), sepse sistemi \u00ebsht\u00eb i komplikuar dhe i shtrenjt\u00eb, kujdes: \"zhvilluesit mund t\u00eb gjejn\u00eb ndonj\u00eb problem dhe t\u00eb prishin gjith\u00e7ka\". Prandaj zhvilluesit, duke p\u00ebrdorur nj\u00eb qasje \"empirike\", gjenin vendin dhe shkakun e ngadal\u00ebsimeve dhe l\u00ebshonin nj\u00eb patch. N\u00ebse nj\u00eb let\u00ebr e frikshme nga DBA nuk vinte p\u00ebrs\u00ebri n\u00eb afat t\u00eb shkurt\u00ebr, t\u00eb gjith\u00eb me leht\u00ebsim hiqnin frym\u00ebn dhe ktheheshin n\u00eb detyrat e tyre aktuale (deri n\u00eb nj\u00eb Let\u00ebr t\u00eb re).<\/p>\n<p><\/p>\n<p>Por procesi i monitorimit mund t\u00eb duket m\u00eb i g\u00ebzuesh\u00ebm dhe miq\u00ebsor, dhe m\u00eb e r\u00ebnd\u00ebsishmja \u2014 i aksesuesh\u00ebm dhe i transparent p\u00ebr t\u00eb gjith\u00eb. T\u00eb pakt\u00ebn pjesa bazike e tij, si nj\u00eb shtes\u00eb n\u00eb sistemet kryesore t\u00eb monitorimit (t\u00eb cilat padyshim jan\u00eb t\u00eb dobishme dhe n\u00eb shum\u00eb raste t\u00eb paz\u00ebvend\u00ebsueshme). \u00c7do DBMS \u00ebsht\u00eb plot\u00ebsisht dhe pa asnj\u00eb pages\u00eb e gatshme p\u00ebr t\u00eb ndar\u00eb informacionin mbi gjendjen e saj aktuale dhe performanc\u00ebn. N\u00eb t\u00eb nj\u00ebjt\u00ebn Oracle DB \"t\u00eb tmerrshme\" pothuajse \u00e7do informacion mbi performanc\u00ebn mund t\u00eb merret nga pamjet sistemore, duke filluar nga proceset dhe sesionet dhe duke p\u00ebrfunduar me gjendjen e caches buffer (p\u00ebr shembull, <noindex><a rel=\"nofollow\" href=\"https:\/\/oracle-base.com\/dba\/scripts\">DBA Scripts<\/a><\/noindex>, seksioni \"Monitorimi\"). N\u00eb Postgresql gjithashtu ka nj\u00eb num\u00ebr t\u00eb madh pamjesh sistemore p\u00ebr <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/monitoring-stats.html\">monitorimin e pun\u00ebs s\u00eb DB<\/a><\/noindex>, n\u00eb ve\u00e7anti ato kaq t\u00eb paz\u00ebvend\u00ebsueshme n\u00eb p\u00ebrditshm\u00ebrin\u00eb e \u00e7do DBA-je, si <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/monitoring-stats.html#PG-STAT-ACTIVITY-VIEW\">pg_stat_activity<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/monitoring-stats.html#PG-STAT-DATABASE-VIEW\">pg_stat_database<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/monitoring-stats.html#PG-STAT-BGWRITER-VIEW\">pg_stat_bgwriter<\/a><\/noindex>. N\u00eb MySQL p\u00ebr k\u00ebt\u00eb q\u00ebllim ekziston madje nj\u00eb skem\u00eb e ve\u00e7ant\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/performance-schema-table-descriptions.html\">performance_schema<\/a><\/noindex>. Nd\u00ebrsa n\u00eb Mongo, <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/tutorial\/manage-the-database-profiler\/\">profileri<\/a><\/noindex> i integruar grumbullon t\u00eb dh\u00ebnat e performanc\u00ebs n\u00eb koleksionin sistemor <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/tutorial\/manage-the-database-profiler\/#view-profiler-data\">system.profile<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>K\u00ebshtu, duke p\u00ebrdorur nj\u00eb mjet p\u00ebr mbledhjen e metrikave (Telegraf, Metricbeat, Collectd) q\u00eb mund t\u00eb ekzekutoj\u00eb k\u00ebrkesa SQL t\u00eb personalizuara, nj\u00eb ruajtje p\u00ebr k\u00ebto metrika (InfluxDB, Elasticsearch, Timescaledb) dhe nj\u00eb mjet vizualizimi (Grafana, Kibana), mund t\u00eb krijoni nj\u00eb sistem monitorimi mjaft t\u00eb leht\u00eb dhe fleksib\u00ebl, i cili do t\u00eb integrohet ngusht\u00eb me metrika t\u00eb tjera t\u00eb p\u00ebrgjithshme t\u00eb sistemit (t\u00eb marra, p\u00ebr shembull, nga serveri i aplikacionit, nga OS etj.). P\u00ebr shembull, si \u00ebsht\u00eb b\u00ebr\u00eb te pgwatch2, ku p\u00ebrdoret kombinimi InfluxDB + Grafana dhe nj\u00eb grup k\u00ebrkesash ndaj pamjeve t\u00eb sistemit, t\u00eb cilave gjithashtu mund t'u <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/cybertec-postgresql\/pgwatch2#adding-metrics\">shtohen k\u00ebrkesa t\u00eb personalizuara<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h2 id=\"itogo\">P\u00ebrve\u00e7 k\u00ebsaj<\/h2>\n<p><\/p>\n<p>Dhe kjo \u00ebsht\u00eb vet\u00ebm nj\u00eb list\u00eb e p\u00ebraf\u00ebrt e asaj q\u00eb mund t\u00eb b\u00ebhet me baz\u00ebn ton\u00eb t\u00eb t\u00eb dh\u00ebnave p\u00ebrmes kodit t\u00eb zakonsh\u00ebm SQL. Jam i sigurt se mund t\u00eb gjenden edhe shum\u00eb p\u00ebrdorime t\u00eb tjera, shkruani n\u00eb komente. Nd\u00ebrsa p\u00ebr m\u00ebnyr\u00ebn se si (dhe m\u00eb e r\u00ebnd\u00ebsishmja pse) e gjith\u00eb kjo mund t\u00eb automatizohet dhe t\u00eb p\u00ebrfshihet n\u00eb pipeline-in tuaj CI\/CD, do t\u00eb flasim her\u00ebn tjet\u00ebr.<\/p>\n<p>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/426833\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>SQL, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0449\u0435? \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0430\u0441 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u2014 \u043d\u0430\u0431\u0438\u0440\u0430\u0435\u043c select, \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0438, \u0437\u0430\u0442\u0435\u043c from, \u0438\u043c\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u0432 where \u0438 \u0432\u0441\u0435 \u2014 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443 \u043d\u0430\u0441 \u0432 \u043a\u0430\u0440\u043c\u0430\u043d\u0435, \u043f\u0440\u0438\u0447\u0435\u043c (\u043f\u043e\u0447\u0442\u0438) \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0442\u043e\u0433\u043e \u043a\u0430\u043a\u0430\u044f \u0421\u0423\u0411\u0414 \u0432 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c (\u0430 \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435 \u0421\u0423\u0411\u0414 \u0432\u043e\u0432\u0441\u0435). \u0412 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":83650,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-83649","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"SQL, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0449\u0435?\" \/>\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\/database-as-sode-experience\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\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\u00abDatabase as \u0421ode\u00bb Experience | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"SQL, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0449\u0435?\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/database-as-sode-experience\" \/>\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-06-02T05:42:21+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-06-02T05:42:21+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\udd47P\u00ebrvoja \u00abDatabase as \u0421ode\u00bb | ProHoster","description":"SQL, \u00e7far\u00eb mund t\u00eb jet\u00eb m\u00eb e thjesht\u00eb?","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/database-as-sode-experience","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\u00abDatabase as \u0421ode\u00bb Experience | ProHoster","og:description":"SQL, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0449\u0435?","og:url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/database-as-sode-experience","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-06-02T05:42:21+00:00","article:modified_time":"2020-06-02T05:42:21+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"83649","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 15:13:28","updated":"2022-10-02 10:23:46","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/83649","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=83649"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/83649\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/83650"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=83649"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=83649"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=83649"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}