{"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): Entwurf des Datenbankger\u00fcsts","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Wie man Gesch\u00e4ftsanforderungen in spezifische Datenstrukturen umwandelt am Beispiel der Planung einer Datenbank von Grund auf f\u00fcr einen Messenger.<\/p>\n<ul>\n<li>Teil 1: das Ger\u00fcst der Datenbank entwerfen<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">Teil 2: \u201elive\u201c partitionieren<\/a><\/noindex><\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Datenbank des Messengers (Teil 1): Entwurf des Datenbankger\u00fcsts\" src=\"\/wp-content\/uploads\/2020\/01\/d4e85052405da3f6580e4e931c292079.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nUnsere Datenbank wird nicht so gro\u00df und verteilt sein wie die von <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/vk\/blog\/342570\/\">VKontakte<\/a><\/noindex> oder <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/340976\/\">Badoo<\/a><\/noindex>, sondern eher bescheiden, aber dennoch gut \u2013 funktional, schnell und <b>auf einem Server Platz finden.<\/b> PostgreSQL \u2013 damit wir einen separaten Instanz des Dienstes irgendwo anders bereitstellen k\u00f6nnen, zum Beispiel.<\/p>\n<p>Deshalb werden wir keine Fragen zu Sharding, Replikation und geo-distribuierten Systemen behandeln, sondern uns auf die strukturellen L\u00f6sungen innerhalb der Datenbank konzentrieren.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Schritt 1: Ein wenig gesch\u00e4ftsspezifische Informationen<\/h2>\n<p>\nWir werden unseren Nachrichtenaustausch nicht abstrakt entwerfen, sondern in die Umgebung <noindex><a rel=\"nofollow\" href=\"https:\/\/sbis.ru\/help\/work_in\/sms\/\">eines Unternehmensnetzwerks<\/a><\/noindex>integrieren. Das hei\u00dft, die Menschen kommunizieren nicht einfach, sondern interagieren im Kontext der L\u00f6sung spezifischer Gesch\u00e4ftsprobleme.<\/p>\n<p>Welche Aufgaben hat ein Unternehmen?... Schauen wir uns das am Beispiel von Vasily, dem Leiter der Entwicklungsabteilung, an.<\/p>\n<ul>\n<li><i>\"Nikolai, der Patch f\u00fcr diese Aufgabe wird bereits heute ben\u00f6tigt!\"<\/i><br \/>\nDas bedeutet, dass die Kommunikation im Kontext von etwas stattfinden kann. <b>des Dokuments<\/b>.<\/li>\n<li><i>\"Koya, lass uns heute Abend Dota spielen?\"<\/i><br \/>\nDas bedeutet, dass sogar bei einem Paar von Gespr\u00e4chspartnern gleichzeitig \u00fcber <b>verschiedene Themen kommuniziert werden kann.<\/b>.<\/li>\n<li><i>\u201ePeter, Nikolai, schaut euch im Anhang die Preisliste f\u00fcr den neuen Server an.\u201d<\/i><br \/>\nSo kann eine Nachricht <b>mehrere Empf\u00e4nger haben.<\/b>. Dabei kann die Nachricht <b>angeh\u00e4ngte Dateien enthalten.<\/b>.<\/li>\n<li><i>\u201eSemen, du solltest auch einen Blick darauf werfen.\u201d<\/i><br \/>\nUnd es sollte m\u00f6glich sein, einen neuen Teilnehmer in die bereits bestehende Korrespondenz <b>einzuladen.<\/b>.<\/li>\n<\/ul>\n<p>\nLassen Sie uns vorerst bei dieser Liste der \u201eoffensichtlichen\u201d Bed\u00fcrfnisse bleiben.<\/p>\n<blockquote><p>Ohne das Verst\u00e4ndnis der spezifischen Anforderungen und der ihnen auferlegten Einschr\u00e4nkungen ist es praktisch unm\u00f6glich, eine <b>effektive<\/b> Datenbankschema f\u00fcr deren L\u00f6sung zu entwerfen.<\/p><\/blockquote>\n<p><\/p>\n<h2>Schritt 2: Minimales logisches Schema<\/h2>\n<p>\nVorl\u00e4ufig \u00e4hnelt alles sehr der E-Mail-Korrespondenz \u2014 einem traditionellen Gesch\u00e4ftsf\u00fchrungstool. Ja, \u201ealgorithmisch\u201d \u00e4hneln sich viele Gesch\u00e4ftsaufgaben, daher werden auch die Werkzeuge zu ihrer L\u00f6sung strukturell \u00e4hnlich sein.<\/p>\n<p>Lassen Sie uns das bereits erhaltene logische Schema der Entit\u00e4tenbeziehungen festhalten. Zur Vereinfachung des Verst\u00e4ndnisses unserer Modell nutzen wir die einfachste Form 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-Modelle<\/a><\/noindex> ohne komplizierte UML- oder IDEF-Notation.<\/p>\n<p><img decoding=\"async\" alt=\"Datenbank des Messengers (Teil 1): Entwurf des Datenbankger\u00fcsts\" src=\"\/wp-content\/uploads\/2020\/01\/75d0b3cf9e5a44ae3e243449fa406fbc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn unserem Beispiel sind die Persona, das Dokument und das bin\u00e4re \u201eK\u00f6rper\u201c der Datei \u201eexterne\u201c Entit\u00e4ten, die unabh\u00e4ngig von unserem Dienst existieren. Daher betrachten wir sie k\u00fcnftig einfach als Links \u201eirgendwo\u201c \u00fcber UUID.<\/p>\n<blockquote><p>Zeichnen Sie <b>Schemen so einfach wie m\u00f6glich<\/b> \u2014 Die meisten derjenigen, die Sie sie zeigen werden, sind keine Experten im Lesen von UML\/IDEF. Aber zeichnen Sie unbedingt.<\/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 'russischen' Bezeichnungen f\u00fcr Felder und Tabellen kann man unterschiedlich stehen, aber das ist Geschmackssache. Da <noindex><a rel=\"nofollow\" href=\"https:\/\/tensor.ru\/about\/career\/vacancies\">wir in 'Tensor'<\/a><\/noindex> keine ausl\u00e4ndischen Entwickler haben und PostgreSQL uns erlaubt, auch mit Hieroglyphen zu benennen, wenn sie <u>in Anf\u00fchrungszeichen stehen<\/u>, bevorzugen wir es, Objekte eindeutig verst\u00e4ndlich zu benennen, um Missverst\u00e4ndnisse zu vermeiden.<br \/>\nDa viele Menschen gleichzeitig Nachrichten schreiben, k\u00f6nnen einige von ihnen dies <u>im Offline-Modus<\/u>, ist die einfachste Option \u2014 <b>UUIDs als Identifikatoren zu verwenden<\/b> nicht nur f\u00fcr externe Entit\u00e4ten, sondern auch f\u00fcr alle Objekte innerhalb unseres Dienstes. Zudem k\u00f6nnen sie sogar auf der Client-Seite generiert werden \u2014 das hilft uns, den Versand von Nachrichten bei kurzfristiger Nichtverf\u00fcgbarkeit der DB aufrechtzuerhalten, und die Wahrscheinlichkeit einer Kollision ist \u00e4u\u00dferst niedrig.<\/p>\n<p>Die Rohstruktur der Tabellen in unserer Datenbank wird folgenderma\u00dfen aussehen:<br \/>\n<b class=\"spoiler_title\">Tabellen : RU<\/b><\/p>\n<pre><code class=\"sql\">ERSTELLE TABELLE \"Thema\"(\n  \"Thema\"\n    uuid\n      PRIMARY KEY\n, \"Dokument\"\n    uuid\n, \"Titel\"\n    text\n);\n\nERSTELLE TABELLE \"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\nERSTELLE TABELLE \"Empf\u00e4nger\"(\n  \"Nachricht\"\n    uuid\n, \"Person\"\n    uuid\n, PRIMARY KEY(\"Nachricht\", \"Person\")\n);\n\nERSTELLE TABELLE \"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\">ERSTELLE TABELLE thema(\n  thema\n    uuid\n      PRIMARY KEY\n, dokument\n    uuid\n, titel\n    text\n);\n\nERSTELLE TABELLE nachricht(\n  nachricht\n    uuid\n      PRIMARY KEY\n, thema\n    uuid\n, autor\n    uuid\n, dt\n    timestamp\n, text\n    text\n);\n\nERSTELLE TABELLE nachricht_empf\u00e4nger(\n  nachricht\n    uuid\n, person\n    uuid\n, PRIMARY KEY(nachricht, person)\n);\n\nERSTELLE TABELLE nachricht_datei(\n  datei\n    uuid\n      PRIMARY KEY\n, nachricht\n    uuid\n, inhalt\n    uuid\n, dateiname\n    text\n);<\/code><\/pre>\n<p><\/p>\n<blockquote><p>Am einfachsten beginnt man bei der Beschreibung des Formats, indem man die Beziehungsgrafik \"enth\u00fcllt\". <b>von Tabellen, die nicht referenzieren<\/b> sich selbst auf niemanden.<\/p><\/blockquote>\n<p><\/p>\n<h2>Schritt 4: Offensichtliche Bed\u00fcrfnisse kl\u00e4ren<\/h2>\n<p>\nSo, wir haben eine Datenbank entworfen, in die man ausgezeichnet schreiben und <i><b>irgendwie<\/b><\/i> lesen kann.<\/p>\n<p>Lassen Sie uns in die Lage des Nutzers unseres Services versetzen \u2014 was w\u00fcrden wir mit dessen Hilfe tun wollen?<\/p>\n<ul>\n<li><i>Neueste Nachrichten<\/i><br \/>\nDas <b>chronologisch sortiert<\/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>Teilnehmer der Konversation<\/i><br \/>\nWer nimmt eigentlich an diesem langen, langen Chat teil?<\/li>\n<\/ul>\n<p>\nUnsere Struktur erm\u00f6glicht es, beide Aufgaben \u201ainsgesamt\u2018 zu l\u00f6sen, aber schnell \u2013 nein. Das Problem ist, dass f\u00fcr die Sortierung im Rahmen der ersten Aufgabe <b>es unm\u00f6glich ist, einen Index zu erstellen<\/b>, der f\u00fcr jeden der Teilnehmer geeignet ist (und man muss alle Aufzeichnungen abrufen), und zur L\u00f6sung der zweiten Aufgabe ist es notwendig <b>alle Nachrichten<\/b> zum Thema zu extrahieren.<\/p>\n<blockquote><p>Unvorhergesehene Benutzeraufgaben k\u00f6nnen ein fettes <b>Kreuz f\u00fcr die Leistung setzen.<\/b>.<\/p><\/blockquote>\n<p><\/p>\n<h2>Schritt 5: Sinnvolle Denormalisierung<\/h2>\n<p>\nBeide unsere Probleme k\u00f6nnen durch zus\u00e4tzliche Tabellen gel\u00f6st werden, in die wir <b>einen Teil der Daten duplizieren<\/b>, die erforderlich sind, um geeignete Indizes f\u00fcr unsere Aufgaben zu erstellen.<br \/>\n<img decoding=\"async\" alt=\"Datenbank des Messengers (Teil 1): Entwurf des Datenbankger\u00fcsts\" 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  \"Eigent\u00fcmer\"\n    uuid\n, \"RegistryTyp\"\n    smallint\n, \"DatumUhrzeit\"\n    timestamp\n, \"Nachricht\"\n    uuid\n, PRIMARY KEY(\"Eigent\u00fcmer\", \"RegistryTyp\", \"Nachricht\")\n);\nCREATE INDEX ON \"Nachrichtenregister\"(\"Eigent\u00fcmer\", \"RegistryTyp\", \"DatumUhrzeit\" DESC);\n\nCREATE TABLE \"ThemenTeilnehmer\"(\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 beim Erstellen von Hilfstabellen verwendet werden:<\/p>\n<ul>\n<li><b>Multiplikation von Datens\u00e4tzen<\/b><br \/>\nWir erstellen aus einem urspr\u00fcnglichen Nachrichtendatensatz mehrere Folgedatens\u00e4tze in verschiedene Arten von Registern f\u00fcr unterschiedliche Eigent\u00fcmer \u2014 sowohl f\u00fcr den Absender als auch f\u00fcr den Empf\u00e4nger. So wird jedes Register nun auf einen Index gelegt \u2014 denn im typischen Fall m\u00f6chten wir nur die erste Seite sehen.<\/li>\n<li><b>Eindeutigkeit der Datens\u00e4tze<\/b><br \/>\nBei jedem Versenden einer Nachricht innerhalb eines bestimmten Themas gen\u00fcgt es zu \u00fcberpr\u00fcfen, ob ein solcher Datensatz bereits existiert. Wenn nicht \u2014 f\u00fcgen wir ihn in unser \u201eW\u00f6rterbuch\u201c ein.<\/li>\n<\/ul>\n<p>\nIm n\u00e4chsten Teil des Artikels wird es um <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">Implementierung von Partitionierung<\/a><\/noindex> in die Struktur unserer Datenbank.<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 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\/de\/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=\"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 \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\/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\udd47Messenger-Datenbank (Teil 1): Datenbankstruktur entwerfen | ProHoster","description":"Wie man Gesch\u00e4ftsanforderungen in konkrete Datenstrukturen \u00fcbersetzt, am Beispiel der \"von Grund auf\"-Entwicklung einer Datenbank f\u00fcr einen Messenger. Teil 1: Struktur der Datenbank entwerfen Teil 2: Live-Partitionierung Unsere Datenbank wird nicht so gro\u00df und verteilt sein wie die von VKontakte oder Badoo, sondern einfach gut funktionieren \u2014 funktional, schnell und auf einem einzigen PostgreSQL-Server passen \u2014 damit","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 \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\/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"},"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}]}}