{"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\/es\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy","title":{"rendered":"BD del mensajero (parte 1): dise\u00f1ando la estructura de la base de datos","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>\u00bfC\u00f3mo se pueden traducir los requisitos del negocio en estructuras de datos espec\u00edficas tomando como ejemplo el dise\u00f1o de una base de datos de mensajer\u00eda desde cero?<\/p>\n<ul>\n<li>Parte 1: dise\u00f1amos la estructura de la base<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">Parte 2: seccionamos 'en vivo'<\/a><\/noindex><\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"BD del mensajero (parte 1): dise\u00f1ando la estructura de la base de datos\" src=\"\/wp-content\/uploads\/2020\/01\/d4e85052405da3f6580e4e931c292079.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNuestra base no ser\u00e1 tan masiva y distribuida, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/vk\/blog\/342570\/\">como la de Vkontakte<\/a><\/noindex> o <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/340976\/\">Badoo<\/a><\/noindex>, sino que ser\u00e1 'suficiente', pero bien, es decir, funcional, r\u00e1pida y <b>que quepa en un solo servidor<\/b> PostgreSQL \u2013 para poder desplegar una instancia separada del servicio en alg\u00fan lugar, por ejemplo.<\/p>\n<p>Por lo tanto, no abordaremos cuestiones de sharding, replicaci\u00f3n y sistemas geodistribuidos, sino que nos enfocaremos en soluciones esquem\u00e1ticas dentro de la base de datos.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Paso 1: un poco de especificidad del negocio<\/h2>\n<p>\nNo vamos a dise\u00f1ar nuestro sistema de mensajer\u00eda de forma abstracta, sino que lo integraremos en el entorno <noindex><a rel=\"nofollow\" href=\"https:\/\/sbis.ru\/help\/work_in\/sms\/\">de una red social corporativa<\/a><\/noindex>. Es decir, las personas no 'simplemente intercambian mensajes', sino que se comunican entre s\u00ed en el contexto de la soluci\u00f3n de ciertos problemas de negocio.<\/p>\n<p>\u00bfQu\u00e9 tipo de problemas enfrenta el negocio?.. Veamos el ejemplo de Vasily, el jefe del departamento de desarrollo.<\/p>\n<ul>\n<li><i>\u2018Nikolai, \u00a1necesitamos un parche para esta tarea hoy!\u2019<\/i><br \/>\nPor lo tanto, la conversaci\u00f3n puede llevarse a cabo en el contexto de alg\u00fan <b>del documento<\/b>.<\/li>\n<li><i>\u2018\u00bfKolia, vamos esta noche a Dota?\u2019<\/i><br \/>\nEs decir, incluso en una pareja de interlocutores, la comunicaci\u00f3n puede ocurrir simult\u00e1neamente <b>sobre diferentes temas<\/b>.<\/li>\n<li><i>\u2018Petr, Nikolai, miren en el adjunto el precio del nuevo servidor.\u2019<\/i><br \/>\nAs\u00ed, un mensaje puede tener <b>varios destinatarios<\/b>. Al mismo tiempo, el mensaje puede contener <b>archivos adjuntos<\/b>.<\/li>\n<li><i>\u2018Semyon, t\u00fa tambi\u00e9n echa un vistazo.\u2019<\/i><br \/>\nY debe haber la posibilidad de invitar a un nuevo participante a la conversaci\u00f3n que ya existe. <b>Deteng\u00e1monos por ahora en esta lista de necesidades 'evidentes'.<\/b>.<\/li>\n<\/ul>\n<p>\nSin entender la especificidad aplicada de la tarea y las limitaciones que impone, es pr\u00e1cticamente imposible dise\u00f1ar<\/p>\n<blockquote><p>un esquema de base de datos <b>eficaz para su soluci\u00f3n.<\/b> Paso 2: esquema l\u00f3gico m\u00ednimo<\/p><\/blockquote>\n<p><\/p>\n<h2>Por ahora, el esquema se parece mucho a una conversaci\u00f3n por correo electr\u00f3nico, una herramienta tradicional para llevar a cabo negocios. As\u00ed que s\u00ed, \u2018algor\u00edtmicamente\u2019 muchos problemas de negocio son similares entre s\u00ed, por lo que las herramientas para resolverlos tambi\u00e9n ser\u00e1n estructuralmente similares.<\/h2>\n<p>\nVamos a fijar el esquema l\u00f3gico de relaciones entre entidades ya obtenido. Para facilitar la comprensi\u00f3n de nuestro modelo, utilizaremos la variante m\u00e1s primitiva de representaci\u00f3n<\/p>\n<p>del modelo ER <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ER-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C\">sin complicaciones de notaciones UML o IDEF:<\/a><\/noindex> sin complicaciones de UML o notaciones IDEF:<\/p>\n<p><img decoding=\"async\" alt=\"BD del mensajero (parte 1): dise\u00f1ando la estructura de la base de datos\" src=\"\/wp-content\/uploads\/2020\/01\/75d0b3cf9e5a44ae3e243449fa406fbc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn nuestro ejemplo, el personaje, el documento y el \u00abcuerpo\u00bb binario del archivo son entidades \u00abexternas\u00bb que existen por s\u00ed solas, incluso sin nuestro servicio. Por lo tanto, simplemente las consideraremos a partir de ahora como enlaces \u00abhacia\u00bb algo mediante UUID.<\/p>\n<blockquote><p>Dibujen <b>diagramas lo m\u00e1s simples posible<\/b> \u2014 la mayor\u00eda de aquellos a quienes se los mostrar\u00e1n no son expertos en leer UML\/IDEF. Pero \u2014 dibujen sin falta.<\/p><\/blockquote>\n<p><\/p>\n<h2>Paso 3: Esbozamos la estructura de las tablas<\/h2>\n<p>\n<b class=\"spoiler_title\">Sobre los nombres de las tablas y los campos<\/b>Se pueden tener diferentes opiniones sobre los nombres 'rusos' de campos y tablas, pero es cuesti\u00f3n de gusto. Dado que <noindex><a rel=\"nofollow\" href=\"https:\/\/tensor.ru\/about\/career\/vacancies\">en 'Tensor'<\/a><\/noindex> no tenemos desarrolladores extranjeros, y PostgreSQL nos permite nombrar incluso con jerogl\u00edficos, siempre que est\u00e9n <u>entre comillas<\/u>, preferimos nombrar los objetos de forma clara y comprensible para evitar malentendidos.<br \/>\nDado que muchos autores escriben los mensajes al mismo tiempo, algunos de ellos pueden hacerlo <u>fuera de l\u00ednea<\/u>, la opci\u00f3n m\u00e1s sencilla es <b>usar UUID como identificadores<\/b> no solo para entidades externas, sino tambi\u00e9n para todos los objetos dentro de nuestro servicio. Adem\u00e1s, se pueden generar incluso del lado del cliente \u2014 esto nos ayudar\u00e1 a mantener el env\u00edo de mensajes durante la breve indisponibilidad de la base de datos, y la probabilidad de colisiones es extremadamente baja.<\/p>\n<p>La estructura preliminar de las tablas en nuestra base tendr\u00e1 este aspecto:<br \/>\n<b class=\"spoiler_title\">Tablas: RU<\/b><\/p>\n<pre><code class=\"sql\">CREATE TABLE \"Tema\"(\n  \"Tema\"\n    uuid\n      PRIMARY KEY\n, \"Documento\"\n    uuid\n, \"T\u00edtulo\"\n    text\n);\n\nCREATE TABLE \"Mensaje\"(\n  \"Mensaje\"\n    uuid\n      PRIMARY KEY\n, \"Tema\"\n    uuid\n, \"Autor\"\n    uuid\n, \"FechaHora\"\n    timestamp\n, \"Texto\"\n    text\n);\n\nCREATE TABLE \"Destinatario\"(\n  \"Mensaje\"\n    uuid\n, \"Persona\"\n    uuid\n, PRIMARY KEY(\"Mensaje\", \"Persona\")\n);\n\nCREATE TABLE \"Archivo\"(\n  \"Archivo\"\n    uuid\n      PRIMARY KEY\n, \"Mensaje\"\n    uuid\n, \"BLOB\"\n    uuid\n, \"Nombre\"\n    text\n);<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Tablas: 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>Lo m\u00e1s simple al describir el formato es empezar a \"desenredar\" el gr\u00e1fico de relaciones <b>a partir de las tablas que no hacen referencia<\/b> a ninguna.<\/p><\/blockquote>\n<p><\/p>\n<h2>Paso 4: Identificamos necesidades no evidentes<\/h2>\n<p>\nYa hemos dise\u00f1ado una base en la que se puede escribir y <i><b>de alguna manera<\/b><\/i> leer con facilidad.<\/p>\n<p>Pong\u00e1monos en el lugar del usuario de nuestro servicio: \u00bfqu\u00e9 querr\u00edamos hacer con su ayuda?<\/p>\n<ul>\n<li><i>\u00daltimos mensajes<\/i><br \/>\nEs <b>un registro cronol\u00f3gicamente ordenado<\/b> por diversos criterios, el registro de \"mis\" mensajes. Donde soy uno de los destinatarios, donde soy el autor, donde me escribieron y no respond\u00ed, donde no me respondieron, ...<\/li>\n<li><i>Participantes de la conversaci\u00f3n<\/i><br \/>\n\u00bfQui\u00e9nes participan en este largo, largo chat?<\/li>\n<\/ul>\n<p>\nNuestra estructura permite abordar ambas tareas \"en general\", pero r\u00e1pidamente no. El problema es que para la clasificaci\u00f3n en el marco de la primera tarea <b>es imposible crear un \u00edndice<\/b>, que sea adecuado para cada uno de los participantes (tendremos que extraer todos los registros), y para resolver la segunda necesitamos <b>extraer todos los mensajes<\/b> sobre el tema.<\/p>\n<blockquote><p>Las tareas de usuario no previstas pueden poner un fuerte <b>par\u00f3n en el rendimiento<\/b>.<\/p><\/blockquote>\n<p><\/p>\n<h2>Paso 5: Denormalizaci\u00f3n razonable<\/h2>\n<p>\nAmbos problemas se pueden resolver con tablas adicionales, en las que vamos a <b>duplicar parte de los datos<\/b>, necesarios para formar \u00edndices adecuados para nuestras tareas sobre ellas.<br \/>\n<img decoding=\"async\" alt=\"BD del mensajero (parte 1): dise\u00f1ando la estructura de la base de datos\" src=\"\/wp-content\/uploads\/2020\/01\/f136a9904518b05bca74cc2b9c2f01b2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b class=\"spoiler_title\">Tablas: RU<\/b><\/p>\n<pre><code class=\"sql\">CREATE TABLE \"RegistroMensajes\"(\n  \"Propietario\"\n    uuid\n, \"TipoRegistro\"\n    smallint\n, \"FechaHora\"\n    timestamp\n, \"Mensaje\"\n    uuid\n, PRIMARY KEY(\"Propietario\", \"TipoRegistro\", \"Mensaje\")\n);\nCREATE INDEX ON \"RegistroMensajes\"(\"Propietario\", \"TipoRegistro\", \"FechaHora\" DESC);\n\nCREATE TABLE \"ParticipanteTema\"(\n  \"Tema\"\n    uuid\n, \"Persona\"\n    uuid\n, PRIMARY KEY(\"Tema\", \"Persona\")\n);<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Tablas: 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>\nAqu\u00ed hemos aplicado dos enfoques t\u00edpicos utilizados al crear tablas auxiliares:<\/p>\n<ul>\n<li><b>Multiplicaci\u00f3n de registros<\/b><br \/>\nGeneramos m\u00faltiples registros derivativos a partir de un solo registro original de mensaje en diferentes tipos de registros para diferentes propietarios, tanto para el remitente como para el destinatario. Pero cada uno de los registros ahora se ajusta al \u00edndice, ya que en un caso t\u00edpico desearemos ver solo la primera p\u00e1gina.<\/li>\n<li><b>Unificaci\u00f3n de registros<\/b><br \/>\nAl enviar un mensaje dentro de un tema espec\u00edfico, basta con comprobar si ya existe dicho registro. Si no, lo a\u00f1adimos a nuestro \"diccionario\".<\/li>\n<\/ul>\n<p>\nEn la siguiente parte del art\u00edculo hablaremos sobre <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">la implementaci\u00f3n de particiones<\/a><\/noindex> en nuestra estructura de base de datos.<br \/>\n<br \/>Fuente: <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\/es\/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=\"es_ES\" \/>\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\/es\/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 del mensajero (parte 1): dise\u00f1ando la estructura de la base | ProHoster","description":"C\u00f3mo se pueden traducir los requisitos del negocio en estructuras de datos concretas tomando como ejemplo el dise\u00f1o \"desde cero\" de una base para un mensajero. Parte 1: dise\u00f1ando la estructura de la base","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/55011","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=55011"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/55011\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=55011"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=55011"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=55011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}