{"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\/it\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy","title":{"rendered":"DB del messenger (parte 1): progettazione della struttura del database","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Come tradurre i requisiti aziendali in strutture dati specifiche utilizzando come esempio la progettazione di un database per un messenger \"da zero\".<\/p>\n<ul>\n<li>Parte 1: progettiamo la struttura del database<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">Parte 2: sectioniamo 'in tempo reale'<\/a><\/noindex><\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"DB del messenger (parte 1): progettazione della struttura del database\" src=\"\/wp-content\/uploads\/2020\/01\/d4e85052405da3f6580e4e931c292079.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIl nostro database non sar\u00e0 cos\u00ec grande e distribuito, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/vk\/blog\/342570\/\">come quello di VKontakte<\/a><\/noindex> o <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/340976\/\">Badoo<\/a><\/noindex>, ma \"per averlo\", deve essere fatto bene: funzionale, veloce e <b>stare su un unico server.<\/b> PostgreSQL \u2014 in modo da poter disporre di un'istanza separata del servizio da qualche parte, per esempio.<\/p>\n<p>Pertanto, non toccheremo le questioni di sharding, replica e sistemi geo-distribuiti, ma ci concentreremo sulle soluzioni schemiche all'interno del database.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Passo 1: Un po' di specificit\u00e0 aziendale.<\/h2>\n<p>\nLa nostra messaggistica sar\u00e0 progettata non in modo astratto, ma integrata nell'ambiente <noindex><a rel=\"nofollow\" href=\"https:\/\/sbis.ru\/help\/work_in\/sms\/\">di un social network aziendale.<\/a><\/noindex>Cio\u00e8, le persone non \"si scrivono solo\", ma comunicano tra di loro nel contesto della risoluzione di specifici compiti aziendali.<\/p>\n<p>E quali compiti ha un'azienda?.. Vediamo l'esempio di Vasiliy, il capo del reparto sviluppo.<\/p>\n<ul>\n<li><i>\"Nikolai, per questo compito \u00e8 necessaria una patch gi\u00e0 oggi!\"<\/i><br \/>\nQuindi, la corrispondenza pu\u00f2 avvenire nel contesto di qualche <b>documento<\/b>.<\/li>\n<li><i>\"Kolia, andiamo stasera a giocare a Dota?\"<\/i><br \/>\nCio\u00e8, anche tra una coppia di interlocutori, la comunicazione pu\u00f2 avvenire simultaneamente <b>su diversi temi.<\/b>.<\/li>\n<li><i>\"Petr, Nikolai, guarda in allegato il prezzo per il nuovo server.\"<\/i><br \/>\nQuindi, un messaggio pu\u00f2 avere <b>diversi destinatari.<\/b>Inoltre, un messaggio pu\u00f2 contenere <b>file allegati.<\/b>.<\/li>\n<li><i>\"Semyon, dai un'occhiata anche tu.\"<\/i><br \/>\nE ci deve essere la possibilit\u00e0 di invitare un nuovo partecipante <b>in una corrispondenza gi\u00e0 esistente.<\/b>.<\/li>\n<\/ul>\n<p>\nFermiamoci per ora su questo elenco di esigenze \"ovvie\".<\/p>\n<blockquote><p>Senza comprendere la specificit\u00e0 applicativa del compito e le limitazioni imposte, progettare <b>uno<\/b> schema di database efficace per la sua soluzione \u00e8 praticamente impossibile.<\/p><\/blockquote>\n<p><\/p>\n<h2>Passo 2: Schema logico minimo.<\/h2>\n<p>\nFinora lo schema appare molto simile a una corrispondenza email: uno strumento tradizionale per il business. Infatti, \"algoritmicamente\" molte esigenze aziendali si somigliano, quindi anche gli strumenti per la loro soluzione saranno strutturalmente simili.<\/p>\n<p>Fissiamo ora lo schema logico delle relazioni tra le entit\u00e0 gi\u00e0 ottenuto. Per facilit\u00e0 di comprensione del nostro modello, utilizzeremo la variante pi\u00f9 primitiva di rappresentazione <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ER-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C\">del modello ER<\/a><\/noindex> senza complicazioni di notazioni UML o IDEF:<\/p>\n<p><img decoding=\"async\" alt=\"DB del messenger (parte 1): progettazione della struttura del database\" src=\"\/wp-content\/uploads\/2020\/01\/75d0b3cf9e5a44ae3e243449fa406fbc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNel nostro esempio, la persona, il documento e il \u00abcorpo\u00bb binario del file sono entit\u00e0 \u00abesterne\u00bb che esistono autonomamente anche senza il nostro servizio. Quindi, considereremo in seguito queste entit\u00e0 come dei riferimenti \u00abda qualche parte\u00bb tramite UUID.<\/p>\n<blockquote><p>Disegnate <b>schemi il pi\u00f9 semplici possibile<\/b> \u2014 la maggior parte di quelli a cui li mostrerete non sono esperti nella lettura di UML\/IDEF. Ma - disegnate comunque.<\/p><\/blockquote>\n<p><\/p>\n<h2>Passo 3: Bozza della struttura delle tabelle<\/h2>\n<p>\n<b class=\"spoiler_title\">Sugli nomi delle tabelle e dei campi<\/b>I nomi \"russi\" dei campi e delle tabelle possono essere considerati in vari modi, ma \u00e8 una questione di gusto. Dato che <noindex><a rel=\"nofollow\" href=\"https:\/\/tensor.ru\/about\/career\/vacancies\">non abbiamo sviluppatori stranieri in \"Tensor\"<\/a><\/noindex> e PostgreSQL ci consente di dare nomi anche con i geroglifici, se sono <u>racchiusi tra virgolette<\/u>, preferiamo nominare gli oggetti in modo chiaro e ovvio, per evitare ambiguit\u00e0.<br \/>\nPoich\u00e9 ci sono molte persone che scrivono messaggi, alcuni di loro potrebbero farlo <u>offline<\/u>, la soluzione pi\u00f9 semplice \u00e8 <b>utilizzare UUID come identificatori<\/b> non solo per entit\u00e0 esterne, ma anche per tutti gli oggetti all'interno del nostro servizio. Inoltre, possono essere generati anche dal lato client - questo ci aiuter\u00e0 a supportare l'invio dei messaggi in caso di temporanea indisponibilit\u00e0 del DB, e la probabilit\u00e0 di collisione \u00e8 estremamente bassa.<\/p>\n<p>La struttura di base delle tabelle nel nostro database avr\u00e0 questo aspetto:<br \/>\n<b class=\"spoiler_title\">Tabelle : RU<\/b><\/p>\n<pre><code class=\"sql\">CREATE TABLE \"Tema\"(\n  \"Tema\"\n    uuid\n      PRIMARY KEY\n, \"Documento\"\n    uuid\n, \"Titolo\"\n    text\n);\n\nCREATE TABLE \"Messaggio\"(\n  \"Messaggio\"\n    uuid\n      PRIMARY KEY\n, \"Tema\"\n    uuid\n, \"Autore\"\n    uuid\n, \"DataOra\"\n    timestamp\n, \"Testo\"\n    text\n);\n\nCREATE TABLE \"Destinatario\"(\n  \"Messaggio\"\n    uuid\n, \"Persona\"\n    uuid\n, PRIMARY KEY(\"Messaggio\", \"Persona\")\n);\n\nCREATE TABLE \"File\"(\n  \"File\"\n    uuid\n      PRIMARY KEY\n, \"Messaggio\"\n    uuid\n, \"BLOB\"\n    uuid\n, \"Nome\"\n    text\n);<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Tabelle : 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>La cosa pi\u00f9 semplice quando si descrive il formato \u00e8 iniziare a \u00absviluppare\u00bb il grafo di relazioni <b>dalle tabelle che non si riferiscono<\/b> a nessuna.<\/p><\/blockquote>\n<p><\/p>\n<h2>Passo 4: Scoprire le esigenze non ovvie<\/h2>\n<p>\nBene, abbiamo progettato un database in cui possiamo ottimamente scrivere e <i><b>in qualche modo<\/b><\/i> leggere.<\/p>\n<p>Mettiamoci nei panni dell'utente del nostro servizio: cosa vorremmo fare con il suo aiuto?<\/p>\n<ul>\n<li><i>Ultimi messaggi<\/i><br \/>\nQuesto <b>ordinati cronologicamente<\/b> in base a variabili diverse, il registro dei \"miei\" messaggi. Dove sono uno dei destinatari, dove sono l'autore, dove mi hanno scritto e io non ho risposto, dove non mi hanno risposto, ...<\/li>\n<li><i>Partecipanti alla conversazione<\/i><br \/>\nChi partecipa a questa lunga conversazione?<\/li>\n<\/ul>\n<p>\nLa nostra struttura consente di risolvere entrambi questi problemi \u00abin generale\u00bb, ma velocemente \u2014 no. Il problema \u00e8 che per ordinare nell'ambito del primo problema <b>\u00e8 impossibile creare un indice<\/b>, adatto per ciascun partecipante (e sar\u00e0 necessario estrarre tutte le registrazioni), e per risolvere il secondo \u00e8 necessario <b>estrarre tutti i messaggi<\/b> relative all'argomento.<\/p>\n<blockquote><p>Compiti utente non previsti possono compromettere seriamente <b>le prestazioni<\/b>.<\/p><\/blockquote>\n<p><\/p>\n<h2>Passo 5: Denormalizzazione sensata<\/h2>\n<p>\nEntrambi i nostri problemi possono essere risolti da tabelle aggiuntive, in cui possiamo <b>duplicare parte dei dati<\/b>, necessari per formare indici adeguati ai nostri compiti.<br \/>\n<img decoding=\"async\" alt=\"DB del messenger (parte 1): progettazione della struttura del database\" src=\"\/wp-content\/uploads\/2020\/01\/f136a9904518b05bca74cc2b9c2f01b2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b class=\"spoiler_title\">Tabelle : RU<\/b><\/p>\n<pre><code class=\"sql\">CREATE TABLE \"RegistroMessaggi\"(\n  \"Proprietario\"\n    uuid\n, \"TipoRegistro\"\n    smallint\n, \"DataOra\"\n    timestamp\n, \"Messaggio\"\n    uuid\n, PRIMARY KEY(\"Proprietario\", \"TipoRegistro\", \"Messaggio\")\n);\nCREATE INDEX ON \"RegistroMessaggi\"(\"Proprietario\", \"TipoRegistro\", \"DataOra\" DESC);\n\nCREATE TABLE \"PartecipanteTema\"(\n  \"Tema\"\n    uuid\n, \"Persona\"\n    uuid\n, PRIMARY KEY(\"Tema\", \"Persona\")\n);<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Tabelle : 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>\nQui abbiamo applicato due approcci tipici utilizzati per la creazione di tabelle ausiliarie:<\/p>\n<ul>\n<li><b>Moltiplicazione dei record<\/b><br \/>\nCreiamo da una singola registrazione originale del messaggio diverse registrazioni correlate in diversi tipi di registro per diversi proprietari \u2014 sia per il mittente che per il destinatario. Ora ogni registro pu\u00f2 essere posizionato su un indice \u2014 infatti, nel caso tipico vorremmo vedere solo la prima pagina.<\/li>\n<li><b>Unicizzazione dei record<\/b><br \/>\nAd ogni invio di messaggio all'interno di un tema specifico \u00e8 sufficiente controllare se esiste gi\u00e0 una registrazione di quel tipo. Se no \u2014 la aggiungiamo al nostro \u00abdizionario\u00bb.<\/li>\n<\/ul>\n<p>\nNella prossima parte dell'articolo parleremo di <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">implementazione della partizione<\/a><\/noindex> nella struttura del nostro database.<br \/>\n<br \/>Fonte: <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\/it\/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=\"it_IT\" \/>\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\/it\/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 del messenger (parte 1): progettiamo la struttura del database | ProHoster","description":"Come tradurre i requisiti aziendali in strutture dati concrete prendendo come esempio la progettazione di un database per un messenger da zero. Parte 1: progettiamo la struttura del database","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/55011","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=55011"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/55011\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=55011"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=55011"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=55011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}