{"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":"Database del messaggero (parte 1): progettazione della struttura del database","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Come tradurre le esigenze aziendali in strutture dati concrete, ad esempio progettando da zero il database per il messaggero.<\/p>\n<ul>\n<li>Parte 1: progettazione della struttura del database<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">Parte 2: sezioniamo 'in tempo reale'<\/a><\/noindex><\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Database del messaggero (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 'solo per avere', ma deve essere buono \u2014 funzionale, veloce e <b>che possa stare su un solo server<\/b> PostgreSQL \u2014 per poter distribuire un'istanza separata del servizio da qualche parte, ad esempio.<\/p>\n<p>Pertanto, non tratteremo le questioni di sharding, replicazione e sistemi geograficamente distribuiti, ma ci concentreremo sulle soluzioni schemaliche all'interno del database.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Passo 1: Un po\u2019 di specifiche aziendali<\/h2>\n<p>\nProgetteremo il nostro scambio di messaggi non in modo astratto, ma inserendolo nell'ambiente <noindex><a rel=\"nofollow\" href=\"https:\/\/sbis.ru\/help\/work_in\/sms\/\">di una rete sociale aziendale.<\/a><\/noindex>Cio\u00e8, le persone non 'si scambiano solo messaggi', ma comunicano tra loro nel contesto della soluzione di specifici problemi aziendali.<\/p>\n<p>E quali sono le problematiche aziendali? ... Vediamo attraverso l'esempio di Vasiliy \u2014 responsabile del reparto sviluppo.<\/p>\n<ul>\n<li><i>'Nikolai, per questo compito \u00e8 necessaria la patch gi\u00e0 oggi!'<\/i><br \/>\nSignifica che la corrispondenza pu\u00f2 avvenire nel contesto di qualcosa <b>del documento<\/b>.<\/li>\n<li><i>\u00abCiao, andiamo a giocare a Dota stasera?\u00bb<\/i><br \/>\nCio\u00e8, anche in una coppia di interlocutori, la conversazione pu\u00f2 avvenire simultaneamente <b>su temi diversi<\/b>.<\/li>\n<li><i>\u00abPietro, Nicola, date un'occhiata all'allegato con il prezzo del nuovo server.\u00bb<\/i><br \/>\nQuindi, un messaggio pu\u00f2 avere <b>diversi destinatari<\/b>. Inoltre, il messaggio pu\u00f2 contenere <b>file allegati<\/b>.<\/li>\n<li><i>\u00abSemion, anche tu dai un'occhiata.\u00bb<\/i><br \/>\nE dovrebbe esserci la possibilit\u00e0 di invitare un nuovo partecipante <b>in una conversazione gi\u00e0 esistente.<\/b>.<\/li>\n<\/ul>\n<p>\nFermiamoci per ora a questo elenco di esigenze \"ovvie\".<\/p>\n<blockquote><p>Senza comprendere la specificit\u00e0 applicativa del compito e i vincoli richiesti, progettare <b>una<\/b> scheda DB efficace per risolverla \u00e8 praticamente impossibile.<\/p><\/blockquote>\n<p><\/p>\n<h2>Passo 2: Schema logico minimo<\/h2>\n<p>\nFinora, tutto sembra molto simile a una corrispondenza via email \u2014 uno strumento tradizionale per fare affari. Infatti, \u00abalgoritmicamente\u00bb, molte sfide aziendali sono simili tra loro, quindi anche gli strumenti per risolverle saranno strutturalmente simili.<\/p>\n<p>Fissiamo gi\u00e0 lo schema logico delle relazioni tra le entit\u00e0 che abbiamo ottenuto. Per facilitare la comprensione del nostro modello, utilizzeremo la variante pi\u00f9 semplice di visualizzazione <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ER-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C\">dei modelli ER<\/a><\/noindex> senza complicazioni di UML o notazioni IDEF:<\/p>\n<p><img decoding=\"async\" alt=\"Database del messaggero (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 corpo binario del file sono entit\u00e0 \"esterne\" che esistono autonomamente anche senza il nostro servizio. Pertanto, d'ora in poi le considereremo semplicemente come dei riferimenti \"da qualche parte\" tramite UUID.<\/p>\n<blockquote><p>Disegna <b>schemi nel modo pi\u00f9 semplice possibile<\/b> \u2014 la maggior parte delle persone a cui li mostrerai non \u00e8 esperta nella lettura di UML\/IDEF. Ma \u2014 disegna comunque.<\/p><\/blockquote>\n<p><\/p>\n<h2>Passo 3: Schizziamo la struttura delle tabelle<\/h2>\n<p>\n<b class=\"spoiler_title\">Riguardo ai nomi di tabelle e campi<\/b>Ai nomi \"russi\" dei campi e delle tabelle si pu\u00f2 avere un'opinione diversa, ma \u00e8 una questione di gusto. Poich\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/tensor.ru\/about\/career\/vacancies\">nel nostro \"Tensor\"<\/a><\/noindex> non ci sono sviluppatori stranieri, e PostgreSQL ci consente di dare nomi anche in geroglifici, se <u>sono racchiusi tra virgolette<\/u>, preferiamo nominare gli oggetti in modo chiaro e comprensibile, per evitare ambiguit\u00e0.<br \/>\nPoich\u00e9 i messaggi vengono scritti simultaneamente da molte persone, alcune di esse possono farlo <u>in modalit\u00e0 offline<\/u>, l'opzione 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, \u00e8 possibile generarle anche dal lato client \u2014 questo ci aiuter\u00e0 a mantenere l'invio di messaggi durante la breve indisponibilit\u00e0 del database, mentre 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 \"sviluppare\" il grafo delle relazioni <b>da tabelle che non fanno riferimento<\/b> a nessuno.<\/p><\/blockquote>\n<p><\/p>\n<h2>Passo 4: Identificare esigenze non evidenti<\/h2>\n<p>\nBene, abbiamo progettato una base in cui si pu\u00f2 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>registro 'dei miei' messaggi ordinato cronologicamente<\/b> \u043f\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0430\u043c \u0440\u0435\u0435\u0441\u0442\u0440 \u00ab\u043c\u043e\u0438\u0445\u00bb \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u0413\u0434\u0435 \u044f \u043e\u0434\u0438\u043d \u0438\u0437 \u0430\u0434\u0440\u0435\u0441\u0430\u0442\u043e\u0432, \u0433\u0434\u0435 \u044f \u0430\u0432\u0442\u043e\u0440, \u0433\u0434\u0435 \u043c\u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438, \u0430 \u044f \u043d\u0435 \u043e\u0442\u0432\u0435\u0442\u0438\u043b, \u0433\u0434\u0435 \u043d\u0435 \u043e\u0442\u0432\u0435\u0442\u0438\u043b\u0438 \u043c\u043d\u0435, &#8230;<\/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 entrambe queste questioni 'in generale', ma rapidamente \u2014 no. Il problema \u00e8 che per ordinare nell'ambito del primo compito <b>non \u00e8 possibile creare un indice<\/b>, adatto per ognuno dei partecipanti (e sar\u00e0 necessario estrarre tutte le registrazioni), e per risolvere il secondo \u00e8 necessario <b>estrarre tutti i messaggi<\/b> sull'argomento.<\/p>\n<blockquote><p>Compiti utente non previsti possono compromettere pesantemente <b>le performance.<\/b>.<\/p><\/blockquote>\n<p><\/p>\n<h2>Passo 5: Denormalizzazione ragionevole<\/h2>\n<p>\nEntrambe le nostre problematiche possono essere affrontate con ulteriori tabelle, in cui duplicheremo parte dei dati <b>, necessari per formare indici adatti alle nostre esigenze.<\/b>, necessari per la creazione di indici adatti ai nostri compiti.<br \/>\n<img decoding=\"async\" alt=\"Database del messaggero (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 nella creazione di tabelle ausiliarie:<\/p>\n<ul>\n<li><b>Moltiplicazione di record<\/b><br \/>\nCreiamo pi\u00f9 record conseguenti da un singolo record originario di messaggio su diversi tipi di registro per diversi proprietari \u2014 sia per il mittente che per il destinatario. In questo modo, ciascun registro ora si basa su un indice \u2014 in quanto avremmo tipicamente il desiderio di vedere solo la prima pagina.<\/li>\n<li><b>Unificazione dei record<\/b><br \/>\nOgni volta che un messaggio viene inviato all'interno di un tema specifico, \u00e8 sufficiente controllare se esiste gi\u00e0 un tale record. Se non esiste \u2014 lo aggiungiamo al nostro 'glossario'.<\/li>\n<\/ul>\n<p>\nNella prossima parte dell'articolo si parler\u00e0 di <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">implementazione della suddivisione<\/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 4.9.10 - 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 \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\" \/>\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) 4.9.10\" \/>\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 \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\" \/>\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\udd47Database del messenger (parte 1): progettiamo la struttura del database | ProHoster","description":"Come tradurre le esigenze aziendali in specifiche strutture dati, prendendo come esempio la progettazione di un database per un messenger \u00abda zero\u00bb. Parte 1: progettiamo la struttura del database Parte 2: suddividiamo \u00abin tempo reale\u00bb. Il nostro database non sar\u00e0 esteso e distribuito come quello di VKontakte o Badoo, ma sar\u00e0 progettato in modo funzionale, veloce e capace di adattarsi a un server PostgreSQL.","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 \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","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"},"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}]}}