{"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\/ro\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy","title":{"rendered":"BD-ul messenger-ului (partea 1): proiectarea structurii bazei de date","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Cum putem transforma cerin\u021bele de afaceri \u00een structuri de date specifice, folosind ca exemplu proiectarea unei baze de date de la zero pentru un messenger.<\/p>\n<ul>\n<li>Partea 1: proiect\u0103m structura bazei de date<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">Partea 2: sec\u021bion\u0103m \u00ab\u00een timp real\u00bb<\/a><\/noindex><\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"BD-ul messenger-ului (partea 1): proiectarea structurii bazei de date\" src=\"\/wp-content\/uploads\/2020\/01\/d4e85052405da3f6580e4e931c292079.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nBaza noastr\u0103 nu va fi la fel de extins\u0103 \u0219i distribuit\u0103, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/vk\/blog\/342570\/\">ca cea de la Vkontakte,<\/a><\/noindex> sau <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/340976\/\">Badoo<\/a><\/noindex>, ci \u00abde dragul existen\u021bei\u00bb, dar va fi bine - func\u021bional\u0103, rapid\u0103 \u0219i <b>se va \u00eencadra pe un singur server.<\/b> PostgreSQL - astfel \u00eenc\u00e2t s\u0103 putem desf\u0103\u0219ura o instan\u021b\u0103 separat\u0103 a serviciului undeva, de exemplu.<\/p>\n<p>Prin urmare, nu vom aborda problemele de sharding, replicare \u0219i sisteme geo-distribuite, ci ne vom concentra pe solu\u021biile schemei din interiorul Bazei de date.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Pasul 1: Pu\u021bin context de afaceri<\/h2>\n<p>\n\u00ce\u0219i vom proiecta schimbul de mesaje nu \u00een mod abstract, ci integrat \u00een contextul <noindex><a rel=\"nofollow\" href=\"https:\/\/sbis.ru\/help\/work_in\/sms\/\">re\u021belei sociale corporative.<\/a><\/noindex>. Adic\u0103, oamenii nu \u00abse scriu doar\u00bb, ci comunic\u0103 \u00eentre ei \u00een contextul rezolv\u0103rii anumitor sarcini de afaceri.<\/p>\n<p>\u0218i ce tipuri de sarcini are o afacere?.. S\u0103 ne uit\u0103m la exemplul lui Vasili \u2014 \u0219eful departamentului de dezvoltare.<\/p>\n<ul>\n<li><i>\u00abNikolai, pentru aceast\u0103 sarcin\u0103 trebuie un patch chiar ast\u0103zi!\u00bb<\/i><br \/>\nDeci, discu\u021biile pot avea loc \u00een contextul unui <b>document.<\/b>.<\/li>\n<li><i>\u00abKola, s\u0103 juc\u0103m seara Dota?\u00bb<\/i><br \/>\nAdic\u0103, chiar \u0219i \u00eentre o pereche de interlocutori, comunicarea poate avea loc simultan <b>pe subiecte diferite.<\/b>.<\/li>\n<li><i>\u00abPetru, Nikolai, uita\u021bi-v\u0103 \u00een ata\u0219ament la pre\u021bul pentru noul server.\u00bb<\/i><br \/>\nA\u0219adar, un mesaj poate avea <b>mai multe destinatari.<\/b>. \u00cen acela\u0219i timp, mesajul poate con\u021bine <b>fi\u0219iere ata\u0219ate.<\/b>.<\/li>\n<li><i>\u00abSemen, \u0219i tu uit\u0103-te \u0219i tu.\u00bb<\/i><br \/>\n\u0218i trebuie s\u0103 existe posibilitatea de a invita un nou participant \u00een conversa\u021bia existent\u0103. <b>S\u0103 ne concentr\u0103m pentru moment pe aceast\u0103 list\u0103 de necesit\u0103\u021bi \u00abevidente\u00bb.<\/b>.<\/li>\n<\/ul>\n<p>\nF\u0103r\u0103 \u00een\u021belegerea specificului aplica\u021biei sarcinii \u0219i a limit\u0103rilor pe care le impune, este practic imposibil s\u0103 proiectezi<\/p>\n<blockquote><p>o schem\u0103 eficient\u0103 <b>a bazei de date pentru rezolvarea acesteia.<\/b> Pasul 2: Schema logic\u0103 minim\u0103<\/p><\/blockquote>\n<p><\/p>\n<h2>Schema arat\u0103 p\u00e2n\u0103 acum foarte asem\u0103n\u0103tor cu coresponden\u021ba prin email - instrumentul tradi\u021bional de afaceri. A\u0219a este, \u00abalgoritmic\u00bb, multe sarcini de afaceri sunt asem\u0103n\u0103toare \u00eentre ele, deci \u0219i instrumentele pentru rezolvarea lor vor fi structural similare.<\/h2>\n<p>\nHaide\u021bi s\u0103 fix\u0103m schema logic\u0103 a rela\u021biilor entit\u0103\u021bilor ob\u021binute. Pentru a simplifica \u00een\u021belegerea modelului nostru, vom folosi cea mai primitiv\u0103 variant\u0103 de reprezentare<\/p>\n<p>a modelului ER, <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ER-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C\">f\u0103r\u0103 complica\u021bii UML sau note IDEF:<\/a><\/noindex> f\u0103r\u0103 complica\u021bii UML sau note IDEF:<\/p>\n<p><img decoding=\"async\" alt=\"BD-ul messenger-ului (partea 1): proiectarea structurii bazei de date\" src=\"\/wp-content\/uploads\/2020\/01\/75d0b3cf9e5a44ae3e243449fa406fbc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00cen exemplul nostru, persona, documentul \u0219i corpul binar al fi\u0219ierului sunt entit\u0103\u021bi \u201eexterne\u201d care exist\u0103 independent de serviciul nostru. Prin urmare, le vom percepe \u00een continuare ca referin\u021be \u201ec\u0103tre ceva\u201d prin UUID.<\/p>\n<blockquote><p>Desena\u021bi <b>diagrame c\u00e2t mai simplu<\/b> \u2014 majoritatea celor c\u0103rora le ve\u021bi ar\u0103ta aceste diagrame nu sunt exper\u021bi \u00een citirea UML\/IDEF. Dar \u2014 trebuie s\u0103 desena\u021bi.<\/p><\/blockquote>\n<p><\/p>\n<h2>Pasul 3: Schi\u021b\u0103m structura tabelelor<\/h2>\n<p>\n<b class=\"spoiler_title\">Despre numele tabelelor \u0219i c\u00e2mpurilor<\/b>La numele \u201erusesti\u201d ale c\u00e2mpurilor \u0219i tabelelor se poate privi diferit, dar asta este o chestiune de gust. Av\u00e2nd \u00een vedere c\u0103 <noindex><a rel=\"nofollow\" href=\"https:\/\/tensor.ru\/about\/career\/vacancies\">nu avem dezvoltatori str\u0103ini \u00een \u201eTensor\u201d<\/a><\/noindex> iar PostgreSQL ne permite s\u0103 folosim nume chiar \u0219i cu hieroglife, dac\u0103 ele <u>sunt \u00eentre ghilimele<\/u>, prefer\u0103m s\u0103 numim obiectele \u00eentr-un mod clar, astfel \u00eenc\u00e2t s\u0103 nu apar\u0103 ambiguit\u0103\u021bi.<br \/>\nDeoarece mesajele sunt scrise de mai multe persoane simultan, o parte dintre ele pot face acest lucru <u>\u00een mod offline<\/u>, cea mai simpl\u0103 op\u021biune ar fi <b>s\u0103 folosim UUID ca identificatori<\/b> nu doar pentru entit\u0103\u021bile externe, ci \u0219i pentru toate obiectele din cadrul serviciului nostru. De fapt, le putem genera chiar \u0219i pe partea clientului \u2014 aceasta ne va ajuta s\u0103 sus\u021binem trimiterea mesajelor \u00een caz de nefunc\u021bionare temporar\u0103 a bazei de date, iar probabilitatea coliziunii este extrem de mic\u0103.<\/p>\n<p>Structura preliminar\u0103 a tabelelor din baza noastr\u0103 va ar\u0103ta astfel:<br \/>\n<b class=\"spoiler_title\">Tabele: RU<\/b><\/p>\n<pre><code class=\"sql\">CREATE TABLE \"Tema\"(\n  \"Tema\"\n    uuid\n      PRIMARY KEY\n, \"Document\"\n    uuid\n, \"Titlu\"\n    text\n);\n\nCREATE TABLE \"Mesaj\"(\n  \"Mesaj\"\n    uuid\n      PRIMARY KEY\n, \"Tema\"\n    uuid\n, \"Autor\"\n    uuid\n, \"DataOra\"\n    timestamp\n, \"Text\"\n    text\n);\n\nCREATE TABLE \"Adresat\"(\n  \"Mesaj\"\n    uuid\n, \"Persona\"\n    uuid\n, PRIMARY KEY(\"Mesaj\", \"Persona\")\n);\n\nCREATE TABLE \"Fi\u0219ier\"(\n  \"Fi\u0219ier\"\n    uuid\n      PRIMARY KEY\n, \"Mesaj\"\n    uuid\n, \"BLOB\"\n    uuid\n, \"Nume\"\n    text\n);<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Tabele: 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>Cea mai simpl\u0103 abordare \u00een descrierea formatului este s\u0103 \u00eencepem \u201edezvoltarea\u201d re\u021belei de rela\u021bii <b>de la tabele care nu se refer\u0103<\/b> la nimeni.<\/p><\/blockquote>\n<p><\/p>\n<h2>Pasul 4: Identific\u0103m nevoile ne\u0219tiute<\/h2>\n<p>\nTotul, am proiectat o baz\u0103 \u00een care putem scrie excelent \u0219i <i><b>\u00eentr-un fel<\/b><\/i> s\u0103 citim.<\/p>\n<p>S\u0103 ne punem \u00een locul utilizatorului serviciului nostru - ce am dori s\u0103 facem cu ajutorul lui?<\/p>\n<ul>\n<li><i>Cele mai recente mesaje<\/i><br \/>\nAceasta <b>un registru \"al mesajelor mele\" ordonat cronologic.<\/b> \u00een registrul \"mesajelor mele\" pe baza diferitelor criterii. Acolo unde sunt unul dintre destinatari, unde sunt autor, unde m-au scris, dar nu am r\u0103spuns, unde nu mi-au r\u0103spuns, ...<\/li>\n<li><i>Participan\u021bii la coresponden\u021b\u0103<\/i><br \/>\nCine particip\u0103 de fapt la aceast\u0103 discu\u021bie foarte lung\u0103?<\/li>\n<\/ul>\n<p>\nStructura noastr\u0103 permite s\u0103 rezolv\u0103m ambele aceste sarcini \"\u00een general\", \u00eens\u0103 rapid - nu. Problema este c\u0103 pentru a sorta \u00een cadrul primei sarcini <b>nu este posibil s\u0103 se creeze un index<\/b>, potrivit pentru fiecare dintre participan\u021bi (va trebui s\u0103 extragem toate \u00eenregistr\u0103rile), iar pentru a rezolva a doua sarcin\u0103 este necesar <b>s\u0103 extragem toate mesajele<\/b> pe tem\u0103.<\/p>\n<blockquote><p>Sarcinile utilizatorilor neprev\u0103zute pot pune un accent serios <b>pe performan\u021b\u0103<\/b>.<\/p><\/blockquote>\n<p><\/p>\n<h2>Pasul 5: Denormalizare ra\u021bional\u0103<\/h2>\n<p>\nAmbele probleme ale noastre pot fi rezolvate prin tabele suplimentare, \u00een care vom <b>duplicat o parte din datele<\/b>, necesare pentru a forma indici adecva\u021bi pentru sarcinile noastre.<br \/>\n<img decoding=\"async\" alt=\"BD-ul messenger-ului (partea 1): proiectarea structurii bazei de date\" src=\"\/wp-content\/uploads\/2020\/01\/f136a9904518b05bca74cc2b9c2f01b2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b class=\"spoiler_title\">Tabele: RU<\/b><\/p>\n<pre><code class=\"sql\">CREATE TABLE \"RegistryMessages\"(\n  \"Owner\"\n    uuid\n, \"RegistryType\"\n    smallint\n, \"DateTime\"\n    timestamp\n, \"Message\"\n    uuid\n, PRIMARY KEY(\"Owner\", \"RegistryType\", \"Message\")\n);\nCREATE INDEX ON \"RegistryMessages\"(\"Owner\", \"RegistryType\", \"DateTime\" DESC);\n\nCREATE TABLE \"ThemeParticipant\"(\n  \"Theme\"\n    uuid\n, \"Person\"\n    uuid\n, PRIMARY KEY(\"Theme\", \"Person\")\n);<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Tabele: 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>\nAici am aplicat dou\u0103 abord\u0103ri tipice utilizate la crearea tabelelor auxiliare:<\/p>\n<ul>\n<li><b>\u00cenmul\u021birea \u00eenregistr\u0103rilor<\/b><br \/>\nForm\u0103m dintr-o \u00eenregistrare ini\u021bial\u0103 a unui mesaj mai multe \u00eenregistr\u0103ri-urm\u0103 \u00een diferite tipuri de registre pentru diferi\u021bi proprietari - at\u00e2t pentru expeditor, c\u00e2t \u0219i pentru destinatar. Dar acum fiecare registru se potrive\u0219te pe index - c\u0103ci \u00een cazul tipic dorim s\u0103 vedem doar prima pagin\u0103.<\/li>\n<li><b>Unicizarea \u00eenregistr\u0103rilor<\/b><br \/>\nLa fiecare trimitere a unui mesaj \u00eentr-o tem\u0103 specific\u0103, este suficient s\u0103 verific\u0103m dac\u0103 o astfel de \u00eenregistrare exist\u0103 deja. Dac\u0103 nu, o ad\u0103ug\u0103m \u00een \u201eglosarul\u201d nostru.<\/li>\n<\/ul>\n<p>\n\u00cen partea urm\u0103toare a articolului ne vom ocupa de <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">implementarea partaj\u0103rii<\/a><\/noindex> \u00een structura bazei noastre.<br \/>\n<br \/>Sursa: <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.2.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\/ro\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Baza de date a mesagerului (p.1): proiect\u0103m structura bazei | ProHoster","description":"Cum pot fi transformate cerin\u021bele de afaceri \u00een structuri de date concrete prin exemplul proiect\u0103rii unei baze de date de la zero pentru un mesager? Partea 1: proiectarea structurii bazei de date","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/55011","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=55011"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/55011\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=55011"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=55011"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=55011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}