{"id":55011,"date":"2020-01-10T00:00:00","date_gmt":"2020-01-09T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/bd-messendzhera-ch-1-proektiruem-karkas-bazy"},"modified":"2020-02-18T14:03:05","modified_gmt":"2020-02-18T11:03:05","slug":"bd-messendzhera-ch-1-proektiruem-karkas-bazy","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy","title":{"rendered":"S\u00f5numite andmebaas (jag. 1): projekteerime andmebaasi karkassi","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Kuidas saame \u00e4ri n\u00f5udmisi t\u00f5lkida konkreetseteks andmestruktuurideks, kasutades n\u00e4itena andmebaasi projekteerimist \u201enullist\u201d s\u00f5numite jaoks.<\/p>\n<ul>\n<li>Jagu 1: projekteerime andmebaasi karkassi<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">Jagu 2: sektsioneerime \u201ereaalajas\u201d<\/a><\/noindex><\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"S\u00f5numite andmebaas (jag. 1): projekteerime andmebaasi karkassi\" src=\"\/wp-content\/uploads\/2020\/01\/d4e85052405da3f6580e4e931c292079.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMeie andmebaas ei saa olema nii ulatuslik ja jaotatud, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/vk\/blog\/342570\/\">nagu VKontakte'il<\/a><\/noindex> v\u00f5i <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/340976\/\">Badoo<\/a><\/noindex>, vaid \u201eet lihtsalt oleks\u201d, aga oleks h\u00e4sti \u2014 funktsionaalselt, kiiresti ja <b>mahtuks \u00fchele serverile<\/b> PostgreSQL \u2014 et oleks v\u00f5imalik kuskil k\u00fclgselt teenuse eraldi eksemplari k\u00e4ivitada, n\u00e4iteks.<\/p>\n<p>Seega ei puuduta me shardimise, replikatsiooni ja geograafiliselt jaotatud s\u00fcsteemide teemasid, vaid keskendume andmebaasi sisemistele skeemilahendustele.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Samm 1: Veidi \u00e4ri-spetsiifikat<\/h2>\n<p>\nMeie s\u00f5numite vahetust ei projekteeri me abstraktselt, vaid integreerime selle keskkonda <noindex><a rel=\"nofollow\" href=\"https:\/\/sbis.ru\/help\/work_in\/sms\/\">ettev\u00f5tte sotsiaalv\u00f5rgustikku<\/a><\/noindex>. See t\u00e4hendab, et inimesed ei tee lihtsalt teksti vahetust, vaid suhtlevad omavahel teatud \u00e4ri\u00fclesannete lahendamise kontekstis.<\/p>\n<p>Aga millised \u00e4ri\u00fclesanded v\u00f5ivad olla?.. Vaatame Vasili n\u00e4itel \u2014 arendusosakonna juhi kaudu.<\/p>\n<ul>\n<li><i>\u201eNikolai, selle \u00fclesande kohta on patch t\u00e4na juba vajalik!\u201d<\/i><br \/>\nSee t\u00e4hendab, et vestlus v\u00f5ib toimuda mingisuguse <b>dokumentide<\/b>.<\/li>\n<li><i>\u201eKola, l\u00e4heme \u00f5htul Dota'sse?\u201d<\/i><br \/>\nSee t\u00e4hendab, et isegi \u00fche paarilise vahel v\u00f5ib samaaegselt k\u00e4ia suhtlemine <b>erinevatel teemadel<\/b>.<\/li>\n<li><i>\u201ePjotr, Nikolai, vaadake manustes uus serveri hind.\u201d<\/i><br \/>\nNii, \u00fchel s\u00f5numil v\u00f5ib olla <b>mitu adressaati<\/b>. Selle juures v\u00f5ib s\u00f5num sisaldada <b>manustatud faile<\/b>.<\/li>\n<li><i>\u201eSemen, vaata sa ka.\u201d<\/i><br \/>\nJa peaks olema v\u00f5imalus juba olemasolevasse vestlusesse <b>uut osalist kutsuda<\/b>.<\/li>\n<\/ul>\n<p>\nPeatume praegu sellel \u201eilmse\u201d vajaduste nimekirjal.<\/p>\n<blockquote><p>Ilma rakenduse spetsiifika ja selle seatud piirangute m\u00f5istmiseta on peaaegu v\u00f5imatu projekteerida <b>efektiivset<\/b> andmebaasi skeemi selle lahendamiseks.<\/p><\/blockquote>\n<p><\/p>\n<h2>Samm 2: Minimaalne loogiline skeem<\/h2>\n<p>\nSkeem on muu hulgas v\u00e4ga sarnane e-kirjavahetusele \u2014 traditsiooniline \u00e4ri l\u00e4biviimise instrument. T\u00f5epoolest, paljude \u00e4ri\u00fclesannete \u201ealgsed\u201d lahendused sarnanevad teineteisele, seega on ka nende lahendamiseks kasutatavad vahendid struktuurilt sarnased.<\/p>\n<p>Kinnitan juba saavutatud loogilise skeemi suhete kohta. Meie mudeli arusaamise lihtsustamiseks kasutame k\u00f5ige primitiivsemat varianti ER-mudeli kuvamiseks <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ER-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C\">ER-mudel<\/a><\/noindex> ilma UML v\u00f5i IDEF mudeliteta:<\/p>\n<p><img decoding=\"async\" alt=\"S\u00f5numite andmebaas (jag. 1): projekteerime andmebaasi karkassi\" src=\"\/wp-content\/uploads\/2020\/01\/75d0b3cf9e5a44ae3e243449fa406fbc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMeie n\u00e4ites on isik, dokument ja faili binaarne \"keha\" \"v\u00e4listena\" entiteetid, mis eksisteerivad ka ilma meie teenuseta. Seega v\u00f5tame need edaspidi lihtsalt m\u00f5ne linkina \"kusagile\" UUID alusel.<\/p>\n<blockquote><p>Joonistage <b>skeeme nii lihtsasti kui v\u00f5imalik<\/b> \u2014 enamik neist, kellele te neid n\u00e4itate, ei ole UML\/IDEF lugemise eksperdid. Kuid \u2014 kindlasti joonistage.<\/p><\/blockquote>\n<p><\/p>\n<h2>Samm 3: Loome tabelite struktuuri<\/h2>\n<p>\n<b class=\"spoiler_title\">Tabelite ja v\u00e4ljade nimedest<\/b>V\u00f5ib olla erinevaid arvamusi \u201evene\u201c nime kohta v\u00e4ljadele ja tabelitele, aga see on maits k\u00fcsimus. Kuna <noindex><a rel=\"nofollow\" href=\"https:\/\/tensor.ru\/about\/career\/vacancies\">meie \"Tensoris\"<\/a><\/noindex> pole v\u00e4lismaalasi arendajaid, ja PostgreSQL v\u00f5imaldab meil nimetada isegi hierogl\u00fc\u00fcfidena, kui need <u>on tsitaatides<\/u>, siis eelistame nimetada objekte \u00fcheselt arusaadavalt, et ei tekiks segadust.<br \/>\nKuna s\u00f5numeid kirjutavad mitmed inimesed korraga, v\u00f5ivad m\u00f5ned neist seda teha <u>off-line re\u017eiimis<\/u>, siis k\u00f5ige lihtsam variant on <b>kasutada UUID-sid identifikaatoritena<\/b> mitte ainult v\u00e4liste entiteetide, vaid ka k\u00f5igi objektide jaoks meie teenuses. Ning nende genereerimist saab teha isegi kliendi poolel \u2014 see aitab meil toetada s\u00f5numite saatmist l\u00fchiajalisel DB k\u00e4ttesaamatuse ajal, samas kui kokkulangevuse t\u00f5en\u00e4osus on \u00e4\u00e4rmiselt v\u00e4ike.<\/p>\n<p>Meie andmebaasi must struktuur n\u00e4eb v\u00e4lja j\u00e4rgmine:<br \/>\n<b class=\"spoiler_title\">Tabelid: RU<\/b><\/p>\n<pre><code class=\"sql\">CREATE TABLE \"Teema\"(\n  \"Teema\"\n    uuid\n      PRIMARY KEY\n, \"Dokument\"\n    uuid\n, \"Nimi\"\n    text\n);\n\nCREATE TABLE \"S\u00f5num\"(\n  \"S\u00f5num\"\n    uuid\n      PRIMARY KEY\n, \"Teema\"\n    uuid\n, \"Autor\"\n    uuid\n, \"Kuup\u00e4evAeg\"\n    timestamp\n, \"Tekst\"\n    text\n);\n\nCREATE TABLE \"Adressaat\"(\n  \"S\u00f5num\"\n    uuid\n, \"Isik\"\n    uuid\n, PRIMARY KEY(\"S\u00f5num\", \"Isik\")\n);\n\nCREATE TABLE \"Fail\"(\n  \"Fail\"\n    uuid\n      PRIMARY KEY\n, \"S\u00f5num\"\n    uuid\n, \"BLOB\"\n    uuid\n, \"Nimi\"\n    text\n);<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Tabelid: EN<\/b><\/p>\n<pre><code class=\"sql\">CREATE TABLE theme(\n  theme\n    uuid\n      PRIMARY KEY\n, document\n    uuid\n, title\n    text\n);\n\nCREATE TABLE message(\n  message\n    uuid\n      PRIMARY KEY\n, theme\n    uuid\n, author\n    uuid\n, dt\n    timestamp\n, body\n    text\n);\n\nCREATE TABLE message_addressee(\n  message\n    uuid\n, person\n    uuid\n, PRIMARY KEY(message, person)\n);\n\nCREATE TABLE message_file(\n  file\n    uuid\n      PRIMARY KEY\n, message\n    uuid\n, content\n    uuid\n, filename\n    text\n);<\/code><\/pre>\n<p><\/p>\n<blockquote><p>Lihtsaim viis formaadi kirjeldamiseks on \"n\u00e4idata\" suhete graafikut <b>tabelitest, mis ei viita<\/b> ise kellelegi.<\/p><\/blockquote>\n<p><\/p>\n<h2>Samm 4: Selgitame v\u00e4lja mitte-eeldatavad vajadused<\/h2>\n<p>\nK\u00f5ik, oleme projekteerinud andmebaasi, kuhu saab suurep\u00e4raselt kirjutada ja <i><b>kuidagi<\/b><\/i> lugeda.<\/p>\n<p>Asetame end meie teenuse kasutaja asemele \u2014 mida me tahaksime selle abil teha?<\/p>\n<ul>\n<li><i>Viimased s\u00f5numid<\/i><br \/>\nSee on <b>ajaliselt j\u00e4rjestatud<\/b> erinevate tunnuste j\u00e4rgi minu s\u00f5numite register. Kus ma olen \u00fcks adressaatidest, kus ma olen autor, kus mulle kirjutati, aga ma ei vastanud, kus mulle ei vastatud, ...<\/li>\n<li><i>Vestluse osalised<\/i><br \/>\nKes \u00fcldse osaleb selles pika-pika jututoas?<\/li>\n<\/ul>\n<p>\nMeie struktuur v\u00f5imaldab lahendada m\u00f5lemad need \u00fclesanded \"\u00fcldiselt\", kuid kiiresti \u2014 ei. Probleem on see, et esimeses \u00fclesandes sortimise jaoks <b>ei saa luua indeksi<\/b>, mis sobiks igale osalejale (ja tuleb v\u00e4lja v\u00f5tta k\u00f5ik kirjed), aga teise lahendamiseks on vaja <b>v\u00e4lja v\u00f5tta k\u00f5ik s\u00f5numid<\/b> teema kohta.<\/p>\n<blockquote><p>Etteplaneerimata kasutaja\u00fclesanded v\u00f5ivad t\u00f5siselt <b>madaldada j\u00f5udlust<\/b>.<\/p><\/blockquote>\n<p><\/p>\n<h2>Samm 5: M\u00f5istlik denormaliseerimine<\/h2>\n<p>\nM\u00f5lemad meie probleemid aitavad lahendada t\u00e4iendavad tabelid, kuhu me <b>dubleerime osa andmeid<\/b>, vajalikud sisseehitatud indeksite loomiseks meie \u00fclesannetele sobivalt.<br \/>\n<img decoding=\"async\" alt=\"S\u00f5numite andmebaas (jag. 1): projekteerime andmebaasi karkassi\" src=\"\/wp-content\/uploads\/2020\/01\/f136a9904518b05bca74cc2b9c2f01b2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b class=\"spoiler_title\">Tabelid: RU<\/b><\/p>\n<pre><code class=\"sql\">CREATE TABLE \"S\u00f5numiteRegister\"(\n  \"Omandaja\"\n    uuid\n, \"RegisterT\u00fc\u00fcp\"\n    smallint\n, \"Kuup\u00e4evAeg\"\n    timestamp\n, \"S\u00f5num\"\n    uuid\n, PRIMARY KEY(\"Omandaja\", \"RegisterT\u00fc\u00fcp\", \"S\u00f5num\")\n);\nCREATE INDEX ON \"S\u00f5numiteRegister\"(\"Omandaja\", \"RegisterT\u00fc\u00fcp\", \"Kuup\u00e4evAeg\" DESC);\n\nCREATE TABLE \"TeemaOsaline\"(\n  \"Teema\"\n    uuid\n, \"Isik\"\n    uuid\n, PRIMARY KEY(\"Teema\", \"Isik\")\n);<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Tabelid: EN<\/b><\/p>\n<pre><code class=\"sql\">CREATE TABLE message_registry(\n  owner\n    uuid\n, registry\n    smallint\n, dt\n    timestamp\n, message\n    uuid\n, PRIMARY KEY(owner, registry, message)\n);\nCREATE INDEX ON message_registry(owner, registry, dt DESC);\n\nCREATE TABLE theme_participant(\n  theme\n    uuid\n, person\n    uuid\n, PRIMARY KEY(theme, person)\n);<\/code><\/pre>\n<p>\nSiin rakendasime kaks t\u00fc\u00fcpilist l\u00e4henemisviisi abitablejate loomisel:<\/p>\n<ul>\n<li><b>Kirjete paljundamine<\/b><br \/>\nLoome \u00fche algse s\u00f5numi kohta kohe mitu tulemust erinevates registrites erinevatele omanikele \u2014 nagu saatjale, nii ka saajale. Ent iga register katab n\u00fc\u00fcd indeksi \u2014 kuna t\u00fc\u00fcpilises olukorras tahame n\u00e4ha ainult esimest lehte.<\/li>\n<li><b>Kirjete unikaalsus<\/b><br \/>\nIga s\u00f5numi saatmise korral teatud teema raames piisab, kui kontrollida, kas selline kirje juba eksisteerib. Kui ei \u2014 lisame selle oma \"s\u00f5nastikku\".<\/li>\n<\/ul>\n<p>\nJ\u00e4rgmises artikli osas r\u00e4\u00e4gitakse <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">jaotamise rakendamisest<\/a><\/noindex> meie andmebaasi struktuuri.<br \/>\n<br \/>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483176\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u00ab\u0441 \u043d\u0443\u043b\u044f\u00bb \u0431\u0430\u0437\u044b \u0434\u043b\u044f \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430. \u0427\u0430\u0441\u0442\u044c 1: \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u0430\u0440\u043a\u0430\u0441 \u0431\u0430\u0437\u044b \u0427\u0430\u0441\u0442\u044c 2: \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u00ab\u043d\u0430\u0436\u0438\u0432\u0443\u044e\u00bb \u041d\u0430\u0448\u0430 \u0431\u0430\u0437\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0442\u0430\u043a\u043e\u0439 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043d\u043e\u0439 \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439, \u043a\u0430\u043a \u0443 \u0412\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u0435 \u0438\u043b\u0438 Badoo, \u0430 \u00ab\u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e\u00bb, \u043d\u043e \u0431\u044b\u043b\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e, \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u0443\u043c\u0435\u0449\u0430\u043b\u043e\u0441\u044c \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 PostgreSQL \u2014 \u0447\u0442\u043e\u0431\u044b [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-55011","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u00ab\u0441 \u043d\u0443\u043b\u044f\u00bb \u0431\u0430\u0437\u044b \u0434\u043b\u044f \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430. \u0427\u0430\u0441\u0442\u044c 1: \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u0430\u0440\u043a\u0430\u0441 \u0431\u0430\u0437\u044b\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0411\u0414 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430 (\u0447.1): \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u0430\u0440\u043a\u0430\u0441 \u0431\u0430\u0437\u044b | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u00ab\u0441 \u043d\u0443\u043b\u044f\u00bb \u0431\u0430\u0437\u044b \u0434\u043b\u044f \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430. \u0427\u0430\u0441\u0442\u044c 1: \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u0430\u0440\u043a\u0430\u0441 \u0431\u0430\u0437\u044b\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy\" \/>\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-01-09T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:03:05+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\udd47Messenger'i andmebaas (1. osa): projekteerime andmebaasi raamistiku | ProHoster","description":"Kuidas saab \u00e4rin\u00f5uded t\u00f5lkida konkreetseteks andmestruktuuri, kasutades n\u00e4itena nullist \u00fcles ehitamise projekti messenger'i andmebaasi. Osa 1: projekteerime andmebaasi raamistiku","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0411\u0414 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430 (\u0447.1): \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u0430\u0440\u043a\u0430\u0441 \u0431\u0430\u0437\u044b | ProHoster","og:description":"\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u00ab\u0441 \u043d\u0443\u043b\u044f\u00bb \u0431\u0430\u0437\u044b \u0434\u043b\u044f \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430. \u0427\u0430\u0441\u0442\u044c 1: \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u0430\u0440\u043a\u0430\u0441 \u0431\u0430\u0437\u044b","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy","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-01-09T21:00:00+00:00","article:modified_time":"2020-02-18T11:03:05+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"55011","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":"2026-01-24 13:30:15","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 17:27:13","updated":"2026-01-24 13:30:15","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/55011","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=55011"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/55011\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=55011"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=55011"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=55011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}