{"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\/hu\/blog\/administrirovanie\/database-as-sode-experience","title":{"rendered":"\u201eAdatb\u00e1zis mint K\u00f3d\u201d tapasztalat","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"\u201eAdatb\u00e1zis mint K\u00f3d\u201d tapasztalat\" src=\"\/wp-content\/uploads\/2020\/06\/a1ac23deeded97559fbe787ed09184a5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>SQL, mi lehetne egyszer\u0171bb? Mindannyian tudunk \u00edrni egy egyszer\u0171 lek\u00e9rdez\u00e9st \u2013 be\u00edrjuk <strong><em>select<\/em><\/strong>, felsoroljuk a sz\u00fcks\u00e9ges oszlopokat, majd <strong><em>a<\/em><\/strong>, a t\u00e1bl\u00e1zat nev\u00e9t, egy kis felt\u00e9teleket a <strong><em>where<\/em><\/strong> \u00e9s ennyi \u2013 a hasznos adatok a zseb\u00fcnkben vannak, r\u00e1ad\u00e1sul (szinte) f\u00fcggetlen\u00fcl att\u00f3l, hogy \u00e9ppen melyik DBMS m\u0171k\u00f6dik a h\u00e1tt\u00e9rben (vagy tal\u00e1n <noindex><a rel=\"nofollow\" href=\"https:\/\/osquery.io\/\">nem is DBMS<\/a><\/noindex>). Ennek eredm\u00e9nyek\u00e9nt szinte b\u00e1rmilyen adatforr\u00e1st (rel\u00e1ci\u00f3sat \u00e9s nem annyira) a szok\u00e1sos k\u00f3d szempontj\u00e1b\u00f3l lehet megk\u00f6zel\u00edteni (minden k\u00f6vetkezm\u00e9nnyel \u2013 verzi\u00f3kezel\u00e9s, k\u00f3dellen\u0151rz\u00e9s, statikus elemz\u00e9s, automatikus tesztek \u00e9s \u00edgy tov\u00e1bb). \u00c9s ez nemcsak az adatokra, s\u00e9m\u00e1kra \u00e9s migr\u00e1ci\u00f3kra vonatkozik, hanem a t\u00e1rol\u00f3 \u00e9let\u00e9nek minden aspektus\u00e1ra. Ebben a cikkben a \u201edatabase as code\u201d keretein bel\u00fcl a mindennapi feladatokr\u00f3l \u00e9s probl\u00e9m\u00e1kr\u00f3l fogunk besz\u00e9lni k\u00fcl\u00f6nb\u00f6z\u0151 adatb\u00e1zisokkal kapcsolatban.<\/p>\n<p><\/p>\n<p>\u00c9s kezdj\u00fcnk az <noindex><a rel=\"nofollow\" href=\"https:\/\/www.yegor256.com\/2014\/12\/01\/orm-offensive-anti-pattern.html\">ORM<\/a><\/noindex>. Az \u201eSQL vs ORM\u201d t\u00edpus\u00fa els\u0151 csat\u00e1k m\u00e1r kor\u00e1bban \u00e9szlelhet\u0151k voltak <noindex><a rel=\"nofollow\" href=\"https:\/\/www.sql.ru\/forum\/904343\/orm-vs-sql\">pre-Petrine Oroszorsz\u00e1gban<\/a><\/noindex>.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h5 id=\"obektno-relyacionnyy-maping\">Objektum-rel\u00e1ci\u00f3s lek\u00e9pez\u00e9s<\/h5>\n<p><\/p>\n<p>Az ORM h\u00edvei hagyom\u00e1nyosan \u00e9rt\u00e9kelik a fejleszt\u00e9s sebess\u00e9g\u00e9t \u00e9s egyszer\u0171s\u00e9g\u00e9t, a DBMS-f\u00fcggetlens\u00e9get \u00e9s a k\u00f3d tisztas\u00e1g\u00e1t. Sz\u00e1mosunk sz\u00e1m\u00e1ra a DB-vel val\u00f3 munka k\u00f3dja (\u00e9s sok esetben maga az adatb\u00e1zis is)<\/p>\n<p><\/p>\n<p>                        <b class=\"spoiler_title\">\u00e1ltal\u00e1ban \u00edgy n\u00e9z ki&#8230;<\/b><\/p>\n<pre><code class=\"java\">@Entity\n@Table(name = \"stock\", catalog = \"maindb\", uniqueConstraints = {\n        @UniqueConstraint(columnNames = \"STOCK_NAME\"),\n        @UniqueConstraint(columnNames = \"STOCK_CODE\") })\npublic class Stock implements java.io.Serializable {\n\n    @Id\n    @GeneratedValue(strategy = IDENTITY)\n    @Column(name = \"STOCK_ID\", unique = true, nullable = false)\n    public Integer getStockId() {\n        return this.stockId;\n    }\n  ...<\/code><\/pre>\n<p><\/p>\n<p>A modell tele van okos annot\u00e1ci\u00f3kkal, \u00e9s valahol a h\u00e1tt\u00e9rben a h\u0151sies ORM tonn\u00e1nyi SQL-k\u00f3dot gener\u00e1l \u00e9s futtat. \u00c9rdemes megjegyezni, hogy a fejleszt\u0151k mindent elk\u00f6vetnek, hogy kilom\u00e9terekkel t\u00e1vol tarts\u00e1k magukat az adatb\u00e1zist\u00f3l, ami bizonyos <noindex><a rel=\"nofollow\" href=\"https:\/\/www.sql.ru\/forum\/1303231\/prichiny-nenavisti-k-yazyku-sql\">\"SQL gy\u0171l\u00f6let\"<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>A barik\u00e1d m\u00e1sik oldal\u00e1n a tiszta \"handmade\"-SQL h\u00edvei hangs\u00falyozz\u00e1k, hogy minden cseppet ki lehet pr\u00e9selni az adatb\u00e1zisb\u00f3l tov\u00e1bbi r\u00e9tegek \u00e9s absztrakci\u00f3k n\u00e9lk\u00fcl. Ennek eredm\u00e9nyek\u00e9nt \"data-centric\" projektek sz\u00fcletnek, ahol a b\u00e1zissal kifejezetten k\u00e9pzett emberek foglalkoznak (\u0151k a \"b\u00e1sziak\", \u0151k a \"b\u00e1zovik\", \u0151k a \"b\u00e1zd\u00e9nysikkel\" stb.), m\u00edg a fejleszt\u0151knek csak annyi marad, hogy<\/p>\n<p><\/p>\n<p>De mi van, ha a k\u00e9t vil\u00e1g legjobbjait \u00f6tv\u00f6zz\u00fck? Ahogyan azt a csod\u00e1latos eszk\u00f6z teszi, amelynek \u00e9letes\u00edt\u0151 nev\u00e9n <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krisajenkins\/yesql\">Yesql<\/a><\/noindex>. Bemutatok p\u00e1r sor\u00e1t a koncepci\u00f3r\u00f3l szabad ford\u00edt\u00e1somban, egy\u00e9b r\u00e9szleteket pedig ott tal\u00e1lhatunk. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krisajenkins\/yesql#rationale\">itt<\/a><\/noindex>.<\/p>\n<p><\/p>\n<blockquote><p>A Clojure egy nagyszer\u0171 nyelv DSL-ek kialak\u00edt\u00e1s\u00e1hoz, de a SQL \u00f6n\u00e1ll\u00f3an is egy remek DSL, \u00e9s nem sz\u00fcks\u00e9ges m\u00e9g egy. Az S-kifejez\u00e9sek csod\u00e1latosak, de itt nem adnak semmi \u00fajat. V\u00e9g\u00fcl kapunk z\u00e1r\u00f3jeleket z\u00e1r\u00f3jelek\u00e9rt. Nem \u00e9rt egyet? Akkor v\u00e1rja meg, am\u00edg az adatb\u00e1zis f\u00f6l\u00f6tti absztrakci\u00f3 elkezd folyni, \u00e9s \u00d6n elkezdi a harcot a funkci\u00f3val. <em>(raw-sql)<\/em><\/p>\n<p>Mit tegy\u00fcnk? Hagyjuk, hogy a SQL sima SQL maradjon \u2013 egy f\u00e1jl egy lek\u00e9rdez\u00e9shez:<\/p><\/blockquote>\n<p><\/p>\n<pre><code class=\"sql\">-- n\u00e9v: users-by-country\nselect *\n  from users\n where country_code = :country_code<\/code><\/pre>\n<p><\/p>\n<blockquote><p>\u2026 majd olvassa el ezt a f\u00e1jlt, \u00e9s alak\u00edtsa \u00e1t egy sima Clojure funkci\u00f3v\u00e1:<\/p><\/blockquote>\n<p><\/p>\n<pre><code class=\"lisp\">(defqueries \"some\/where\/users_by_country.sql\"\n   {:connection db-spec})\n\n;;; L\u00e9trej\u00f6tt egy `users-by-country` nev\u0171 f\u00fcggv\u00e9ny.\n;;; Haszn\u00e1ljuk:\n(users-by-country {:country_code \"GB\"})\n;=&gt; ({:name \"Kris\" :country_code \"GB\" ...} ...)<\/code><\/pre>\n<p><\/p>\n<blockquote><p>A \u201eSQL k\u00fcl\u00f6n, Clojure k\u00fcl\u00f6n\u201d elv\u00e9t k\u00f6vetve kapja:<\/p>\n<ul>\n<li>Nincsenek szintaktikai meglepet\u00e9sek. Az adatb\u00e1zisa (mint b\u00e1rmely m\u00e1s) nem felel meg 100%-ban a SQL szabv\u00e1nynak \u2014 de a Yesql sz\u00e1m\u00e1ra ez nem l\u00e9nyeges. Soha nem fog id\u0151t t\u00f6lteni a SQL-nek megfelel\u0151 szintaxis\u00fa funkci\u00f3k keres\u00e9s\u00e9vel. Soha nem kell visszat\u00e9rnie a funkci\u00f3hoz. <em>(raw-sql \"some (\u2018funky\u2019 :: SYNTAX)\")<\/em>.<\/li>\n<li>A legjobb szerkeszt\u0151i t\u00e1mogat\u00e1s. Az \u00d6n szerkeszt\u0151je m\u00e1r nagyszer\u0171 t\u00e1mogat\u00e1st ny\u00fajt SQL-hez. Ha a SQL-t SQL-k\u00e9nt tartja meg, egyszer\u0171en haszn\u00e1lhatja.<\/li>\n<li>Csapatkompatibilit\u00e1s. Az \u00d6n DBA-i tudj\u00e1k olvasni \u00e9s \u00edrni a SQL-t, amit a Clojure projektj\u00e9ben haszn\u00e1l.<\/li>\n<li>Egyszer\u0171bb teljes\u00edtm\u00e9nybe\u00e1ll\u00edt\u00e1s. Egy probl\u00e9m\u00e1s lek\u00e9rdez\u00e9shez tervet kell k\u00e9sz\u00edteni? Ez nem probl\u00e9ma, amikor a lek\u00e9rdez\u00e9se sima SQL.<\/li>\n<li>Lek\u00e9rdez\u00e9sek \u00fajrahaszn\u00e1lhat\u00f3s\u00e1ga. H\u00fazza \u00e1t ezeket az SQL-f\u00e1jlokat m\u00e1s projektekbe, mert ez csak a r\u00e9gi j\u00f3 SQL \u2014 egyszer\u0171en ossza meg \u0151ket.<\/li>\n<\/ul>\n<p>\n<\/p><\/blockquote>\n<p>Szerintem az \u00f6tlet nagyon men\u0151 \u00e9s egyben nagyon egyszer\u0171, ami miatt a projekt sok k\u00f6vet\u0151t szerzett. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krisajenkins\/yesql#other-languages\">sz\u00e1mos nyelven. \u00c9s most megpr\u00f3b\u00e1ljuk alkalmazni a hasonl\u00f3 filoz\u00f3fi\u00e1t a SQL-k\u00f3d elk\u00fcl\u00f6n\u00edt\u00e9s\u00e9re az \u00f6sszes t\u00f6bbit\u0151l, messze az ORM-en t\u00fal.<\/a><\/noindex> IDE &amp; DB-manageerek<\/p>\n<p><\/p>\n<h5 id=\"ide--db-menedzhery\">IDE \u00e9s DB-kezel\u0151k<\/h5>\n<p><\/p>\n<p>Kezdj\u00fck egy egyszer\u0171, mindennapi feladattal. Gyakran sz\u00fcks\u00e9g\u00fcnk van arra, hogy k\u00fcl\u00f6nb\u00f6z\u0151 objektumokat keress\u00fcnk az adatb\u00e1zisokban, p\u00e9ld\u00e1ul megtal\u00e1ljunk egy t\u00e1bl\u00e1t egy s\u00e9m\u00e1ban \u00e9s megismerj\u00fck annak szerkezet\u00e9t (milyen oszlopok, kulcsok, indexek, korl\u00e1toz\u00e1sok \u00e9s egyebek tal\u00e1lhat\u00f3k benne). \u00c9s b\u00e1rmely grafikus IDE-t\u0151l vagy egy minim\u00e1lis DB-managert\u0151l el\u0151sz\u00f6r ezt a k\u00e9pess\u00e9get v\u00e1rjuk el. Azt szeretn\u00e9nk, hogy gyors legyen, \u00e9s ne kelljen f\u00e9l \u00f3r\u00e1t v\u00e1rni, am\u00edg megjelenik az ablak a sz\u00fcks\u00e9ges inform\u00e1ci\u00f3val (f\u0151leg lass\u00fa internetkapcsolat eset\u00e9n a t\u00e1voli adatb\u00e1zissal), \u00e9s hogy a kapott inform\u00e1ci\u00f3 friss \u00e9s aktu\u00e1lis legyen, ne pedig egy elavult gyors\u00edt\u00f3t\u00e1razott adat. K\u00fcl\u00f6n\u00f6sen, min\u00e9l bonyolultabb \u00e9s nagyobb az adatb\u00e1zis, \u00e9s min\u00e9l t\u00f6bb van bel\u0151l\u00fck, ann\u00e1l nehezebb ezt megval\u00f3s\u00edtani.<\/p>\n<p><\/p>\n<p>\u00c1ltal\u00e1ban azonban elfektetem az egeret valahov\u00e1, \u00e9s egyszer\u0171en \u00edrom a k\u00f3dot. Tegy\u00fck fel, hogy meg kell tudnom, mely t\u00e1bl\u00e1k (\u00e9s milyen tulajdons\u00e1gokkal) tal\u00e1lhat\u00f3k az \"HR\" s\u00e9m\u00e1ban. A legt\u00f6bb DBMS-ben az al\u00e1bbi egyszer\u0171 lek\u00e9rdez\u00e9ssel \u00e9rhetj\u00fck el a k\u00edv\u00e1nt eredm\u00e9nyt az information_schema-b\u00f3l:<\/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>Adatb\u00e1zisr\u00f3l adatb\u00e1zisra a referencia t\u00e1bl\u00e1zatok tartalma v\u00e1ltozik a k\u00fcl\u00f6nb\u00f6z\u0151 DBMS-ek k\u00e9pess\u00e9gei szerint. P\u00e9ld\u00e1ul a MySQL eset\u00e9ben a referencia t\u00e1bl\u00e1zatokb\u00f3l kaphatjuk meg a DBMS-specifikus szempontokat is:<\/p>\n<p><\/p>\n<pre><code class=\"sql\">select table_name\n     , storage_engine -- Haszn\u00e1lt \"motor\" (\"MyISAM\", \"InnoDB\" stb.)\n     , row_format     -- Sor form\u00e1tum (\"Fixed\", \"Dynamic\" stb.)\n     , ...\n  from information_schema.tables\n where schema = 'HR'<\/code><\/pre>\n<p><\/p>\n<p>Az Oracle nem t\u00e1mogatja az information_schema-t, viszont van neki <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Oracle_metadata\">az Oracle metaadatok<\/a><\/noindex>, \u00e9s komolyabb probl\u00e9m\u00e1k nem mer\u00fclnek fel:<\/p>\n<p><\/p>\n<pre><code class=\"sql\">select table_name\n     , pct_free       -- A minimum szabad hely a blokkban (%)\n     , pct_used       -- A minimum haszn\u00e1lt hely az adatblokkokon (%)\n     , last_analyzed  -- Az utols\u00f3 statisztikai gy\u0171jt\u00e9s d\u00e1tuma\n     , ...\n  from all_tables\n where owner = 'HR'<\/code><\/pre>\n<p><\/p>\n<p>A ClickHouse sem kiv\u00e9tel:<\/p>\n<p><\/p>\n<pre><code class=\"sql\">select name\n     , engine -- Haszn\u00e1lt \"motor\" (\"MergeTree\", \"Dictionary\" stb.)\n     , ...\n  from system.tables\n where database = 'HR'<\/code><\/pre>\n<p><\/p>\n<p>Hasonl\u00f3 dolgot meg lehet csin\u00e1lni Cassandra-ban is (ahol column family-k vannak a t\u00e1bl\u00e1k helyett \u00e9s keyspace-ek a s\u00e9m\u00e1k helyett):<\/p>\n<p><\/p>\n<pre><code class=\"sql\">select columnfamily_name\n     , compaction_strategy_class  -- A t\u00f6rl\u00e9si strat\u00e9gia\n     , gc_grace_seconds           -- A szemetel\u00e9s id\u0151tartama\n     , ...\n  from system.schema_columnfamilies\n where keyspace_name = 'HR'<\/code><\/pre>\n<p><\/p>\n<p>A t\u00f6bbi adatb\u00e1zis eset\u00e9ben is hasonl\u00f3 lek\u00e9rdez\u00e9sek \u00e1ll\u00edthat\u00f3k \u00f6ssze (m\u00e9g a MongoDB-ben is van <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/system-collections\/#%3Cdatabase%3E.system.namespaces\">k\u00fcl\u00f6n rendszer gy\u0171jtem\u00e9ny<\/a><\/noindex>, amely tartalmazza az \u00f6sszes gy\u0171jtem\u00e9ny inform\u00e1ci\u00f3j\u00e1t a rendszerben).<\/p>\n<p><\/p>\n<p>Term\u00e9szetesen ezzel a m\u00f3dszerrel inform\u00e1ci\u00f3t lehet nyerni nemcsak a t\u00e1bl\u00e1kr\u00f3l, hanem szinte b\u00e1rmely objektumr\u00f3l is. Id\u0151nk\u00e9nt j\u00f3t\u00e9kony emberek osztj\u00e1k meg az ilyen k\u00f3dokat k\u00fcl\u00f6nb\u00f6z\u0151 adatb\u00e1zisokhoz, mint p\u00e9ld\u00e1ul a \"Funkci\u00f3k PostgreSQL adatb\u00e1zisok dokument\u00e1l\u00e1s\u00e1ra\" c\u00edm\u0171 Habr-cikk sorozatban (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/post\/415575\">\u00e1jb<\/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>). Term\u00e9szetesen nem k\u00f6nny\u0171 mindezt a rengeteg lek\u00e9rdez\u00e9st fejben tartani \u00e9s folyamatosan be\u00edrni \u0151ket \u2014 ez egy \"olyan\" kellemetlen dolog, ez\u00e9rt a kedvenc IDE-mben\/szerkeszt\u0151mben van egy el\u0151re meg\u00edrt k\u00e9szlet a gyakran haszn\u00e1lt lek\u00e9rdez\u00e9sekhez, \u00e9s csak az objektumok neveit kell bele\u00edrnom a sablonba.<\/p>\n<p><\/p>\n<p>V\u00e9g\u00fcl is, az ilyen navig\u00e1l\u00e1si \u00e9s objektumkeres\u00e9si m\u00f3dszer sokkal rugalmasabb, rengeteg id\u0151t sp\u00f3rol, \u00e9s lehet\u0151v\u00e9 teszi, hogy pontosan azt az inform\u00e1ci\u00f3t \u00e9s olyan form\u00e1ban kapjuk meg, amire \u00e9ppen sz\u00fcks\u00e9g van (ahogyan azt a <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/JetBrains\/blog\/342094\">\"Adatok export\u00e1l\u00e1sa az adatb\u00e1zisb\u00f3l b\u00e1rmilyen form\u00e1tumban: mit tudnak az IDE-k az IntelliJ platformon\"<\/a><\/noindex>).<\/p>\n<p><\/p>\n<h5 id=\"operacii-s-obektami\">M\u0171veletek objektumokkal<\/h5>\n<p><\/p>\n<p>Miut\u00e1n megtal\u00e1ltuk \u00e9s megvizsg\u00e1ltuk a sz\u00fcks\u00e9ges objektumokat, itt az ideje, hogy valami hasznosat csin\u00e1ljunk vel\u00fck. Term\u00e9szetesen, an\u00e9lk\u00fcl, hogy a kezeinket a billenty\u0171zetr\u0151l felemeln\u00e9nk.<\/p>\n<p><\/p>\n<p>Nem titok, hogy egy t\u00e1bla egyszer\u0171 t\u00f6rl\u00e9se szinte minden adatb\u00e1zisban egyform\u00e1n n\u00e9z ki:<\/p>\n<p><\/p>\n<pre><code class=\"sql\">drop table hr.persons<\/code><\/pre>\n<p><\/p>\n<p>Az adatok t\u00e1bl\u00e1zat\u00e1nak l\u00e9trehoz\u00e1sa m\u00e1r izgalmasabb t\u00e9ma. Szinte minden DBMS (bele\u00e9rtve sok NoSQL-t is) tudja a \"create table\" parancsot, \u00e9s a l\u00e9nyeg\u00e9nek r\u00e9szei (n\u00e9v, oszlopok list\u00e1ja, adatt\u00edpusok) alig fognak elt\u00e9rni, de a t\u00f6bbi r\u00e9szlet dr\u00e1maian k\u00fcl\u00f6nb\u00f6zhet, \u00e9s az adott DBMS bels\u0151 fel\u00e9p\u00edt\u00e9s\u00e9t\u0151l \u00e9s k\u00e9pess\u00e9geit\u0151l f\u00fcgg. A kedvenc p\u00e9ld\u00e1m az Oracle dokument\u00e1ci\u00f3j\u00e1ban tal\u00e1lhat\u00f3 \"meztelen\" BNF-ek a \"create table\" szintaxisra. <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/19\/sqlrf\/sql-language-reference.pdf\">31 oldalt tesznek ki.<\/a><\/noindex>M\u00e1s RDBMS-ek szer\u00e9nyebb lehet\u0151s\u00e9gekkel rendelkeznek, de mindegyik sok \u00e9rdekes \u00e9s egyedi funkci\u00f3val b\u00edr a t\u00e1bl\u00e1k l\u00e9trehoz\u00e1s\u00e1hoz (<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>). Val\u00f3sz\u00edn\u0171, hogy egy grafikus \"var\u00e1zsl\u00f3\" a leg\u00fajabb IDE-b\u0151l (k\u00fcl\u00f6n\u00f6sen, ha \u00e1ltal\u00e1nos c\u00e9l\u00fa) teljes m\u00e9rt\u00e9kben nem tudja lefedni ezeket a lehet\u0151s\u00e9geket, \u00e9s ha igen, az nem lesz gyenge idegzet\u0171eknek val\u00f3 l\u00e1tv\u00e1ny. Ugyanakkor a helyes \u00e9s id\u0151ben \u00edrt parancs <strong><em>create table<\/em><\/strong> megk\u00f6nny\u00edti, hogy minden k\u00e9pess\u00e9get kihaszn\u00e1lhassunk, \u00e9s biztos\u00edtsuk az adatok t\u00e1rol\u00e1s\u00e1t \u00e9s el\u00e9r\u00e9s\u00e9t megb\u00edzhat\u00f3an, optim\u00e1lisan \u00e9s maxim\u00e1lisan k\u00e9nyelmesen.<\/p>\n<p><\/p>\n<p>A legt\u00f6bb DBMS saj\u00e1t specifikus objektumt\u00edpusokkal rendelkezik, amelyek m\u00e1s DBMS-ekben nem tal\u00e1lhat\u00f3k meg. Ezen k\u00edv\u00fcl nemcsak a DB objektumain, hanem mag\u00e1n a DBMS-en is v\u00e9grehajthatunk m\u0171veleteket, p\u00e9ld\u00e1ul \"meg\u00f6lhetj\u00fck\" a folyamatot, felszabad\u00edthatunk egy mem\u00f3ria ter\u00fcletet, aktiv\u00e1lhatjuk a nyomk\u00f6vet\u00e9st, \u00e1tv\u00e1lthatunk \"read only\" m\u00f3dba \u00e9s sok m\u00e1st.<\/p>\n<p><\/p>\n<h5 id=\"a-teper-nemnogo-porisuem\">Most pedig rajzolhatunk egy kicsit<\/h5>\n<p><\/p>\n<p>Az egyik legelterjedtebb feladat az adatb\u00e1zis objektumok diagramj\u00e1nak l\u00e9trehoz\u00e1sa, hogy egy sz\u00e9p k\u00e9pen l\u00e1thassuk az objektumokat \u00e9s k\u00f6zt\u00fck a kapcsolatokat. Ezt szinte b\u00e1rmely grafikus IDE, k\u00fcl\u00f6nb\u00f6z\u0151 parancssori seg\u00e9dprogramok, valamint speci\u00e1lis grafikai eszk\u00f6z\u00f6k \u00e9s modellez\u0151k tudj\u00e1k. Amik valamit \"\u00fagy rajzolnak, ahogy tudnak\", \u00e9s a folyamatra csak n\u00e9h\u00e1ny konfigur\u00e1ci\u00f3s f\u00e1jl param\u00e9terrel vagy a fel\u00fclet jel\u00f6l\u0151ivel tudunk hatni.<\/p>\n<p><\/p>\n<p>De ezt a probl\u00e9m\u00e1t sokkal egyszer\u0171bben, rugalmasabban \u00e9s eleg\u00e1nsabban lehet megoldani, term\u00e9szetesen k\u00f3d seg\u00edts\u00e9g\u00e9vel. B\u00e1rmilyen bonyolults\u00e1g\u00fa diagramokhoz azonnal rendelkez\u00e9s\u00fcnkre \u00e1ll t\u00f6bb speci\u00e1lis jel\u00f6l\u0151nyelv (DOT, GraphML stb.), \u00e9s ezekhez egy rak\u00e1s alkalmaz\u00e1s (GraphViz, PlantUML, Mermaid) tartozik, amelyek k\u00e9pesek olvasni az ilyen utas\u00edt\u00e1sokat \u00e9s vizualiz\u00e1lni k\u00fcl\u00f6nb\u00f6z\u0151 form\u00e1tumokban. Az objektumokr\u00f3l \u00e9s a k\u00f6z\u00f6tt\u00fck l\u00e9v\u0151 kapcsolatokr\u00f3l pedig m\u00e1r tudjuk, hogyan szerezz\u00fck be az inform\u00e1ci\u00f3t.<\/p>\n<p><\/p>\n<p>Mutatunk egy kis p\u00e9ld\u00e1t arr\u00f3l, hogy ez hogyan n\u00e9zhetne ki a PlantUML haszn\u00e1lat\u00e1val \u00e9s <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/316428\/\">a PostgreSQL demonstr\u00e1ci\u00f3s adatb\u00e1zissal<\/a><\/noindex> (bal oldalon az SQL-lek\u00e9rdez\u00e9s, amely gener\u00e1lja a sz\u00fcks\u00e9ges utas\u00edt\u00e1st a PlantUML-hez, jobb oldalon pedig az eredm\u00e9ny):<\/p>\n<p>\n<img decoding=\"async\" alt=\"\u201eAdatb\u00e1zis mint K\u00f3d\u201d tapasztalat\" 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>Ha kicsit jobban megszor\u00edtjuk magunkat, akkor a <noindex><a rel=\"nofollow\" href=\"https:\/\/gist.github.com\/QuantumGhost\/0955a45383a0b6c0bc24f9654b3cb561\">PlantUML-hez k\u00e9sz\u00fclt ER-sablonb\u00f3l<\/a><\/noindex> valami nagyon hasonl\u00f3t nyerhet\u00fcnk egy igazi ER-diagramhoz:<\/p>\n<p><\/p>\n<p>                        <b class=\"spoiler_title\">Egy kicsit bonyolultabb SQL-lek\u00e9rdez\u00e9s<\/b><\/p>\n<pre><code class=\"sql\">-- Fejl&eacute;c\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-- T&aacute;bl&aacute;k\nselect format(&#039;Table(%s, &quot;%s n inform&aacute;ci&oacute; %s-r&oacute;l&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-- Kapcsolatok a t&aacute;bl&aacute;k k&ouml;z&ouml;tt\nselect distinct ccu.table_name || &#039; &quot;1&quot; --&amp;gt; &quot;0..N&quot; &#039; || tc.table_name || format(&#039; : &quot;A %s sok %s-el rendelkezhet&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-- L&aacute;bl&eacute;c\nselect &#039;@enduml&#039;<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"\u201eAdatb\u00e1zis mint K\u00f3d\u201d tapasztalat\" src=\"\/wp-content\/uploads\/2020\/06\/bd45420a4fd1bdfcf20cbe74a0638c7b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Ha alaposan megn\u00e9zz\u00fck, akkor sok vizu\u00e1lis eszk\u00f6z is hasonl\u00f3 lek\u00e9rdez\u00e9seket haszn\u00e1l a h\u00e1tt\u00e9rben. Az igazs\u00e1g az, hogy ezek a lek\u00e9rdez\u00e9sek \u00e1ltal\u00e1ban m\u00e9lyen <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pgmodeler\/pgmodeler\/blob\/9c615c0b0871df3cd649983ce61e802b0ff0137b\/schemas\/catalog\/table.sch\">\"k\u00f3dba rejtve\" az alkalmaz\u00e1sban, \u00e9s nehezen \u00e9rthet\u0151ek.<\/a><\/noindex>, nem is besz\u00e9lve a m\u00f3dos\u00edt\u00e1sukr\u00f3l.<\/p>\n<p><\/p>\n<h5 id=\"metriki-i-monitoring\">Metrik\u00e1k \u00e9s monitoroz\u00e1s<\/h5>\n<p><\/p>\n<p>L\u00e9pj\u00fcnk a hagyom\u00e1nyosan neh\u00e9z t\u00e9m\u00e1ra \u2014 az adatb\u00e1zisok teljes\u00edtm\u00e9ny\u00e9nek monitoroz\u00e1s\u00e1ra. Eml\u00e9kszem egy kis igaz t\u00f6rt\u00e9netre, amit \"egy bar\u00e1tom\" mes\u00e9lt. Egy projekt keretein bel\u00fcl \u00e9lt egy hatalmas DBA, akivel a fejleszt\u0151k k\u00f6z\u00fcl kevesen voltak szem\u00e9lyesen ismertek, s\u0151t, szinte senki sem l\u00e1tta \u0151t soha (annak ellen\u00e9re, hogy \u00e1ll\u00edt\u00f3lag a szomsz\u00e9d \u00e9p\u00fcletben dolgozott). Az \"X\" \u00f3r\u00e1ban, amikor a nagy kiskeresked\u0151 termel\u00e9si rendszere \u00fajra \"rosszul \u00e9rezte mag\u00e1t\", n\u00e9ma m\u00f3don k\u00fcld\u00f6tt k\u00e9perny\u0151k\u00e9peket az Oracle Enterprise Managerb\u0151l, ahol gondosan kiemelte a kritikus pontokat piros markerrel az \"\u00e9rthet\u0151s\u00e9g\" kedv\u00e9\u00e9rt (ez, finoman sz\u00f3lva, nem sokat seg\u00edtett). \u00cdgy h\u00e1t ezen a \"fot\u00f3n\" kellett helyre\u00e1ll\u00edtani a helyzetet. Ek\u00f6zben senkinek sem volt hozz\u00e1f\u00e9r\u00e9se a dr\u00e1ga (mindk\u00e9t \u00e9rtelemben) Enterprise Managerhez, mivel a rendszer bonyolult \u00e9s k\u00f6lts\u00e9ges volt, \u00e9s att\u00f3l f\u00e9ltek, hogy a \"fejleszt\u0151k v\u00e9letlen\u00fcl felfedeznek valamit, \u00e9s mindent elrontanak\". Ez\u00e9rt a fejleszt\u0151k \"empirikus\" \u00faton tal\u00e1lt\u00e1k meg a z\u00f6kken\u0151k hely\u00e9t \u00e9s ok\u00e1t, majd kiadt\u00e1k a jav\u00edt\u00e1st. Ha a DBA-t\u00f3l nem \u00e9rkezett \u00faj, fenyeget\u0151 lev\u00e9l a k\u00f6zelj\u00f6v\u0151ben, mindenki megk\u00f6nnyebb\u00fclten fell\u00e9legzett, \u00e9s visszat\u00e9rt a jelenlegi feladataikhoz (az \u00faj lev\u00e9lig).<\/p>\n<p><\/p>\n<p>De a monitoroz\u00e1si folyamat sokkal vid\u00e1mabban \u00e9s bar\u00e1ts\u00e1gosabban is kin\u00e9zhet, \u00e9s ami a legfontosabb \u2014 mindez el\u00e9rhet\u0151 \u00e9s \u00e1tl\u00e1that\u00f3 lehet mindenki sz\u00e1m\u00e1ra. Legal\u00e1bbis az alapvet\u0151 r\u00e9sze, mint kieg\u00e9sz\u00edt\u0151 az alapvet\u0151 monitoroz\u00f3 rendszerekhez (amelyek k\u00e9ts\u00e9gtelen\u00fcl hasznosak \u00e9s sok esetben p\u00f3tolhatatlanok). B\u00e1rmely adatb\u00e1zis-kezel\u0151 rendszer szabadon \u00e9s teljesen ingyenesen k\u00e9sz megosztani az inform\u00e1ci\u00f3t a jelenlegi \u00e1llapot\u00e1r\u00f3l \u00e9s teljes\u00edtm\u00e9ny\u00e9r\u0151l. Az eml\u00edtett \"v\u00e9rengz\u0151\" Oracle DB eset\u00e9ben l\u00e9nyeg\u00e9ben b\u00e1rmilyen teljes\u00edtm\u00e9nyinform\u00e1ci\u00f3t meg lehet szerezni a rendszer aspektusokb\u00f3l, kezdve a folyamatokkal \u00e9s munkamenetekkel, \u00e9s v\u00e9gezve a puffermem\u00f3ria \u00e1llapot\u00e1val (p\u00e9ld\u00e1ul, <noindex><a rel=\"nofollow\" href=\"https:\/\/oracle-base.com\/dba\/scripts\">DBA Szkriptek<\/a><\/noindex>, \"Monitoroz\u00e1s\" r\u00e9sz). A PostgreSQL-ben is van egy eg\u00e9sz sor rendszerszint\u0171 n\u00e9zet az <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/static\/monitoring-stats.html\">Az adatb\u00e1zisok monitoroz\u00e1sa<\/a><\/noindex>, k\u00fcl\u00f6n\u00f6sen olyan n\u00e9lk\u00fcl\u00f6zhetetlen szempontokra, mint <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>. A MySQL sz\u00e1m\u00e1ra van egy k\u00fcl\u00f6n s\u00e9ma, amely erre k\u00e9sz\u00fclt <noindex><a rel=\"nofollow\" href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/performance-schema-table-descriptions.html\">performance_schema<\/a><\/noindex>. A MongoDB eset\u00e9ben be\u00e9p\u00edtett <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/tutorial\/manage-the-database-profiler\/\">profil\u00e1l\u00f3<\/a><\/noindex> aggreg\u00e1lja a teljes\u00edtm\u00e9nyadatokat a rendszerszint\u0171 gy\u0171jtem\u00e9nybe <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>Teh\u00e1t, felv\u00e9rtezve magunkat valamilyen metrikagy\u0171jt\u0151vel (Telegraf, Metricbeat, Collectd), amely k\u00e9pes egyedi SQL-lek\u00e9rdez\u00e9sek v\u00e9grehajt\u00e1s\u00e1ra, a metrik\u00e1k t\u00e1rol\u00f3val (InfluxDB, Elasticsearch, Timescaledb) \u00e9s vizualiz\u00e1l\u00f3val (Grafana, Kibana), l\u00e9trehozhatunk egy viszonylag egyszer\u0171 \u00e9s rugalmas megfigyel\u0151rendszert, amely szorosan integr\u00e1l\u00f3dik m\u00e1s \u00e1ltal\u00e1nos rendszer m\u00e9r\u0151sz\u00e1mokkal (amelyeket p\u00e9ld\u00e1ul az alkalmaz\u00e1sszervert\u0151l, az oper\u00e1ci\u00f3s rendszert\u0151l stb. nyer\u00fcnk). Ahogyan azt p\u00e9ld\u00e1ul a pgwatch2-ben is megval\u00f3s\u00edtott\u00e1k, ahol az InfluxDB + Grafana p\u00e1ros\u00edt\u00e1st \u00e9s a rendszerszem\u00e9lyzetekhez k\u00e9sz\u00fclt lek\u00e9rdez\u00e9seket haszn\u00e1lj\u00e1k. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/cybertec-postgresql\/pgwatch2#adding-metrics\">hozz\u00e1adhatunk egyedi lek\u00e9rdez\u00e9seket<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h2 id=\"itogo\">\u00d6sszesen<\/h2>\n<p><\/p>\n<p>\u00c9s ez csak egy hozz\u00e1vet\u0151leges felsorol\u00e1s arr\u00f3l, hogy mit lehet tenni az adatb\u00e1zisunkkal a hagyom\u00e1nyos SQL-k\u00f3d seg\u00edts\u00e9g\u00e9vel. Biztos vagyok benne, hogy m\u00e9g sz\u00e1mos alkalmaz\u00e1st tal\u00e1lhatunk, \u00edrja meg a megjegyz\u00e9sekben. Arr\u00f3l, hogy hogyan (\u00e9s ami a legfontosabb, mi\u00e9rt) automatiz\u00e1ljuk ezt az eg\u00e9szet, \u00e9s hogyan illessz\u00fck be a CI\/CD folyamatunkba, legk\u00f6zelebb besz\u00e9l\u00fcnk.<\/p>\n<p>Forr\u00e1s: <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.3 - 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\/hu\/blog\/administrirovanie\/database-as-sode-experience\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"hu_HU\" \/>\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\/hu\/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\udd47\u201eAdatb\u00e1zis mint K\u00f3d\u201d \u00c9lm\u00e9ny | ProHoster","description":"SQL, mi lehetne egyszer\u0171bb?","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/database-as-sode-experience","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","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\/hu\/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\/hu\/wp-json\/wp\/v2\/posts\/83649","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=83649"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/83649\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/83650"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=83649"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=83649"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=83649"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}