{"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\/fr\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy","title":{"rendered":"BD du messager (partie 1) : concevoir la structure de la base","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Comment traduire les exigences commerciales en structures de donn\u00e9es concr\u00e8tes, en prenant comme exemple la conception d'une base de donn\u00e9es \u00ab de z\u00e9ro \u00bb pour un messager.<\/p>\n<ul>\n<li>Partie 1 : conception du cadre de la base<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">Partie 2 : partitionnement en temps r\u00e9el<\/a><\/noindex><\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"BD du messager (partie 1) : concevoir la structure de la base\" src=\"\/wp-content\/uploads\/2020\/01\/d4e85052405da3f6580e4e931c292079.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNotre base ne sera pas aussi vaste et r\u00e9partie que celle de <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/vk\/blog\/342570\/\">VKontakte<\/a><\/noindex> ou <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/340976\/\">Badoo<\/a><\/noindex>, mais \u00ab juste ce qu'il faut \u00bb pour \u00eatre efficace, rapide et <b>tenable sur un seul serveur.<\/b> PostgreSQL \u2014 afin de pouvoir d\u00e9ployer une instance s\u00e9par\u00e9e du service quelque part, par exemple.<\/p>\n<p>C'est pourquoi nous ne traiterons pas des questions de sharding, de r\u00e9plication et de syst\u00e8mes g\u00e9o-distribu\u00e9s, mais nous concentrerons sur des solutions sch\u00e9matiques \u00e0 l'int\u00e9rieur de la base de donn\u00e9es.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>\u00c9tape 1 : Un peu de sp\u00e9cificit\u00e9s commerciales<\/h2>\n<p>\nNous allons concevoir notre syst\u00e8me de messagerie non pas de mani\u00e8re abstraite, mais en l'int\u00e9grant \u00e0 l'environnement <noindex><a rel=\"nofollow\" href=\"https:\/\/sbis.ru\/help\/work_in\/sms\/\">d'un r\u00e9seau social d'entreprise.<\/a><\/noindex>Autrement dit, les gens ne \u00ab se contentent pas de discuter \u00bb, mais interagissent dans le contexte de la r\u00e9solution de certaines probl\u00e9matiques commerciales.<\/p>\n<p>Quelles sont les besoins d'une entreprise ?... Prenons l'exemple de Vasily, le responsable du d\u00e9partement de d\u00e9veloppement.<\/p>\n<ul>\n<li><i>\u00ab Nikolai, il faut d\u00e9j\u00e0 un patch pour cette t\u00e2che aujourd'hui ! \u00bb<\/i><br \/>\nCela signifie que la conversation peut se d\u00e9rouler dans le contexte de quelque chose <b>document<\/b>.<\/li>\n<li><i>\u00ab Kolya, on se fait une partie de Dota ce soir ? \u00bb<\/i><br \/>\nAinsi, m\u00eame pour une seule paire de correspondants, la communication peut se faire simultan\u00e9ment <b>sur diff\u00e9rents sujets.<\/b>.<\/li>\n<li><i>\u00ab Petr, Nikolai, regardez dans le fichier joint le prix pour le nouveau serveur. \u00bb<\/i><br \/>\nAinsi, un message peut avoir <b>plusieurs destinataires.<\/b>De plus, un message peut contenir <b>des fichiers joints.<\/b>.<\/li>\n<li><i>\u00ab Semyon, toi aussi, jette un \u0153il. \u00bb<\/i><br \/>\nEt il doit \u00eatre possible d'inviter un nouveau participant <b>\u00e0 une conversation qui existe d\u00e9j\u00e0.<\/b>.<\/li>\n<\/ul>\n<p>\nRestons ici sur cette liste de besoins \u00ab \u00e9vidents \u00bb.<\/p>\n<blockquote><p>Sans une compr\u00e9hension des sp\u00e9cificit\u00e9s pratiques de la t\u00e2che et des contraintes qu'elle impose, il est pratiquement impossible de concevoir <b>un sch\u00e9ma de base de donn\u00e9es<\/b> efficace pour sa r\u00e9solution.<\/p><\/blockquote>\n<p><\/p>\n<h2>\u00c9tape 2 : Sch\u00e9ma logique minimal<\/h2>\n<p>\nPour l'instant, le sch\u00e9ma ressemble beaucoup \u00e0 une correspondance par email \u2014 un outil traditionnel pour mener des affaires. En effet, \u00ab algorithmique \u00bb, de nombreuses t\u00e2ches commerciales se ressemblent, donc les outils pour les r\u00e9soudre seront structur\u00e9s de mani\u00e8re similaire.<\/p>\n<p>Fixons maintenant le sch\u00e9ma logique des relations des entit\u00e9s d\u00e9j\u00e0 obtenu. Pour simplifier la compr\u00e9hension de notre mod\u00e8le, utilisons la variante la plus primitive d'affichage <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ER-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C\">d'un mod\u00e8le ER<\/a><\/noindex> sans complicer avec des notations UML ou IDEF :<\/p>\n<p><img decoding=\"async\" alt=\"BD du messager (partie 1) : concevoir la structure de la base\" src=\"\/wp-content\/uploads\/2020\/01\/75d0b3cf9e5a44ae3e243449fa406fbc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDans notre exemple, la personne, le document et le corps binaire du fichier sont des entit\u00e9s \"externes\" qui existent de mani\u00e8re autonome, m\u00eame sans notre service. Nous allons donc les consid\u00e9rer ult\u00e9rieurement comme des liens \"vers quelque part\" par UUID.<\/p>\n<blockquote><p>Dessinez <b>des diagrammes aussi simplement que possible<\/b> \u2014 la plupart des gens \u00e0 qui vous les montrerez ne sont pas des experts en lecture UML\/IDEF. Mais, dessinez-les sans faute.<\/p><\/blockquote>\n<p><\/p>\n<h2>\u00c9tape 3 : Projeter la structure des tables<\/h2>\n<p>\n<b class=\"spoiler_title\">Concernant les noms de tables et de champs<\/b>On peut avoir des opinions diff\u00e9rentes sur les noms de champs et de tables \u00ab russes \u00bb, mais c'est une question de go\u00fbt. \u00c9tant donn\u00e9 que <noindex><a rel=\"nofollow\" href=\"https:\/\/tensor.ru\/about\/career\/vacancies\">nous \u00e0 \u00ab Tensor \u00bb<\/a><\/noindex> n'avons pas de d\u00e9veloppeurs \u00e9trangers, et PostgreSQL nous permet de donner des noms m\u00eame en id\u00e9ogrammes, \u00e0 condition qu'ils <u>soient entour\u00e9s de guillemets<\/u>, nous pr\u00e9f\u00e9rons nommer les objets de mani\u00e8re claire et explicite, pour \u00e9viter les ambigu\u00eft\u00e9s.<br \/>\n\u00c9tant donn\u00e9 que de nombreuses personnes \u00e9crivent des messages simultan\u00e9ment, certaines d'entre elles peuvent le faire <u>en mode hors ligne<\/u>, la solution la plus simple est de <b>utiliser des UUID comme identifiants<\/b> non seulement pour les entit\u00e9s externes, mais aussi pour tous les objets dans notre service. En fait, ils peuvent m\u00eame \u00eatre g\u00e9n\u00e9r\u00e9s du c\u00f4t\u00e9 client \u2014 cela nous aidera \u00e0 maintenir l'envoi de messages lors d'une br\u00e8ve indisponibilit\u00e9 de la base de donn\u00e9es, et la probabilit\u00e9 de collision est extr\u00eamement faible.<\/p>\n<p>La structure de base des tables dans notre base de donn\u00e9es ressemblera \u00e0 ceci :<br \/>\n<b class=\"spoiler_title\">Tables : RU<\/b><\/p>\n<pre><code class=\"sql\">CREATE TABLE \"Th\u00e8me\"(\n  \"Th\u00e8me\"\n    uuid\n      PRIMARY KEY\n, \"Document\"\n    uuid\n, \"Titre\"\n    text\n);\n\nCREATE TABLE \"Message\"(\n  \"Message\"\n    uuid\n      PRIMARY KEY\n, \"Th\u00e8me\"\n    uuid\n, \"Auteur\"\n    uuid\n, \"DateHeure\"\n    timestamp\n, \"Texte\"\n    text\n);\n\nCREATE TABLE \"Destinataire\"(\n  \"Message\"\n    uuid\n, \"Personne\"\n    uuid\n, PRIMARY KEY(\"Message\", \"Personne\")\n);\n\nCREATE TABLE \"Fichier\"(\n  \"Fichier\"\n    uuid\n      PRIMARY KEY\n, \"Message\"\n    uuid\n, \"BLOB\"\n    uuid\n, \"Nom\"\n    text\n);<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Tables : 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 chose la plus simple \u00e0 faire en d\u00e9crivant le format est de commencer par \"d\u00e9velopper\" le graphique des relations <b>\u00e0 partir des tables qui ne r\u00e9f\u00e9rencent pas<\/b> elles-m\u00eames qui que ce soit.<\/p><\/blockquote>\n<p><\/p>\n<h2>\u00c9tape 4 : D\u00e9terminer les besoins non \u00e9vidents<\/h2>\n<p>\nVoil\u00e0, nous avons con\u00e7u une base dans laquelle il est possible d'\u00e9crire parfaitement et <i><b>de quelque mani\u00e8re que ce soit<\/b><\/i> de lire.<\/p>\n<p>Mettons-nous \u00e0 la place de l'utilisateur de notre service : que souhaitons-nous r\u00e9aliser avec son aide ?<\/p>\n<ul>\n<li><i>Messages r\u00e9cents<\/i><br \/>\nC'est <b>un registre \u00ab de mes \u00bb messages tri\u00e9s par ordre chronologique<\/b> selon diff\u00e9rents crit\u00e8res le registre de mes messages. O\u00f9 je suis l'un des destinataires, o\u00f9 je suis l'auteur, o\u00f9 on m'a \u00e9crit et je n'ai pas r\u00e9pondu, o\u00f9 je n'ai pas re\u00e7u de r\u00e9ponse, ...<\/li>\n<li><i>Participants \u00e0 la conversation<\/i><br \/>\nQui participe \u00e0 cette longue conversation ?<\/li>\n<\/ul>\n<p>\nNotre structure permet de r\u00e9soudre ces deux probl\u00e8mes \u00ab en g\u00e9n\u00e9ral \u00bb, mais rapidement - non. Le probl\u00e8me est qu'il est impossible de cr\u00e9er un index <b>qui convienne \u00e0 chaque participant (et il faudra extraire tous les enregistrements), et pour r\u00e9soudre le second, il faut<\/b>extraire tous les messages <b>sur le sujet.<\/b> Des t\u00e2ches utilisateur non pr\u00e9vues peuvent mettre un coup dur \u00e0 la performance.<\/p>\n<blockquote><p>\u00c9tape 5 : Une d\u00e9normalisation raisonn\u00e9e <b>Nos deux probl\u00e8mes pourront \u00eatre r\u00e9solus par des tables suppl\u00e9mentaires dans lesquelles nous allons<\/b>.<\/p><\/blockquote>\n<p><\/p>\n<h2>dupliquer une partie des donn\u00e9es<\/h2>\n<p>\n, n\u00e9cessaires pour former des index adapt\u00e9s \u00e0 nos t\u00e2ches. <b>CREATE TABLE \"MessageRegistry\"(\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 \"MessageRegistry\"(\"Owner\", \"RegistryType\", \"DateTime\" DESC);\n\nCREATE TABLE \"ThemeParticipant\"(\n  \"Theme\"\n    uuid\n, \"Person\"\n    uuid\n, PRIMARY KEY(\"Theme\", \"Person\")\n);<\/b>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);<br \/>\n<img decoding=\"async\" alt=\"BD du messager (partie 1) : concevoir la structure de la base\" src=\"\/wp-content\/uploads\/2020\/01\/f136a9904518b05bca74cc2b9c2f01b2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b class=\"spoiler_title\">Tables : RU<\/b><\/p>\n<pre><code class=\"sql\">Ici, nous avons appliqu\u00e9 deux approches typiques lors de la cr\u00e9ation de tables auxiliaires :<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Tables : EN<\/b><\/p>\n<pre><code class=\"sql\">La multiplication des enregistrements<\/code><\/pre>\n<p>\nNous formons plusieurs enregistrements cons\u00e9quences pour chaque enregistrement source de message dans diff\u00e9rents types de registres pour diff\u00e9rents propri\u00e9taires - tant pour l'exp\u00e9diteur que pour le destinataire. Ainsi, chaque registre est maintenant mis \u00e0 l'index - car dans la plupart des cas, nous voudrons voir seulement la premi\u00e8re page.<\/p>\n<ul>\n<li><b>La cr\u00e9ation d'enregistrements uniques<\/b><br \/>\nLors de l'envoi d'un message dans un th\u00e8me sp\u00e9cifique, il suffit de v\u00e9rifier si un tel enregistrement existe d\u00e9j\u00e0. Si ce n'est pas le cas - nous l'ajoutons \u00e0 notre \u00ab dictionnaire \u00bb.<\/li>\n<li><b>La prochaine partie de l'article parlera de<\/b><br \/>\nl'impl\u00e9mentation du partitionnement<\/li>\n<\/ul>\n<p>\ndans la structure de notre base de donn\u00e9es. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">Comment traduire les exigences commerciales en structures de donn\u00e9es concr\u00e8tes en prenant l'exemple de la conception \u00ab \u00e0 partir de z\u00e9ro \u00bb d'une base pour un messager. Partie 1 : concevoir la structure de la base.<\/a><\/noindex> \ud83e\udd47BD du messager (partie 1) : concevoir la structure de la base | ProHoster<br \/>\n<br \/>Source : <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 - 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\/fr\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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\udd47BD du messager (partie 1) : concevons la structure de la base | ProHoster","description":"Comment traduire les exigences commerciales en structures de donn\u00e9es concr\u00e8tes en concevant une base pour un messager \u00ab de z\u00e9ro \u00bb. Partie 1 : concevons la structure de la base.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/55011","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=55011"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/55011\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=55011"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=55011"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=55011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}