{"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\/de\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy","title":{"rendered":"Datenbank des Messengers (Teil 1): Rahmen der Datenbank entwerfen","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Wie man Gesch\u00e4ftsanforderungen in konkrete Datenstrukturen \u00fcbertr\u00e4gt, am Beispiel der Gestaltung einer Datenbank f\u00fcr einen Messenger \u201evon Grund auf\u201c.<\/p>\n<ul>\n<li>Teil 1: Gestalten des Datenbankger\u00fcsts<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">Teil 2: Sektionierung \u201elive\u201c<\/a><\/noindex><\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Datenbank des Messengers (Teil 1): Rahmen der Datenbank entwerfen\" src=\"\/wp-content\/uploads\/2020\/01\/d4e85052405da3f6580e4e931c292079.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nUnsere Datenbank wird nicht so umfangreich und verteilt sein, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/vk\/blog\/342570\/\">wie bei VKontakte<\/a><\/noindex> oder <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/340976\/\">Badoo<\/a><\/noindex>, sondern \u201enur damit es da ist\u201c, doch es soll gut sein \u2013 funktional, schnell und <b>auf einem Server Platz finden<\/b> PostgreSQL \u2013 damit man einen separaten Dienst-Exemplar irgendwo an der Seite bereitstellen kann, zum Beispiel.<\/p>\n<p>Deshalb werden wir die Fragen der Sharding, Replikation und geo-verteilten Systeme nicht behandeln, sondern uns auf schematische L\u00f6sungen innerhalb der DB konzentrieren.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Schritt 1: Etwas gesch\u00e4ftsspezifisches<\/h2>\n<p>\nUnser Nachrichtenaustausch wird nicht abstrakt entworfen, sondern in die Umgebung <noindex><a rel=\"nofollow\" href=\"https:\/\/sbis.ru\/help\/work_in\/sms\/\">der Unternehmens-Sozialen Netzwerke<\/a><\/noindex>eingebettet. Das hei\u00dft, die Menschen \u201eunterhalten sich\u201c nicht einfach, sondern kommunizieren im Kontext der L\u00f6sung bestimmter gesch\u00e4ftlicher Aufgaben.<\/p>\n<p>Und welche Aufgaben gibt es im Gesch\u00e4ft?.. Schauen wir uns das am Beispiel von Wladimir \u2013 dem Leiter der Entwicklungsabteilung \u2013 an.<\/p>\n<ul>\n<li><i>\u201eNikolaj, f\u00fcr diese Aufgabe wird das Patch schon heute ben\u00f6tigt!\u201c<\/i><br \/>\nDas hei\u00dft, die Korrespondenz kann im Kontext eines <b>des Dokuments<\/b>.<\/li>\n<li><i>\u201eKola, lass am Abend in Dota gehen?\u201c<\/i><br \/>\nDas bedeutet, dass selbst bei einem Paar Gespr\u00e4chspartner die Kommunikation gleichzeitig <b>\u00fcber verschiedene Themen gef\u00fchrt werden kann<\/b>.<\/li>\n<li><i>\u201ePeter, Nikolaj, schaut euch im Anhang den Preis f\u00fcr den neuen Server an.\u201c<\/i><br \/>\nSo kann eine Nachricht <b>mehrere Empf\u00e4nger haben.<\/b>Dabei kann die Nachricht <b>anh\u00e4ngende Dateien enthalten<\/b>.<\/li>\n<li><i>\u201eSemen, schau du auch mal.\u201c<\/i><br \/>\nUnd es muss m\u00f6glich sein, einen neuen Teilnehmer <b>in eine bereits bestehende Korrespondenz einzuladen.<\/b>.<\/li>\n<\/ul>\n<p>\nLassen Sie uns vorerst bei dieser Liste der \u201eoffensichtlichen\u201c Bed\u00fcrfnisse bleiben.<\/p>\n<blockquote><p>Ohne das Verst\u00e4ndnis der anwendungsbezogenen Spezifik der Aufgabe und der damit verbundenen Einschr\u00e4nkungen ist es praktisch unm\u00f6glich, eine <b>effektive<\/b> Datenbankschema f\u00fcr ihre L\u00f6sung zu entwerfen.<\/p><\/blockquote>\n<p><\/p>\n<h2>Schritt 2: Minimales logisches Schema<\/h2>\n<p>\nSchematisch sieht es bisher sehr \u00e4hnlich aus wie bei E-Mail-Korrespondenz \u2013 einem traditionellen Gesch\u00e4ftsinstrument. Tats\u00e4chlich sind viele gesch\u00e4ftliche Aufgaben \u201ealgorithmisch\u201c einander \u00e4hnlich, weshalb auch die Instrumente zu ihrer L\u00f6sung strukturell \u00e4hnlich sein werden.<\/p>\n<p>Lassen Sie uns das bereits erhaltene logische Schema der Beziehungen der Entit\u00e4ten festhalten. Zur Vereinfachung unserer Modellssicht verwenden wir die einfachste Variante der Darstellung <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ER-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C\">ER-Modells<\/a><\/noindex> ohne Komplikationen durch UML oder IDEF-Notationen:<\/p>\n<p><img decoding=\"async\" alt=\"Datenbank des Messengers (Teil 1): Rahmen der Datenbank entwerfen\" src=\"\/wp-content\/uploads\/2020\/01\/75d0b3cf9e5a44ae3e243449fa406fbc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn unserem Beispiel sind die Person, das Dokument und der bin\u00e4re \u201eK\u00f6rper\u201c der Datei externe Entit\u00e4ten, die unabh\u00e4ngig von unserem Dienst existieren. Daher werden wir sie in Zukunft einfach als Links \u201eirgendwohin\u201c nach UUID betrachten.<\/p>\n<blockquote><p>Zeichnen Sie <b>Diagramme so einfach wie m\u00f6glich<\/b> \u2014 die meisten von denen, denen Sie sie zeigen werden, sind keine Experten im Lesen von UML\/IDEF. Aber \u2014 zeichnen Sie es auf jeden Fall.<\/p><\/blockquote>\n<p><\/p>\n<h2>Schritt 3: Skizzieren Sie die Struktur der Tabellen<\/h2>\n<p>\n<b class=\"spoiler_title\">\u00dcber die Namen von Tabellen und Feldern<\/b>Zu den \u201erussischen\u201c Bezeichnungen von Feldern und Tabellen kann man unterschiedlich stehen, aber das ist Geschmackssache. Da <noindex><a rel=\"nofollow\" href=\"https:\/\/tensor.ru\/about\/career\/vacancies\">wir in \u201eTensor\u201c<\/a><\/noindex> keine ausl\u00e4ndischen Entwickler haben und PostgreSQL es uns erlaubt, Namen sogar mit Hieroglyphen zu geben, wenn sie <u>in Anf\u00fchrungszeichen gesetzt sind<\/u>, ziehen wir es vor, Objekte eindeutig und klar zu benennen, um Missverst\u00e4ndnisse zu vermeiden.<br \/>\nDa viele Menschen gleichzeitig Nachrichten schreiben, k\u00f6nnen einige dies sogar <u>im Offline-Modus<\/u>, ist die einfachste Variante \u2014 <b>UUIDs als Identifikatoren zu verwenden<\/b> nicht nur f\u00fcr externe Entit\u00e4ten, sondern auch f\u00fcr alle Objekte innerhalb unseres Dienstes. Au\u00dferdem k\u00f6nnen sie sogar auf der Client-Seite generiert werden \u2014 das hilft uns, den Versand von Nachrichten bei kurzfristiger Nichtverf\u00fcgbarkeit der Datenbank aufrechtzuerhalten, und die Wahrscheinlichkeit einer Kollision ist extrem gering.<\/p>\n<p>Die grobe Struktur der Tabellen in unserer Datenbank wird folgenderma\u00dfen aussehen:<br \/>\n<b class=\"spoiler_title\">Tabellen : RU<\/b><\/p>\n<pre><code class=\"sql\">CREATE TABLE \"Thema\"(\n  \"Thema\"\n    uuid\n      PRIMARY KEY\n, \"Dokument\"\n    uuid\n, \"Titel\"\n    text\n);\n\nCREATE TABLE \"Nachricht\"(\n  \"Nachricht\"\n    uuid\n      PRIMARY KEY\n, \"Thema\"\n    uuid\n, \"Autor\"\n    uuid\n, \"DatumUhrzeit\"\n    timestamp\n, \"Text\"\n    text\n);\n\nCREATE TABLE \"Adressat\"(\n  \"Nachricht\"\n    uuid\n, \"Person\"\n    uuid\n, PRIMARY KEY(\"Nachricht\", \"Person\")\n);\n\nCREATE TABLE \"Datei\"(\n  \"Datei\"\n    uuid\n      PRIMARY KEY\n, \"Nachricht\"\n    uuid\n, \"BLOB\"\n    uuid\n, \"Name\"\n    text\n);<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Tabellen : 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>Das Einfachste bei der Beschreibung des Formats ist, mit den \u201everkn\u00fcpften\u201c Beziehungen <b>von Tabellen zu beginnen, die sich nicht auf<\/b> niemanden beziehen.<\/p><\/blockquote>\n<p><\/p>\n<h2>Schritt 4: Unklarheiten ermitteln<\/h2>\n<p>\nAlles, wir haben eine Datenbank entworfen, in die man hervorragend schreiben kann und <i><b>irgendwie<\/b><\/i> lesen.<\/p>\n<p>Lassen Sie uns in die Rolle des Nutzers unseres Dienstes schl\u00fcpfen \u2013 was m\u00f6chten wir mit ihm erreichen?<\/p>\n<ul>\n<li><i>Letzte Nachrichten<\/i><br \/>\nDas ist <b>chronologisch sortiert<\/b> nach verschiedenen Kriterien das Register \"meiner\" Nachrichten. Wo ich einer der Empf\u00e4nger bin, wo ich der Autor bin, wo man mir geschrieben hat und ich nicht geantwortet habe, wo mir nicht geantwortet wurde, ...<\/li>\n<li><i>Teilnehmer der Korrespondenz<\/i><br \/>\nWer nimmt eigentlich an diesem langen, langen Chat teil?<\/li>\n<\/ul>\n<p>\nUnsere Struktur erm\u00f6glicht es, beide Aufgaben \u201e\u00fcberhaupt\u201c zu l\u00f6sen, aber schnell \u2013 nein. Das Problem ist, dass es f\u00fcr die Sortierung im Rahmen der ersten Aufgabe <b>unm\u00f6glich ist, einen Index zu erstellen,<\/b>, der f\u00fcr jeden der Teilnehmer geeignet ist (und wir m\u00fcssen alle Eintr\u00e4ge abrufen), und zur L\u00f6sung der zweiten Aufgabe ist es notwendig, <b>alle Nachrichten<\/b> zum Thema abzurufen.<\/p>\n<blockquote><p>Unvorhergesehene Nutzeraufgaben k\u00f6nnen eine gro\u00dfe <b>Belastung f\u00fcr die Leistung darstellen.<\/b>.<\/p><\/blockquote>\n<p><\/p>\n<h2>Schritt 5: Sinnvolle Denormalisierung<\/h2>\n<p>\nBeide unsere Probleme k\u00f6nnen mit zus\u00e4tzlichen Tabellen gel\u00f6st werden, in denen wir <b>einen Teil der Daten duplizieren<\/b>, die f\u00fcr die Bildung geeigneter Indizes f\u00fcr unsere Aufgaben notwendig sind.<br \/>\n<img decoding=\"async\" alt=\"Datenbank des Messengers (Teil 1): Rahmen der Datenbank entwerfen\" src=\"\/wp-content\/uploads\/2020\/01\/f136a9904518b05bca74cc2b9c2f01b2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b class=\"spoiler_title\">Tabellen : RU<\/b><\/p>\n<pre><code class=\"sql\">CREATE TABLE \"NachrichtenRegister\"(\n  \"Besitzer\"\n    uuid\n, \"RegisterTyp\"\n    smallint\n, \"DatumZeit\"\n    timestamp\n, \"Nachricht\"\n    uuid\n, PRIMARY KEY(\"Besitzer\", \"RegisterTyp\", \"Nachricht\")\n);\nCREATE INDEX ON \"NachrichtenRegister\"(\"Besitzer\", \"RegisterTyp\", \"DatumZeit\" DESC);\n\nCREATE TABLE \"ThemaTeilnehmer\"(\n  \"Thema\"\n    uuid\n, \"Person\"\n    uuid\n, PRIMARY KEY(\"Thema\", \"Person\")\n);<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Tabellen : 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>\nHier haben wir zwei typische Ans\u00e4tze angewendet, die bei der Erstellung von Hilfstabellen verwendet werden:<\/p>\n<ul>\n<li><b>Multiplikation von Eintr\u00e4gen<\/b><br \/>\nWir erstellen aus einem einzelnen urspr\u00fcnglichen Eintrag mehrere Folgeeintr\u00e4ge in verschiedene Arten von Registern f\u00fcr verschiedene Eigent\u00fcmer \u2013 sowohl f\u00fcr den Absender als auch f\u00fcr den Empf\u00e4nger. So hat nun jeder dieser Register einen Index \u2013 denn typischerweise m\u00f6chten wir nur die erste Seite sehen.<\/li>\n<li><b>Eindeutigkeit von Eintr\u00e4gen<\/b><br \/>\nBei jedem Versand einer Nachricht innerhalb eines bestimmten Themas gen\u00fcgt es zu \u00fcberpr\u00fcfen, ob ein solcher Eintrag bereits existiert. Wenn nicht \u2013 f\u00fcgen wir ihn in unser \u201eW\u00f6rterbuch\u201c ein.<\/li>\n<\/ul>\n<p>\nIm n\u00e4chsten Teil des Artikels wird es um die <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">Implementierung von Partitionierung<\/a><\/noindex> in die Struktur unserer Datenbank gehen.<br \/>\n<br \/>Quelle: <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\/de\/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=\"de_DE\" \/>\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\/de\/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\udd47Datenbank des Messengers (Teil 1): Wir entwerfen das Grundger\u00fcst der Datenbank | ProHoster","description":"Wie man Gesch\u00e4ftsanforderungen in spezifische Datenstrukturen umsetzt, am Beispiel der Gestaltung einer Datenbank f\u00fcr einen Messenger \u201evon Grund auf\u201c. Teil 1: Wir entwerfen das Grundger\u00fcst der Datenbank","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/55011","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=55011"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/55011\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=55011"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=55011"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=55011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}