{"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\/hu\/blog\/administrirovanie\/istina-prezhde-vsego-ili-pochemu-sistemu-nuzhno-proektirovat-ishodya-iz-ustrojstva-bazy-dannyh","title":{"rendered":"Az igazs\u00e1g mindenn\u00e9l fontosabb, vagyis mi\u00e9rt kell a rendszert az adatb\u00e1zis strukt\u00far\u00e1ja alapj\u00e1n tervezni","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hell\u00f3, Habr!<\/p>\n<p>Folyamatosan kutatjuk a t\u00e9m\u00e1t <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/all\/product\/sovremennyy-yazyk-java-lyambda-vyrazheniya-potoki-i-funktsionalnoe-programmirovanie\">Java<\/a><\/noindex> \u00e9s <noindex><a rel=\"nofollow\" href=\"https:\/\/storage.piter.com\/upload\/contents\/978544611587\/978544611587_X.pdf\">Spring<\/a><\/noindex>, bele\u00e9rtve az adatb\u00e1zisok szintj\u00e9t is. Ma arr\u00f3l olvashat, hogy mi\u00e9rt kell nagy alkalmaz\u00e1sok tervez\u00e9sekor az adatb\u00e1zis strukt\u00far\u00e1j\u00e1nak, nem pedig a Java k\u00f3dnak a d\u00f6nt\u0151 szerepet j\u00e1tszania, hogyan t\u00f6rt\u00e9nik ez, \u00e9s milyen kiv\u00e9telek vannak ez al\u00f3l a szab\u00e1ly al\u00f3l.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <br \/>\nEbben a viszonylag k\u00e9sleked\u0151 cikkben elmagyar\u00e1zom, mi\u00e9rt gondolom, hogy szinte minden esetben az alkalmaz\u00e1s adatmodellj\u00e9t az \"adatb\u00e1zisb\u00f3l kiindulva\" kell tervezni, nem pedig a \"Java lehet\u0151s\u00e9geib\u0151l kiindulva\" (vagy b\u00e1rmely m\u00e1s kliens nyelvb\u0151l, amellyel dolgozik). Ha a m\u00e1sodik megk\u00f6zel\u00edt\u00e9st v\u00e1lasztja, egy f\u00e1jdalmas \u00e9s szenved\u00e9ssel teli \u00faton tal\u00e1lja mag\u00e1t, ahogy a projektje n\u00f6vekszik.<\/p>\n<p>A cikk az <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/50706556\/kotlin-with-jooq-and-write-table-models-manually-without-code-generation\">egy k\u00e9rd\u00e9s alapj\u00e1n k\u00e9sz\u00fclt<\/a><\/noindex>, amelyet a Stack Overflow-n tettek fel.<\/p>\n<p>\u00c9rdekes besz\u00e9lget\u00e9sek a reddit k\u00fcl\u00f6nb\u00f6z\u0151 szekci\u00f3iban <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> \u00e9s <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>K\u00f3dgener\u00e1l\u00e1s<\/h4>\n<p>\nH\u00e1t mennyire meglepett, hogy van egy ilyen kis r\u00e9teg felhaszn\u00e1l\u00f3, akik a jOOQ-al val\u00f3 megismerked\u00e9s ut\u00e1n felh\u00e1borodnak azon a t\u00e9nnyel, hogy a jOOQ haszn\u00e1lata sor\u00e1n komolyan t\u00e1maszkodnak a forr\u00e1sk\u00f3d gener\u00e1l\u00e1s\u00e1ra. Senki sem akad\u00e1lyoz meg abban, hogy a jOOQ-ot \u00fagy haszn\u00e1lja, ahogy j\u00f3nak v\u00e9li, \u00e9s senki sem k\u00e9nyszer\u00edti a k\u00f3d gener\u00e1l\u00e1s\u00e1ra. De alap\u00e9rtelmez\u00e9s szerint (ahogyan a k\u00e9zik\u00f6nyvben le van \u00edrva) a jOOQ-al val\u00f3 munka \u00fagy t\u00f6rt\u00e9nik: \u00d6n kezd az (\u00f6r\u00f6k\u00f6lt) adatb\u00e1zis s\u00e9m\u00e1j\u00e1val, visszatervez\u00e9st v\u00e9gez a jOOQ k\u00f3dgener\u00e1tor seg\u00edts\u00e9g\u00e9vel, hogy egy oszt\u00e1lyhalmazt kapjon, amely a t\u00e1bl\u00e1zatait k\u00e9pviseli, majd t\u00edpusbiztons\u00e1gos lek\u00e9rdez\u00e9seket \u00edr ezekhez a t\u00e1bl\u00e1zatokhoz:<\/p>\n<pre><code class=\"java\">\tfor (Record2 record : DSL.using(configuration)\n\/\/   ^^^^^^^^^^^^^^^^^^^^^^^ Az inform\u00e1ci\u00f3k a gener\u00e1lt k\u00f3d alapj\u00e1n ker\u00fcltek ki\u00edr\u00e1sra, amelyre az al\u00e1bbi\n\/\/   SELECT felt\u00e9tel hivatkozik\n\n       .select(ACTOR.FIRST_NAME, ACTOR.LAST_NAME)\n\/\/           vvvvv ^^^^^^^^^^^^  ^^^^^^^^^^^^^^^ gener\u00e1lt nevek\n       .from(ACTOR)\n       .orderBy(1, 2)) {\n    \/\/ ...\n}<\/code><\/pre>\n<p>\nA k\u00f3d vagy manu\u00e1lisan, az \u00e9p\u00edt\u00e9sen k\u00edv\u00fcl, vagy manu\u00e1lisan, minden \u00e9p\u00edt\u00e9skor gener\u00e1l\u00f3dik. P\u00e9ld\u00e1ul egy ilyen regener\u00e1l\u00e1s k\u00f6vetheti az <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.jooq.org\/2014\/06\/25\/flyway-and-jooq-for-unbeatable-sql-development-productivity\/\">Flyway adatb\u00e1zis-migr\u00e1ci\u00f3t, amely szint\u00e9n elv\u00e9gezhet\u0151 manu\u00e1lisan vagy automatikusan<\/a><\/noindex>.<\/p>\n<h4>Forr\u00e1sk\u00f3d gener\u00e1l\u00e1s<\/h4>\n<p>\nA k\u00f3dgener\u00e1l\u00e1s ilyen megk\u00f6zel\u00edt\u00e9sei \u2013 manu\u00e1lis \u00e9s automatikus \u2013 k\u00fcl\u00f6nb\u00f6z\u0151 filoz\u00f3fi\u00e1kkal, el\u0151ny\u00f6kkel \u00e9s h\u00e1tr\u00e1nyokkal kapcsolatosak, amelyeket nem tervezek r\u00e9szletesen megvitatni ebben a cikkben. De \u00f6sszess\u00e9g\u00e9ben a gener\u00e1lt k\u00f3d l\u00e9nyege, hogy lehet\u0151v\u00e9 teszi sz\u00e1munkra, hogy reproduk\u00e1ljuk Java-ban azt az \"igazs\u00e1got\", amelyet adott magunknak, legyen sz\u00f3 a rendszer\u00fcnk keretein bel\u00fclr\u0151l vagy k\u00edv\u00fclr\u0151l. Bizonyos \u00e9rtelemben ezt teszik a ford\u00edt\u00f3k is, amelyek b\u00e1jt-k\u00f3dot, g\u00e9pi k\u00f3dot vagy b\u00e1rmilyen m\u00e1s k\u00f3dot gener\u00e1lnak a forr\u00e1sk\u00f3d alapj\u00e1n \u2013 egy m\u00e1sik nyelven kapjuk meg az \"igazs\u00e1gunk\" reprezent\u00e1ci\u00f3j\u00e1t, f\u00fcggetlen\u00fcl a konkr\u00e9t okokt\u00f3l. <\/p>\n<p>Sz\u00e1mos ilyen k\u00f3dgener\u00e1l\u00f3 l\u00e9tezik. P\u00e9ld\u00e1ul, <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/technotes\/tools\/unix\/xjc.html\">az XJC Java k\u00f3dot gener\u00e1lhat XSD vagy WSDL f\u00e1jlok alapj\u00e1n<\/a><\/noindex>. Az elv mindig ugyanaz:<\/p>\n<ul>\n<li>L\u00e9tezik egyfajta igazs\u00e1g (bels\u0151 vagy k\u00fcls\u0151) \u2013 p\u00e9ld\u00e1ul specifik\u00e1ci\u00f3, adatmodell, stb.<\/li>\n<li>Sz\u00fcks\u00e9g\u00fcnk van a nyelv\u00fcnkben val\u00f3 helyi reprezent\u00e1ci\u00f3ra.<\/li>\n<\/ul>\n<p>\n\u00c9s a hasonl\u00f3 reprezent\u00e1ci\u00f3 gener\u00e1l\u00e1sa szinte mindig c\u00e9lszer\u0171 \u2013 hogy elker\u00fclj\u00fck a redundanci\u00e1t.<\/p>\n<h4>T\u00edpuskezdem\u00e9nyez\u0151k \u00e9s annot\u00e1ci\u00f3feldolgoz\u00e1s<\/h4>\n<p>\n\u00c9rdemes megjegyezni: egy m\u00e1sik, modernebb \u00e9s specifikusabb megk\u00f6zel\u00edt\u00e9s a jOOQ k\u00f3dgener\u00e1l\u00e1s\u00e1hoz a t\u00edpusk\u00e9sz\u00edt\u0151k haszn\u00e1lat\u00e1val kapcsolatos, <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/fsharp\/tutorials\/type-providers\/\">ahogyan az az F#-ban van megval\u00f3s\u00edtva<\/a><\/noindex>. Ebben az esetben a k\u00f3dot a ford\u00edt\u00f3 gener\u00e1lja, l\u00e9nyeg\u00e9ben a ford\u00edt\u00e1si f\u00e1zisban. Olyan form\u00e1ban, mint forr\u00e1sk\u00f3d, az ilyen k\u00f3d alapvet\u0151en nem l\u00e9tezik. A Java-ban l\u00e9teznek hasonl\u00f3, b\u00e1r nem annyira eleg\u00e1ns eszk\u00f6z\u00f6k \u2013 ezek az annot\u00e1ci\u00f3feldolgoz\u00f3k, p\u00e9ld\u00e1ul <noindex><a rel=\"nofollow\" href=\"https:\/\/projectlombok.org\">a Lombok<\/a><\/noindex>.<\/p>\n<p>. Bizonyos \u00e9rtelemben itt is ugyanazok a dolgok t\u00f6rt\u00e9nnek, mint az els\u0151 esetben, kiv\u00e9ve:<\/p>\n<ul>\n<li>Nem l\u00e1tod a gener\u00e1lt k\u00f3dot (tal\u00e1n sz\u00e1m\u00edt valakinek, hogy ez nem t\u0171nik annyira tasz\u00edt\u00f3nak?)<\/li>\n<li>Garant\u00e1lnod kell, hogy a t\u00edpusok rendelkez\u00e9sre \u00e1llnak, teh\u00e1t az \"igazs\u00e1gnak\" mindig el\u00e9rhet\u0151nek kell lennie. Ez k\u00f6nny\u0171 a Lombok eset\u00e9ben, amely annot\u00e1lja az \"igazs\u00e1got\". Egy kicsit bonyolultabb a szab\u00e1lyzatokkal, amelyeket a folyamatosan el\u00e9rhet\u0151 \u00e9l\u0151 kapcsolat f\u00fcggv\u00e9ny\u00e9ben dolgozunk fel.<\/li>\n<\/ul>\n<p><\/p>\n<h4>Mi a probl\u00e9ma a k\u00f3dgener\u00e1l\u00e1ssal?<\/h4>\n<p>\nA k\u00f3dgener\u00e1l\u00e1s elind\u00edt\u00e1s\u00e1nak legjobb m\u00f3dj\u00e1r\u00f3l sz\u00f3l\u00f3 \u00fcgyes k\u00e9rd\u00e9s mellett eml\u00edten\u00fcnk kell azt is, hogy vannak, akik \u00fagy v\u00e9lik, hogy a k\u00f3dgener\u00e1l\u00e1sra egy\u00e1ltal\u00e1n nincs sz\u00fcks\u00e9g. Ennek a v\u00e9lem\u00e9nynek a leggyakoribb indoka az, hogy neh\u00e9z be\u00e1ll\u00edtani az \u00e9p\u00edt\u00e9si folyamatot. Igen, val\u00f3ban neh\u00e9z. Tov\u00e1bbi infrastrukt\u00fara-kiad\u00e1sok mer\u00fclnek fel. Ha \u00e9ppen csak most kezd dolgozni egy adott term\u00e9kkel (legyen az jOOQ, JAXB vagy Hibernate stb.), az ide\u00e1lis munkak\u00f6rnyezet be\u00e1ll\u00edt\u00e1sa id\u0151t ig\u00e9nyel, amelyet jobban szeretne az API saj\u00e1toss\u00e1gaival val\u00f3 ismerked\u00e9sre ford\u00edtani, hogy k\u00e9s\u0151bb \u00e9rt\u00e9ket nyerhessen le bel\u0151le.<\/p>\n<p>Ha t\u00fal nagyok a k\u00f6lts\u00e9gek a gener\u00e1tor m\u0171k\u00f6d\u00e9s\u00e9nek meg\u00e9rt\u00e9se miatt, akkor val\u00f3ban rosszul dolgoztak az API k\u00f3dgener\u00e1l\u00f3 haszn\u00e1lhat\u00f3s\u00e1g\u00e1n (\u00e9s k\u00e9s\u0151bb kider\u00fcl, hogy a felhaszn\u00e1l\u00f3i be\u00e1ll\u00edt\u00e1sok is bonyolultak). A haszn\u00e1lhat\u00f3s\u00e1g a legmagasabb priorit\u00e1s kell hogy legyen b\u00e1rmilyen ilyen API eset\u00e9ben. De ez csup\u00e1n egy \u00e9rv a k\u00f3dgener\u00e1l\u00e1s ellen. A t\u00f6bbi esetben teljes m\u00e9rt\u00e9kben k\u00e9zzel kell elk\u00e9sz\u00edteni a helyi reprezent\u00e1ci\u00f3t a bels\u0151 vagy k\u00fcls\u0151 igazs\u00e1gr\u00f3l.<\/p>\n<p>Sokan azt mondj\u00e1k, hogy nincs idej\u00fck mindezzel foglalkozni. Most \u00e9ppen a Super-Projektj\u00fck hat\u00e1ridejei t\u0171zben \u00e1llnak. Majd k\u00e9s\u0151bb rendbe rakjuk az \u00e9p\u00edt\u00e9si folyamatokat, ha id\u0151nk engedi. \u00c9n pedig azt v\u00e1laszoln\u00e1m nekik:<\/p>\n<p><img decoding=\"async\" alt=\"Az igazs\u00e1g mindenn\u00e9l fontosabb, vagyis mi\u00e9rt kell a rendszert az adatb\u00e1zis strukt\u00far\u00e1ja alapj\u00e1n tervezni\" 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\/\">Eredeti<\/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>De a Hibernate \/ JPA eset\u00e9ben annyira egyszer\u0171t \u00edrni \"Java-ra\". <\/b><\/p>\n<p>Val\u00f3ban. A Hibernate \u00e9s felhaszn\u00e1l\u00f3i sz\u00e1m\u00e1ra ez egyszerre \u00e1ld\u00e1s \u00e9s \u00e1tok. A Hibernate-ben egyszer\u0171en meg\u00edrhat p\u00e1r entit\u00e1st, ahogy a k\u00f6vetkez\u0151k\u00e9ppen:<\/p>\n<pre><code class=\"java\">\t@Entity\nclass Book {\n  @Id\n  int id;\n  String title;\n}<\/code><\/pre>\n<p>\n\u00c9s majdnem minden k\u00e9sz is. Most a Hibernate feladata az, hogy gener\u00e1lja a bonyolult \"r\u00e9szleteket\", hogy ez az entit\u00e1s hogyan lesz defini\u00e1lva az SQL \"dialektus\u00e1nak\" DDL-j\u00e9n:<\/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 \u00e9s elkezdj\u00fck futtatni az alkalmaz\u00e1st. Val\u00f3ban nagyszer\u0171 lehet\u0151s\u00e9g, hogy gyorsan munk\u00e1hoz l\u00e1ssunk \u00e9s k\u00fcl\u00f6nb\u00f6z\u0151 dolgokat pr\u00f3b\u00e1ljunk ki.<\/p>\n<p>De engedje meg, hogy pontos\u00edtsak. Csal\u00f3t j\u00e1tszottam.<\/p>\n<ul>\n<li>De a Hibernate val\u00f3ban alkalmazni fogja ennek a n\u00e9vvel ell\u00e1tott els\u0151dleges kulcsnak a defin\u00edci\u00f3j\u00e1t?<\/li>\n<li>A Hibernate k\u00e9sz\u00edt indexet a TITLE eset\u00e9ben? \u2013 biztos vagyok benne, hogy sz\u00fcks\u00e9g\u00fcnk lesz r\u00e1. <\/li>\n<li>A Hibernate val\u00f3ban ezt a kulcsot fogja az Identity Specification azonos\u00edt\u00f3jak\u00e9nt l\u00e9trehozni?<\/li>\n<\/ul>\n<p>\nVal\u00f3sz\u00edn\u0171leg nem. Ha a projektedet a null\u00e1r\u00f3l fejleszted, mindig k\u00e9nyelmes egyszer\u0171en kidobni a r\u00e9gi adatb\u00e1zist, \u00e9s \u00fajat gener\u00e1lni, amint hozz\u00e1adtad a sz\u00fcks\u00e9ges annot\u00e1ci\u00f3kat. \u00cdgy a Book entit\u00e1s v\u00e9g\u00fcl a k\u00f6vetkez\u0151k\u00e9ppen fog kin\u00e9zni: <\/p>\n<pre><code class=\"java\">\t@Entity\n@Table(name = &quot;book&quot;, indexes = {\n  @Index(name = &quot;i_book_title&quot;, columnList = &quot;title&quot;)\n})\nclass Book {\n  @Id\n  @GeneratedValue(strategy = IDENTITY)\n  int id;\n  String title;\n}\n<\/code><\/pre>\n<p>\nMen\u0151. \u00dajragener\u00e1lni. Ism\u00e9t mondom, hogy ilyen esetben az elej\u00e9n nagyon k\u00f6nny\u0171 lesz.<\/p>\n<h4>De k\u00e9s\u0151bb ez\u00e9rt fizetni kell.<\/h4>\n<p>\nEl\u0151bb vagy ut\u00f3bb el kell menned a termel\u00e9sbe. Pont ekkor fog a modell meg\u00e1llni. Mert: <\/p>\n<p>A termel\u00e9sben m\u00e1r nem lehet sz\u00fcks\u00e9g eset\u00e9n kidobni a r\u00e9gi adatb\u00e1zist, \u00e9s mindent tiszta lappal kezdeni. Az adatb\u00e1zisod \u00f6r\u00f6k\u00f6lt\u00e9 v\u00e1lik.<\/p>\n<p>Mostant\u00f3l \u00f6r\u00f6kre \u00edrnod kell <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.jooq.org\/2014\/06\/25\/flyway-and-jooq-for-unbeatable-sql-development-productivity\/\">DDL migr\u00e1ci\u00f3s szkripteket, p\u00e9ld\u00e1ul Flyway seg\u00edts\u00e9g\u00e9vel.<\/a><\/noindex>. \u00c9s mi fog t\u00f6rt\u00e9nni a te entit\u00e1saiddal? Vagy k\u00e9zzel kell adapt\u00e1lnod \u0151ket (\u00e9s ezzel megdupl\u00e1zod a munk\u00e1dat), vagy megparancsolod a Hibernate-nek, hogy \u00fajra gener\u00e1lja \u0151ket sz\u00e1modra (mennyire val\u00f3sz\u00edn\u0171, hogy az \u00edgy gener\u00e1lt megfelel az elv\u00e1r\u00e1saidnak?) Mindk\u00e9t esetben vesz\u00edtesz.<\/p>\n<p>\u00cdgy h\u00e1t, amint \u00e1t\u00e9rsz a termel\u00e9sbe, sz\u00fcks\u00e9ged lesz forr\u00f3 jav\u00edt\u00e1sokra. Azokat nagyon gyorsan kell bevezetned a termel\u00e9sbe. Mivel nem k\u00e9sz\u00fclt\u00e9l fel, \u00e9s nem szervezted meg sim\u00e1n a migr\u00e1ci\u00f3idat a termel\u00e9shez, mindent brut\u00e1lisan jav\u00edtani fogsz. Azt\u00e1n m\u00e1r nem lesz id\u0151d mindent j\u00f3l csin\u00e1lni. \u00c9s hib\u00e1ztatni fogod a Hibernate-et, mert mindig b\u00e1rki m\u00e1s a hib\u00e1s, csak te nem\u2026<\/p>\n<p>Ehelyett, m\u00e1r az elej\u00e9n mindent teljesen m\u00e1sk\u00e9pp lehetett volna csin\u00e1lni. P\u00e9ld\u00e1ul kerek kerekeket tenni a biciklidre.<\/p>\n<h4>El\u0151sz\u00f6r az adatb\u00e1zis<\/h4>\n<p>\nAz adatb\u00e1zisod s\u00e9m\u00e1j\u00e1nak val\u00f3di \"igazs\u00e1ga\" \u00e9s a felette val\u00f3 \"szuverenit\u00e1s\" mag\u00e1ban az adatb\u00e1zisban rejlik. A s\u00e9ma csak mag\u00e1ban az adatb\u00e1zisban van meghat\u00e1rozva, \u00e9s sehol m\u00e1shol, \u00e9s minden \u00fcgyf\u00e9lnek van egy p\u00e9ld\u00e1nya err\u0151l a s\u00e9m\u00e1r\u00f3l, ez\u00e9rt teljesen \u00e9sszer\u0171 a s\u00e9ma \u00e9s annak \u00e9ps\u00e9ge betartat\u00e1s\u00e1nak kik\u00e9nyszer\u00edt\u00e9se \u2013 ott, ahol az inform\u00e1ci\u00f3 t\u00e1rolva van. <br \/>\nEz egy r\u00e9gi, s\u0151t kopott b\u00f6lcsess\u00e9g. Az els\u0151dleges \u00e9s egyedi kulcsok j\u00f3k. A k\u00fcls\u0151 kulcsok j\u00f3k. A megszor\u00edt\u00e1sok ellen\u0151rz\u00e9se j\u00f3. <noindex><a rel=\"nofollow\" href=\"https:\/\/community.oracle.com\/ideas\/13028\">\u00c1ll\u00edt\u00e1sok<\/a><\/noindex> \u2013 j\u00f3k. <\/p>\n<p>R\u00e1ad\u00e1sul ez m\u00e9g nem minden. P\u00e9ld\u00e1ul, ha Oracle-t haszn\u00e1l, val\u00f3sz\u00edn\u0171leg meg szeretn\u00e9 adni:<\/p>\n<ul>\n<li>Melyik t\u00e1blat\u00e9rben tal\u00e1lhat\u00f3 a t\u00e1bl\u00e1ja <\/li>\n<li>Mi a PCTFREE \u00e9rt\u00e9ke <\/li>\n<li>Mi a m\u00e9rete a sorozat\u00e1nak (azonos\u00edt\u00f3 ut\u00e1n)<\/li>\n<\/ul>\n<p>\nLehet, hogy mindez nem fontos kis rendszerekben, de nem sz\u00fcks\u00e9ges megv\u00e1rni, am\u00edg el\u00e9rj\u00fck a 'nagy adatok' ter\u00fclet\u00e9t \u2013 m\u00e1r kor\u00e1bban is hasznot h\u00fazhatunk az adatkezel\u00e9si optimaliz\u00e1ci\u00f3kb\u00f3l, amelyeket a szolg\u00e1ltat\u00f3 ny\u00fajt, mint p\u00e9ld\u00e1ul a fent eml\u00edtettek. Egyetlen ORM sem biztos\u00edtja a teljes DDL opci\u00f3k el\u00e9r\u00e9s\u00e9t, amelyeket esetleg szeretne haszn\u00e1lni az adatb\u00e1zis\u00e1ban. Az ORM-ek n\u00e9h\u00e1ny eszk\u00f6zt k\u00edn\u00e1lnak, amelyek seg\u00edtenek a DDL \u00edr\u00e1s\u00e1ban.<\/p>\n<p>De v\u00e9gs\u0151 soron egy j\u00f3l megtervezett s\u00e9ma csak DDL-ben van meg\u00edrva. B\u00e1rmely gener\u00e1lt DDL csak egy megk\u00f6zel\u00edt\u00e9s.<\/p>\n<h4>Mi a helyzet a kliensmodellel?<\/h4>\n<p>\nAhogy fent eml\u00edtettem, a kliensnek sz\u00fcks\u00e9ge van egy p\u00e9ld\u00e1nyra az adatb\u00e1zis s\u00e9m\u00e1j\u00e1r\u00f3l, kliensn\u00e9zetre. Felesleges eml\u00edteni, hogy ennek a kliensn\u00e9zetnek szinkronban kell lennie a val\u00f3s modellel. Hogyan lehet ezt a legjobban el\u00e9rni? K\u00f3dgener\u00e1torral.<\/p>\n<p>Minden adatb\u00e1zis SQL-en kereszt\u00fcl ny\u00fajtja a meta-inform\u00e1ci\u00f3it. \u00cdgy \u00e9rhetj\u00fck el az adatb\u00e1zis\u00e1b\u00f3l az \u00f6sszes t\u00e1bl\u00e1t k\u00fcl\u00f6nb\u00f6z\u0151 SQL dialektusokon:<\/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>\nEzeket a lek\u00e9rdez\u00e9seket (vagy hasonl\u00f3kat, att\u00f3l f\u00fcgg\u0151en, hogy figyelembe kell-e venni a n\u00e9zeteket, anyagilag megval\u00f3s\u00edtott n\u00e9zeteket, t\u00e1bl\u00e1zatos \u00e9rt\u00e9k\u0171 funkci\u00f3kat) szint\u00e9n v\u00e9grehajtj\u00e1k a h\u00edv\u00e1s seg\u00edts\u00e9g\u00e9vel <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.oracle.com\/javase\/10\/docs\/api\/java\/sql\/DatabaseMetaData.html#getTables(java.lang.String,java.lang.String,java.lang.String,java.lang.String%5B%5D)\"><code>DatabaseMetaData.getTables()<\/code><\/a><\/noindex> JDBC-b\u0151l, vagy a jOOQ meta-modulj\u00e1n kereszt\u00fcl.<\/p>\n<p>Ezekb\u0151l a lek\u00e9rdez\u00e9sekb\u0151l viszonylag k\u00f6nnyen gener\u00e1lhatunk b\u00e1rmilyen kliensszeml\u00e9letet az adatb\u00e1zis modellj\u00e9r\u0151l, f\u00fcggetlen\u00fcl att\u00f3l, hogy milyen technol\u00f3gia van haszn\u00e1latban a klienseken.<\/p>\n<ul>\n<li>Ha JDBC-t vagy Springet haszn\u00e1l, l\u00e9trehozhat egy sor string konstansot <\/li>\n<li>Ha JPA-t haszn\u00e1l, a saj\u00e1t entit\u00e1sait gener\u00e1lhatja <\/li>\n<li>Ha jOOQ-ot haszn\u00e1l, akkor a jOOQ meta-modelt gener\u00e1lhat.<\/li>\n<\/ul>\n<p>\nAtt\u00f3l f\u00fcgg\u0151en, hogy milyen m\u00e9rt\u00e9k\u0171 lehet\u0151s\u00e9geket k\u00edn\u00e1l a kliens API-ja (pl. jOOQ vagy JPA), a gener\u00e1lt meta-modell val\u00f3ban gazdag \u00e9s teljes lehet. Vegy\u00fck p\u00e9ld\u00e1ul a nem explicit \u00f6sszekapcsol\u00e1s lehet\u0151s\u00e9g\u00e9t, <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.jooq.org\/2018\/02\/20\/type-safe-implicit-join-through-path-navigation-in-jooq-3-11\/\">amely a jOOQ 3.11-ben jelent meg,<\/a><\/noindex>, \u00e9s amely a t\u00e1bl\u00e1i k\u00f6z\u00f6tti k\u00fcls\u0151 kulcsok kapcsolatair\u00f3l sz\u00e1rmaz\u00f3 meta-inform\u00e1ci\u00f3ra \u00e9p\u00edt.<\/p>\n<p>Mostant\u00f3l b\u00e1rmilyen adatb\u00e1zis-m\u00f3dos\u00edt\u00e1s automatikusan friss\u00edti a kliens k\u00f3dot. K\u00e9pzelje el p\u00e9ld\u00e1ul:<\/p>\n<pre><code class=\"sql\">ALTER TABLE book RENAME COLUMN title TO book_title;<\/code><\/pre>\n<p>\nVal\u00f3ban k\u00e9tszer szeretn\u00e9 ezt a munk\u00e1t elv\u00e9gezni? Semmik\u00e9ppen. Csak r\u00f6gz\u00edtj\u00fck a DDL-t, \u00e1tfuttatjuk a fejleszt\u00e9si folyamat\u00e1n, \u00e9s megkapjuk a friss\u00edtett entit\u00e1st:<\/p>\n<pre><code class=\"java\">@Entity\n@Table(name = &quot;book&quot;, indexes = {\n \n  \\\/\\\/ Gondolt\u00e1l m\u00e1r erre?\n  @Index(name = &quot;i_book_title&quot;, columnList = &quot;book_title&quot;)\n})\nclass Book {\n  @Id\n  @GeneratedValue(strategy = IDENTITY)\n  int id;\n \n  @Column(&quot;book_title&quot;)\n  String bookTitle;\n}<\/code><\/pre>\n<p>\nVagy a friss\u00edtett jOOQ oszt\u00e1ly. A DDL legt\u00f6bb m\u00f3dos\u00edt\u00e1sa a szemantik\u00e1ban is t\u00fckr\u00f6z\u0151dik, nemcsak a szintaxisban. Ez\u00e9rt hasznos lehet megn\u00e9zni a leford\u00edtott k\u00f3dban, hogy melyik k\u00f3dot \u00e9rintheti az adatb\u00e1zis\u00e1nak b\u0151v\u00edt\u00e9se.<\/p>\n<h4>Az egyetlen igazs\u00e1g<\/h4>\n<p>\nF\u00fcggetlen\u00fcl att\u00f3l, hogy milyen technol\u00f3gi\u00e1t haszn\u00e1l, mindig van egy modell, amely a bizonyos alrendszer egyetlen igaz forr\u00e1sa \u2013 vagy legal\u00e1bbis ezt kellene c\u00e9loznunk, \u00e9s elker\u00fclni azt az enterprise z\u0171rzavart, ahol az 'igazs\u00e1g' egyszerre van mindenhol \u00e9s sehol. Minden sokkal egyszer\u0171bb lehet. Ha csak XML f\u00e1jlokat cser\u00e9lget m\u00e1s rendszerekkel, egyszer\u0171en haszn\u00e1lja az XSD-t. N\u00e9zze meg a jOOQ INFORMATION_SCHEMA meta-modellj\u00e9t XML form\u00e1ban:<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>Az XSD j\u00f3l \u00e9rthet\u0151<\/li>\n<li>Az XSD nagyon j\u00f3l jel\u00f6li az XML tartalm\u00e1t, \u00e9s lehet\u0151v\u00e9 teszi a valid\u00e1l\u00e1st minden kliensnyelven <\/li>\n<li>Az XSD j\u00f3l verzion\u00e1lhat\u00f3, \u00e9s kiterjedt visszafel\u00e9 kompatibilit\u00e1ssal b\u00edr <\/li>\n<li>Az XSD Java k\u00f3dra is leford\u00edthat\u00f3 az XJC seg\u00edts\u00e9g\u00e9vel<\/li>\n<\/ul>\n<p>\nAz utols\u00f3 pont fontos. Amikor k\u00fcls\u0151 rendszerrel kommunik\u00e1lunk XML \u00fczenetek seg\u00edts\u00e9g\u00e9vel, biztosak szeretn\u00e9nk lenni \u00fczeneteink \u00e9rv\u00e9nyess\u00e9g\u00e9ben. Ezt nagyon k\u00f6nnyen el\u00e9rhetj\u00fck JAXB, XJC \u00e9s XSD haszn\u00e1lat\u00e1val. Teljes \u0151r\u00fclts\u00e9g lenne azt gondolni, hogy a \u201eJava els\u0151\u201d tervez\u00e9si megk\u00f6zel\u00edt\u00e9s mellett, ahol \u00fczeneteinket Java objektumok form\u00e1j\u00e1ban k\u00e9sz\u00edtj\u00fck, valahogy vil\u00e1gosan \u00e1t tudn\u00e1nk t\u00e9rni XML-re \u00e9s elk\u00fcldeni egy m\u00e1sik rendszer sz\u00e1m\u00e1ra. Az \u00edgy gener\u00e1lt XML nagyon gyenge min\u0151s\u00e9g\u0171 lenne, nem dokument\u00e1lt, \u00e9s nehezen fejleszthet\u0151. Ha ilyen interf\u00e9szen SLA (szolg\u00e1ltat\u00e1si szint meg\u00e1llapod\u00e1s) l\u00e9tezne, azonnal elhib\u00e1zn\u00e1nk.<\/p>\n<p>\u0150szint\u00e9n sz\u00f3lva, pontosan ez t\u00f6rt\u00e9nik folyamatosan a JSON API-kkal, de ez m\u00e1r egy m\u00e1sik t\u00f6rt\u00e9net, legk\u00f6zelebb majd megint panaszkodom\u2026 <\/p>\n<h4>Adatb\u00e1zisok: ugyanez<\/h4>\n<p>\nAdatb\u00e1zisokkal dolgozva meg\u00e9rti, hogy mindegyik alapvet\u0151en hasonl\u00f3. Az adatb\u00e1zis a saj\u00e1t adatai felett rendelkezik, \u00e9s ir\u00e1ny\u00edtania kell a s\u00e9m\u00e1t. A s\u00e9m\u00e1ban v\u00e9grehajtott minden m\u00f3dos\u00edt\u00e1st k\u00f6zvetlen\u00fcl a DDL-ben kell v\u00e9grehajtani, hogy friss\u00fclj\u00f6n az egyetlen igazs\u00e1gforr\u00e1s.<\/p>\n<p>Amikor az igazs\u00e1gforr\u00e1s friss\u00edt\u00e9se megt\u00f6rt\u00e9nt, minden kliensnek is friss\u00edtenie kell a modelljeinek m\u00e1solat\u00e1t. N\u00e9h\u00e1ny kliens Java nyelven k\u00e9sz\u00fclt jOOQ \u00e9s Hibernate vagy JDBC (vagy mindegyik) haszn\u00e1lat\u00e1val. M\u00e1s kliensek Perl nyelven k\u00e9sz\u00fcltek (sok szerencs\u00e9t k\u00edv\u00e1nok nekik), m\u00edg harmadik felek C# nyelven \u00edr\u00f3dtak. Ez nem sz\u00e1m\u00edt. A f\u0151 modell az adatb\u00e1zisban tal\u00e1lhat\u00f3. Az ORM-el gener\u00e1lt modellek \u00e1ltal\u00e1ban gyenge min\u0151s\u00e9g\u0171ek, rosszul dokument\u00e1ltak, \u00e9s nehezen fejleszthet\u0151k.<\/p>\n<p>Ez\u00e9rt ne k\u00f6vessen el hib\u00e1kat. Kezdett\u0151l fogva ker\u00fclj\u00f6n el hib\u00e1kat. Dolgozzon az adatb\u00e1zisb\u00f3l. \u00c9p\u00edtsen egy olyan telep\u00edt\u00e9si folyamatot, amelyet automatiz\u00e1lni lehet. Tartalmazza a k\u00f3dgener\u00e1torokat, hogy k\u00e9nyelmesen tudja m\u00e1solni az adatb\u00e1zis modellj\u00e9t \u00e9s \u00e1tadni a klienseknek. \u00c9s fejezze be a k\u00f3dgener\u00e1torok miatti aggodalmaskod\u00e1st. J\u00f3 dolgok. Ezekkel termel\u00e9kenyebb\u00e9 v\u00e1lik. Csak egy kis id\u0151t kell sz\u00e1nnia a kezdeti be\u00e1ll\u00edt\u00e1sra \u2013 \u00e9s a tov\u00e1bbiakban \u00e9veken \u00e1t fokozott termel\u00e9kenys\u00e9g v\u00e1r \u00d6nre, amelyb\u0151l a projektje t\u00f6rt\u00e9nete \u00e1ll majd \u00f6ssze.<\/p>\n<p>M\u00e9g ne k\u00f6sz\u00f6nj\u00f6n, k\u00e9s\u0151bb.<\/p>\n<h4>Magyar\u00e1zat<\/h4>\n<p>\nA tiszt\u00e1z\u00e1s kedv\u00e9\u00e9rt: ez a cikk semmik\u00e9ppen sem n\u00e9pszer\u0171s\u00edti azt, hogy az adatb\u00e1zis modellje k\u00f6r\u00e9 kellene \u00e9p\u00edteni az eg\u00e9sz rendszert (azaz a t\u00e1rgyk\u00f6rt, az \u00fczleti logik\u00e1t stb.). Ebben a cikkben arr\u00f3l besz\u00e9lek, hogy az adatb\u00e1zissal interakci\u00f3ban l\u00e9v\u0151 kliensk\u00f3dnak az adatb\u00e1zis modellj\u00e9b\u0151l kell kiindulnia, \u00fagy, hogy benne ne jelenjen meg az adatb\u00e1zis modellje \u201eels\u0151 oszt\u00e1ly\u201d st\u00e1tuszban. Az ilyen logika \u00e1ltal\u00e1ban a kliens adat-hozz\u00e1f\u00e9r\u00e9si szintj\u00e9n tal\u00e1lhat\u00f3.<\/p>\n<p>A k\u00e9tfokozat\u00fa architekt\u00far\u00e1kban, amelyek m\u00e9g mindig n\u00e9hol fennmaradtak, az ilyen rendszer modellje lehet az egyetlen lehets\u00e9ges. Azonban a legt\u00f6bb rendszerben az adat-hozz\u00e1f\u00e9r\u00e9si szint nekem \u201ealrendszernek\u201d t\u0171nik, amely beburkolja az adatb\u00e1zis modellt.<\/p>\n<h4>Kiv\u00e9tel<\/h4>\n<p>\nMinden szab\u00e1lynak vannak kiv\u00e9telei, \u00e9s m\u00e1r mondtam, hogy a prim\u00e1tusok adatb\u00e1zis megk\u00f6zel\u00edt\u00e9se \u00e9s a forr\u00e1sk\u00f3d gener\u00e1l\u00e1sa n\u00e9ha nem megfelel\u0151 lehet. \u00cdme p\u00e1r ilyen kiv\u00e9tel (val\u00f3sz\u00edn\u0171leg lesznek m\u00e1sok is):<\/p>\n<ul>\n<li>Amikor a s\u00e9ma ismeretlen, \u00e9s meg kell nyitni. P\u00e9ld\u00e1ul, ha te vagy az eszk\u00f6zszolg\u00e1ltat\u00f3, aki seg\u00edt a felhaszn\u00e1l\u00f3knak eligibiliz\u00e1lni b\u00e1rmilyen s\u00e9ma szerint. H\u0171ha. Itt m\u00e1r nem lehet gener\u00e1lni a k\u00f3dot. De az\u00e9rt \u2013 az adatb\u00e1zis mindenekel\u0151tt.<\/li>\n<li>Amikor a s\u00e9ma menet k\u00f6zben kell, hogy gener\u00e1l\u00f3djon, hogy megoldjon valamilyen feladatot. Ez a p\u00e9lda kiss\u00e9 t\u00fals\u00e1gosan is opulent verzi\u00f3ja a mint\u00e1nak <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Entity%E2%80%93attribute%E2%80%93value_model\">entity attribute value<\/a><\/noindex>, azaz val\u00f3j\u00e1ban nincs pontosan meghat\u00e1rozott s\u00e9m\u00e1d. Ebben az esetben gyakran m\u00e9g azzal sem lehet biztosan \u00e9lni, hogy a RDBMS neked megfelel\u0151 lesz.<\/li>\n<\/ul>\n<p>\nA kiv\u00e9telek alapvet\u0151en kiv\u00e9telesek. A RDBMS haszn\u00e1lat\u00e1val kapcsolatos legt\u00f6bb esetben a s\u00e9ma el\u0151re ismert, a RDBMS-en bel\u00fcl tal\u00e1lhat\u00f3, \u00e9s az egyetlen \u201eigazs\u00e1g\u201d forr\u00e1sa, \u00e9s minden kliensnek m\u00e1solatot kell szereznie, amely ebb\u0151l sz\u00e1rmazik. Ide\u00e1lisan ebben az esetben k\u00f3dgener\u00e1tort kellene alkalmazni.<br \/>\n<br \/>Forr\u00e1s: <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 5.0.3 - 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\" \/>\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\/istina-prezhde-vsego-ili-pochemu-sistemu-nuzhno-proektirovat-ishodya-iz-ustrojstva-bazy-dannyh\" \/>\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\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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hu\/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\udd47Az igazs\u00e1g mindenekel\u0151tt, avagy mi\u00e9rt kell a rendszert az adatb\u00e1zis fel\u00e9p\u00edt\u00e9se alapj\u00e1n tervezni | ProHoster","description":"\u00dcdv, Habr! Tov\u00e1bbra is kutatjuk a t\u00e9m\u00e1t","canonical_url":"https:\/\/prohoster.info\/hu\/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":"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\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","og:url":"https:\/\/prohoster.info\/hu\/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","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\/79465","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=79465"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/79465\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/79466"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=79465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=79465"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=79465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}