{"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\/cs\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy","title":{"rendered":"Datab\u00e1ze messengeru (\u010d. 1): navrhujeme r\u00e1mec datab\u00e1ze","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Jak lze p\u0159ev\u00e9st obchodn\u00ed po\u017eadavky do konkr\u00e9tn\u00edch datov\u00fdch struktur na p\u0159\u00edkladu navrhov\u00e1n\u00ed datab\u00e1ze \"od nuly\" pro messenger.<\/p>\n<ul>\n<li>\u010c\u00e1st 1: navrhujeme r\u00e1mec datab\u00e1ze<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">\u010c\u00e1st 2: sekciujeme \"na\u017eivo\"<\/a><\/noindex><\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Datab\u00e1ze messengeru (\u010d. 1): navrhujeme r\u00e1mec datab\u00e1ze\" src=\"\/wp-content\/uploads\/2020\/01\/d4e85052405da3f6580e4e931c292079.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNa\u0161e datab\u00e1ze nebude tak rozs\u00e1hl\u00e1 a distribuovan\u00e1, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/vk\/blog\/342570\/\">jak u VKontakte<\/a><\/noindex> nebo <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/340976\/\">Badoo<\/a><\/noindex>, ale \"aby to bylo\", a p\u0159itom dob\u0159e \u2014 funk\u010dn\u011b, rychle a <b>ve\u0161lo se na jeden server<\/b> PostgreSQL \u2014 aby bylo mo\u017en\u00e9 nasadit samostatnou instance slu\u017eby n\u011bkde bokem, nap\u0159\u00edklad.<\/p>\n<p>Proto se nebudeme dot\u00fdkat ot\u00e1zek shardingu, replikace a geograficky distribuovan\u00fdch syst\u00e9m\u016f, ale zam\u011b\u0159\u00edme se na sch\u00e9matick\u00e1 \u0159e\u0161en\u00ed uvnit\u0159 DB.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Krok 1: Trochu obchodn\u00ed specifiky<\/h2>\n<p>\nNa\u0161i zpr\u00e1vu budeme navrhovat nikoli abstraktn\u011b, ale integrovat ji do prost\u0159ed\u00ed <noindex><a rel=\"nofollow\" href=\"https:\/\/sbis.ru\/help\/work_in\/sms\/\">korpor\u00e1tn\u00ed soci\u00e1ln\u00ed s\u00edt\u011b<\/a><\/noindex>. To znamen\u00e1, \u017ee lid\u00e9 u n\u00e1s ne \"jen tak si p\u00ed\u0161\u00ed\", ale komunikuj\u00ed mezi sebou v kontextu \u0159e\u0161en\u00ed ur\u010dit\u00fdch obchodn\u00edch \u00fakol\u016f.<\/p>\n<p>Jak\u00e9 obchodn\u00ed \u00fakoly existuj\u00ed?.. Pod\u00edv\u00e1me se na p\u0159\u00edkladu Vasila \u2014 vedouc\u00edho odd\u011blen\u00ed v\u00fdvoje.<\/p>\n<ul>\n<li><i>\"Nikole, k t\u00e9to \u00faloze je patch pot\u0159eba u\u017e dnes!\"<\/i><br \/>\nTo znamen\u00e1, \u017ee diskuse m\u016f\u017ee prob\u00edhat v kontextu n\u011bjak\u00e9ho <b>dokumentu<\/b>.<\/li>\n<li><i>\"Kolja, jdeme ve\u010der na Dota?\"<\/i><br \/>\nTo znamen\u00e1, \u017ee i u jednoho p\u00e1ru \u00fa\u010dastn\u00edk\u016f m\u016f\u017ee komunikace prob\u00edhat <b>na r\u016fzn\u00e1 t\u00e9mata<\/b>.<\/li>\n<li><i>\"Pet\u0159e, Nikolaje, pod\u00edvejte se v p\u0159\u00edloze na cen\u00edk nov\u00e9ho serveru.\"<\/i><br \/>\nTak, jedno zpr\u00e1va m\u016f\u017ee m\u00edt <b>v\u00edce adres\u00e1t\u016f<\/b>. P\u0159i\u010dem\u017e zpr\u00e1va m\u016f\u017ee obsahovat <b>p\u0159ipojen\u00e9 soubory<\/b>.<\/li>\n<li><i>\"Semyone, pod\u00edvej se tak\u00e9.\"<\/i><br \/>\nA m\u011bla by b\u00fdt mo\u017enost do ji\u017e existuj\u00edc\u00ed konverzace <b>pozvat nov\u00e9ho \u00fa\u010dastn\u00edka<\/b>.<\/li>\n<\/ul>\n<p>\nZat\u00edm se zastav\u00edme na tomto seznamu \"o\u010dek\u00e1van\u00fdch\" pot\u0159eb.<\/p>\n<blockquote><p>Bez porozum\u011bn\u00ed aplika\u010dn\u00ed specifiky \u00fakolu a jej\u00edm omezen\u00edm je prakticky nemo\u017en\u00e9 navrhnout <b>efektivn\u00ed<\/b> sch\u00e9ma DB pro jej\u00ed \u0159e\u0161en\u00ed.<\/p><\/blockquote>\n<p><\/p>\n<h2>Krok 2: Minim\u00e1ln\u00ed logick\u00e9 sch\u00e9ma<\/h2>\n<p>\nSch\u00e9maticky to zat\u00edm vypad\u00e1 velmi podobn\u011b jako emailov\u00e1 komunikace \u2014 tradi\u010dn\u00ed n\u00e1stroj pro podnik\u00e1n\u00ed. Ano, \"algoritmicky\" jsou si mnoh\u00e9 obchodn\u00ed \u00fakoly podobn\u00e9, proto budou i n\u00e1stroje pro jejich \u0159e\u0161en\u00ed struktur\u00e1ln\u011b podobn\u00e9.<\/p>\n<p>Poj\u010fme zafixovat u\u017e z\u00edskan\u00e9 logick\u00e9 sch\u00e9ma vztah\u016f entit. Pro zjednodu\u0161en\u00ed pochopen\u00ed na\u0161\u00ed modely vyu\u017eijeme nejjednodu\u0161\u0161\u00ed variantu zobrazen\u00ed <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ER-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C\">ER-modelu<\/a><\/noindex> bez zbyte\u010dn\u00fdch UML nebo IDEF notac\u00ed:<\/p>\n<p><img decoding=\"async\" alt=\"Datab\u00e1ze messengeru (\u010d. 1): navrhujeme r\u00e1mec datab\u00e1ze\" src=\"\/wp-content\/uploads\/2020\/01\/75d0b3cf9e5a44ae3e243449fa406fbc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV na\u0161em p\u0159\u00edkladu jsou postava, dokument a bin\u00e1rn\u00ed \"t\u011blo\" souboru \"vn\u011bj\u0161\u00ed\" entity, kter\u00e9 existuj\u00ed i bez na\u0161\u00ed slu\u017eby. Proto je budeme d\u00e1le vn\u00edmat jako odkazy \"n\u011bkam\" podle UUID.<\/p>\n<blockquote><p>Kreslete <b>sch\u00e9mata co nejjednodu\u0161eji<\/b> \u2014 v\u011bt\u0161ina t\u011bch, kter\u00fdm je budete ukazovat, nejsou experti na \u010dten\u00ed UML\/IDEF. Ale \u2014 kreslete ur\u010dit\u011b.<\/p><\/blockquote>\n<p><\/p>\n<h2>Krok 3: N\u00e1vrh struktury tabulek<\/h2>\n<p>\n<b class=\"spoiler_title\">O n\u00e1zvech tabulek a pol\u00ed<\/b>K \"rusk\u00fdm\" n\u00e1zv\u016fm pol\u00ed a tabulek lze p\u0159istupovat r\u016fzn\u011b, ale to u\u017e je ot\u00e1zka vkusu. Proto\u017ee <noindex><a rel=\"nofollow\" href=\"https:\/\/tensor.ru\/about\/career\/vacancies\">u n\u00e1s v \"Tenzo\u0159e\"<\/a><\/noindex> nen\u00ed \u017e\u00e1dn\u00fd v\u00fdvoj\u00e1\u0159-cizinec, a PostgreSQL n\u00e1m umo\u017e\u0148uje d\u00e1vat n\u00e1zvy i hieroglyfy, pokud jsou <u>uzav\u0159eny v uvozovk\u00e1ch<\/u>, tak d\u00e1v\u00e1me p\u0159ednost jednozna\u010dn\u00fdm n\u00e1zv\u016fm objekt\u016f, abychom p\u0159ede\u0161li nejasnostem.<br \/>\nVzhledem k tomu, \u017ee zpr\u00e1vy p\u00ed\u0161e v\u00edc lid\u00ed najednou, n\u011bkte\u0159\u00ed mohou dokonce \u010dinit tak <u>v offline re\u017eimu<\/u>, je nejjednodu\u0161\u0161\u00ed varianta \u2014 <b>pou\u017e\u00edvat UUID jako identifik\u00e1tory<\/b> nejen pro vn\u011bj\u0161\u00ed entity, ale i pro v\u0161echny objekty uvnit\u0159 na\u0161\u00ed slu\u017eby. A m\u016f\u017eete je generovat i na stran\u011b klienta \u2014 to n\u00e1m pom\u016f\u017ee uchovat odes\u00edl\u00e1n\u00ed zpr\u00e1v b\u011bhem kr\u00e1tkodob\u00e9 nedostupnosti DB, a pravd\u011bpodobnost kolize je extr\u00e9mn\u011b n\u00edzk\u00e1.<\/p>\n<p>N\u00e1vrh struktury tabulek v na\u0161\u00ed datab\u00e1zi p\u0159ijme tento tvar:<br \/>\n<b class=\"spoiler_title\">Tabulky : RU<\/b><\/p>\n<pre><code class=\"sql\">CREATE TABLE \"T\u00e9ma\"(\n  \"T\u00e9ma\"\n    uuid\n      PRIMARY KEY\n, \"Dokument\"\n    uuid\n, \"N\u00e1zev\"\n    text\n);\n\nCREATE TABLE \"Zpr\u00e1va\"(\n  \"Zpr\u00e1va\"\n    uuid\n      PRIMARY KEY\n, \"T\u00e9ma\"\n    uuid\n, \"Autor\"\n    uuid\n, \"Datum\u010cas\"\n    timestamp\n, \"Text\"\n    text\n);\n\nCREATE TABLE \"Adres\u00e1t\"(\n  \"Zpr\u00e1va\"\n    uuid\n, \"Postava\"\n    uuid\n, PRIMARY KEY(\"Zpr\u00e1va\", \"Postava\")\n);\n\nCREATE TABLE \"Soubor\"(\n  \"Soubor\"\n    uuid\n      PRIMARY KEY\n, \"Zpr\u00e1va\"\n    uuid\n, \"BLOB\"\n    uuid\n, \"N\u00e1zev\"\n    text\n);<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Tabulky : 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>Nejd\u016fle\u017eit\u011bj\u0161\u00ed p\u0159i popisu form\u00e1tu je za\u010d\u00edt \"rozkr\u00fdvat\" graf vazeb <b>od tabulek, kter\u00e9 se navz\u00e1jem neodkazuj\u00ed<\/b> samy na nikoho.<\/p><\/blockquote>\n<p><\/p>\n<h2>Krok 4: Zjistit nejasn\u00e9 pot\u0159eby<\/h2>\n<p>\nV\u0161echno, navrhli jsme datab\u00e1zi, do kter\u00e9 lze skv\u011ble ps\u00e1t a <i><b>n\u011bjak \u010d\u00edst.<\/b><\/i> \u010d\u00edst.<\/p>\n<p>Poj\u010fme se v\u017e\u00edt do role u\u017eivatele na\u0161\u00ed slu\u017eby \u2013 co bychom s jej\u00ed pomoc\u00ed cht\u011bli d\u011blat?<\/p>\n<ul>\n<li><i>Posledn\u00ed zpr\u00e1vy<\/i><br \/>\nTo je <b>chronologicky se\u0159azen\u00e9<\/b> podle r\u016fzn\u00fdch krit\u00e9ri\u00ed registr \"m\u00fdch\" zpr\u00e1v. Kde jsem jedn\u00edm z adres\u00e1t\u016f, kde jsem autorem, kde mi napsali a j\u00e1 neodpov\u011bd\u011bl, kde mi neodpov\u011bd\u011bli, \u2026<\/li>\n<li><i>\u00da \u00fa\u010dastn\u00edci konverzace<\/i><br \/>\nKdo se v\u016fbec \u00fa\u010dastn\u00ed tohoto dlouh\u00e9ho chatu?<\/li>\n<\/ul>\n<p>\nNa\u0161e struktura umo\u017e\u0148uje vy\u0159e\u0161it oba tyto \u00fakoly \"v z\u00e1sad\u011b\", ale rychle \u2013 ne. Probl\u00e9m spo\u010d\u00edv\u00e1 v tom, \u017ee pro t\u0159\u00edd\u011bn\u00ed v r\u00e1mci prvn\u00edho \u00fakolu <b>nen\u00ed mo\u017en\u00e9 vytvo\u0159it index<\/b>, kter\u00fd by vyhovoval ka\u017ed\u00e9mu z \u00fa\u010dastn\u00edk\u016f (a bude nutn\u00e9 extrahovat v\u0161echny z\u00e1znamy), a pro vy\u0159e\u0161en\u00ed druh\u00e9ho \u00fakolu je nezbytn\u00e9 <b>extrahovat v\u0161echny zpr\u00e1vy<\/b> o t\u00e9matu.<\/p>\n<blockquote><p>Nep\u0159edpokl\u00e1dan\u00e9 u\u017eivatelsk\u00e9 \u00fakoly mohou v\u00fdrazn\u011b <b>ovlivnit v\u00fdkon<\/b>.<\/p><\/blockquote>\n<p><\/p>\n<h2>Krok 5: Rozumn\u00e1 denormalizace<\/h2>\n<p>\nOb\u011b na\u0161e probl\u00e9my pomohou vy\u0159e\u0161it dodate\u010dn\u00e9 tabulky, do kter\u00fdch budeme <b>duplicovat \u010d\u00e1st dat<\/b>, pot\u0159ebn\u00fdch pro vytv\u00e1\u0159en\u00ed na nich vhodn\u00fdch pro na\u0161e \u00fakoly index\u016f.<br \/>\n<img decoding=\"async\" alt=\"Datab\u00e1ze messengeru (\u010d. 1): navrhujeme r\u00e1mec datab\u00e1ze\" src=\"\/wp-content\/uploads\/2020\/01\/f136a9904518b05bca74cc2b9c2f01b2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b class=\"spoiler_title\">Tabulky : RU<\/b><\/p>\n<pre><code class=\"sql\">CREATE TABLE \"RegistryZpr\u00e1v\"(\n  \"Vlastn\u00edk\"\n    uuid\n, \"TypRegistru\"\n    smallint\n, \"Datum\u010cas\"\n    timestamp\n, \"Zpr\u00e1va\"\n    uuid\n, PRIMARY KEY(\"Vlastn\u00edk\", \"TypRegistru\", \"Zpr\u00e1va\")\n);\nCREATE INDEX ON \"RegistryZpr\u00e1v\"(\"Vlastn\u00edk\", \"TypRegistru\", \"Datum\u010cas\" DESC);\n\nCREATE TABLE \"\u00da\u010dastn\u00edkT\u00e9matu\"(\n  \"T\u00e9ma\"\n    uuid\n, \"Osoba\"\n    uuid\n, PRIMARY KEY(\"T\u00e9ma\", \"Osoba\")\n);<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Tabulky : 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>\nZde jsme pou\u017eili dva typick\u00e9 p\u0159\u00edstupy, kter\u00e9 se uplat\u0148uj\u00ed p\u0159i vytv\u00e1\u0159en\u00ed pomocn\u00fdch tabulek:<\/p>\n<ul>\n<li><b>N\u00e1soben\u00ed z\u00e1znam\u016f<\/b><br \/>\nVytv\u00e1\u0159\u00edme z jedn\u00e9 z\u00e1kladn\u00ed zpr\u00e1vy hned n\u011bkolik n\u00e1sledn\u00fdch z\u00e1znam\u016f v r\u016fzn\u00fdch typech rejst\u0159\u00edk\u016f pro r\u016fzn\u00e9 vlastn\u00edky \u2013 jak pro odes\u00edlatele, tak pro p\u0159\u00edjemce. Ka\u017ed\u00fd z rejst\u0159\u00edk\u016f nyn\u00ed le\u017e\u00ed na indexu \u2013 v\u017edy\u0165 typicky chceme vid\u011bt jen prvn\u00ed str\u00e1nku.<\/li>\n<li><b>Unikalizace z\u00e1znam\u016f<\/b><br \/>\nP\u0159i ka\u017ed\u00e9m odesl\u00e1n\u00ed zpr\u00e1vy v r\u00e1mci konkr\u00e9tn\u00edho t\u00e9matu sta\u010d\u00ed zkontrolovat, zda ji\u017e takov\u00fd z\u00e1znam existuje. Pokud ne \u2013 p\u0159id\u00e1me jej do na\u0161eho \u201eslovn\u00edku\u201c.<\/li>\n<\/ul>\n<p>\nV dal\u0161\u00ed \u010d\u00e1sti \u010dl\u00e1nku se budeme zab\u00fdvat <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">implementac\u00ed partitioningu<\/a><\/noindex> do struktury na\u0161\u00ed datab\u00e1ze.<br \/>\n<br \/>Zdroj: <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.3 - 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\/cs\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\/cs\/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\udd47DB messengera (\u010d.1): navrhujeme strukturu datab\u00e1ze | ProHoster","description":"Jak p\u0159ev\u00e9st obchodn\u00ed po\u017eadavky na konkr\u00e9tn\u00ed datov\u00e9 struktury na p\u0159\u00edkladu n\u00e1vrhu datab\u00e1ze pro messenger \u201eod nuly\u201c. \u010c\u00e1st 1: navrhujeme strukturu datab\u00e1ze","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/55011","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=55011"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/55011\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=55011"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=55011"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=55011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}