{"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\/sv\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy","title":{"rendered":"Databasen f\u00f6r meddelandeappen (del 1): vi designar ramverket f\u00f6r databasen","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hur man kan \u00f6vers\u00e4tta aff\u00e4rskrav till specifika datastrukturer med exemplet att designa en databas f\u00f6r en meddelandetj\u00e4nst \"fr\u00e5n grunden\".<\/p>\n<ul>\n<li>Del 1: designa databasen<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">Del 2: partitionera i realtid<\/a><\/noindex><\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Databasen f\u00f6r meddelandeappen (del 1): vi designar ramverket f\u00f6r databasen\" src=\"\/wp-content\/uploads\/2020\/01\/d4e85052405da3f6580e4e931c292079.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nV\u00e5r databas kommer inte att vara lika stor och distribuerad, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/vk\/blog\/342570\/\">som p\u00e5 VKontakte,<\/a><\/noindex> eller <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/340976\/\">Badoo<\/a><\/noindex>, utan \"bara f\u00f6r att ha\", men det ska vara bra \u2014 funktionellt, snabbt och <b>f\u00e5 plats p\u00e5 en server.<\/b> PostgreSQL \u2014 s\u00e5 att man kan k\u00f6ra en separat instans av tj\u00e4nsten n\u00e5gonstans p\u00e5 sidan, till exempel.<\/p>\n<p>D\u00e4rf\u00f6r kommer vi inte att ber\u00f6ra fr\u00e5gor om sharding, replikering och geografiskt distribuerade system, utan fokusera p\u00e5 schematiska l\u00f6sningar inom databasen.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Steg 1: Lite aff\u00e4rsspecifika uppgifter<\/h2>\n<p>\nVi kommer att designa v\u00e5r meddelandetj\u00e4nst inte abstrakt, utan integrera den i omgivningen <noindex><a rel=\"nofollow\" href=\"https:\/\/sbis.ru\/help\/work_in\/sms\/\">av ett f\u00f6retags sociala n\u00e4tverk.<\/a><\/noindex>. Det vill s\u00e4ga att m\u00e4nniskor inte bara \"chattar\", utan kommunicerar med varandra i kontext av att l\u00f6sa vissa aff\u00e4rsproblem.<\/p>\n<p>Och vilka uppgifter finns det i aff\u00e4rsv\u00e4rlden? L\u00e5t oss titta p\u00e5 exemplet med Vasily \u2014 chefen f\u00f6r utvecklingsavdelningen.<\/p>\n<ul>\n<li><i>\"Nikolaj, en patch beh\u00f6vs f\u00f6r den h\u00e4r uppgiften idag!\"<\/i><br \/>\nDet betyder att kommunikationen kan ske i kontext av n\u00e5gon <b>Inkomststrukturen f\u00f6r PhD-studenter och Post-Docs p\u00e5 EPFL<\/b>.<\/li>\n<li><i>\"Kola, ska vi spela Dota ikv\u00e4ll?\"<\/i><br \/>\nDet vill s\u00e4ga \u00e4ven en enda konversation kan p\u00e5g\u00e5 <b>om olika \u00e4mnen.<\/b>.<\/li>\n<li><i>\"Petr, Nikolaj, kolla i bilagan f\u00f6r priset p\u00e5 den nya servern.\"<\/i><br \/>\nS\u00e5, ett meddelande kan ha <b>flera mottagare.<\/b>Samtidigt kan ett meddelande inneh\u00e5lla <b>bifogade filer.<\/b>.<\/li>\n<li><i>\"Semen, och du kolla ocks\u00e5.\"<\/i><br \/>\nOch det ska finnas en m\u00f6jlighet att bjuda in en ny deltagare <b>till en redan existerande konversation.<\/b>.<\/li>\n<\/ul>\n<p>\nL\u00e5t oss stanna vid denna lista av \"uppenbara\" behov f\u00f6r tillf\u00e4llet.<\/p>\n<blockquote><p>Utan f\u00f6rst\u00e5else f\u00f6r till\u00e4mpningens specifika uppgifter och givna begr\u00e4nsningar \u00e4r det praktiskt taget om\u00f6jligt att designa <b>en effektiv<\/b> databasstruktur f\u00f6r dess l\u00f6sning.<\/p><\/blockquote>\n<p><\/p>\n<h2>Steg 2: Minimal logisk struktur<\/h2>\n<p>\nStrukturellt liknar det fortfarande ett e-postkonversation \u2014 ett traditionellt verktyg f\u00f6r att driva aff\u00e4rer. S\u00e5 ja, \"algoritmiskt\" liknar m\u00e5nga aff\u00e4rsproblem varandra, och d\u00e4rf\u00f6r kommer \u00e4ven verktygen f\u00f6r att l\u00f6sa dem att vara strukturellt liknande.<\/p>\n<p>L\u00e5t oss dokumentera den logiska strukturen av relationerna mellan enheterna som vi har f\u00e5tt. F\u00f6r att underl\u00e4tta f\u00f6rst\u00e5elsen av v\u00e5r modell kommer vi att anv\u00e4nda den mest primitiva varianten av att visa <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ER-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C\">ER-modeller<\/a><\/noindex> utan kompliceringar av UML eller IDEF-notation:<\/p>\n<p><img decoding=\"async\" alt=\"Databasen f\u00f6r meddelandeappen (del 1): vi designar ramverket f\u00f6r databasen\" src=\"\/wp-content\/uploads\/2020\/01\/75d0b3cf9e5a44ae3e243449fa406fbc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI v\u00e5rt exempel \u00e4r persona, dokumentet och den bin\u00e4ra \"kroppen\" av filen - dessa \u00e4r \"externa\" enheter som existerar p\u00e5 egen hand, oberoende av v\u00e5r service. S\u00e5 vi kommer helt enkelt att betrakta dem som n\u00e5gra l\u00e4nkar \"n\u00e5gonstans\" via UUID.<\/p>\n<blockquote><p>Rita <b>scheman s\u00e5 enkelt som m\u00f6jligt<\/b> \u2014 de flesta av dem du visar dem f\u00f6r \u00e4r inte experter p\u00e5 att l\u00e4sa UML\/IDEF. Men \u2014 rita absolut.<\/p><\/blockquote>\n<p><\/p>\n<h2>Steg 3: Skissa ut tabellstrukturen<\/h2>\n<p>\n<b class=\"spoiler_title\">Om tabell- och f\u00e4ltnamn<\/b>Man kan ha olika \u00e5sikter om \"ryska\" namn p\u00e5 f\u00e4lt och tabeller, men det \u00e4r en smakfr\u00e5ga. Eftersom <noindex><a rel=\"nofollow\" href=\"https:\/\/tensor.ru\/about\/career\/vacancies\">vi i \"Tensor\"<\/a><\/noindex> inte har utl\u00e4ndska utvecklare, och PostgreSQL till\u00e5ter oss att anv\u00e4nda namn som kan vara hieroglyfer, om de <u>\u00e4r omgivna av citattecken<\/u>, s\u00e5 f\u00f6redrar vi att namnge objekt tydligt f\u00f6r att undvika missf\u00f6rst\u00e5nd.<br \/>\nEftersom m\u00e5nga personer skriver meddelanden samtidigt, kan en del av dem faktiskt g\u00f6ra detta <u>i offline-l\u00e4ge<\/u>, s\u00e5 det enklaste alternativet \u00e4r \u2014 <b>att anv\u00e4nda UUID som identifierare<\/b> inte bara f\u00f6r externa enheter, utan \u00e4ven f\u00f6r alla objekt inom v\u00e5r tj\u00e4nst. Dessutom kan de genereras \u00e4ven p\u00e5 klientsidan \u2014 detta hj\u00e4lper oss att st\u00f6dja s\u00e4ndningen av meddelanden vid kortvarigt otillg\u00e4nglighet av databasen, och risken f\u00f6r kollisioner \u00e4r extremt l\u00e5g.<\/p>\n<p>Den prelimin\u00e4ra tabellstrukturen i v\u00e5r databas kommer att se ut s\u00e5 h\u00e4r:<br \/>\n<b class=\"spoiler_title\">Tabeller : RU<\/b><\/p>\n<pre><code class=\"sql\">CREATE TABLE \"Tema\"(\n  \"Tema\"\n    uuid\n      PRIMARY KEY\n, \"Dokument\"\n    uuid\n, \"Titel\"\n    text\n);\n\nCREATE TABLE \"Meddelande\"(\n  \"Meddelande\"\n    uuid\n      PRIMARY KEY\n, \"Tema\"\n    uuid\n, \"F\u00f6rfattare\"\n    uuid\n, \"DatumTid\"\n    timestamp\n, \"Text\"\n    text\n);\n\nCREATE TABLE \"Adressat\"(\n  \"Meddelande\"\n    uuid\n, \"Persona\"\n    uuid\n, PRIMARY KEY(\"Meddelande\", \"Persona\")\n);\n\nCREATE TABLE \"Fil\"(\n  \"Fil\"\n    uuid\n      PRIMARY KEY\n, \"Meddelande\"\n    uuid\n, \"BLOB\"\n    uuid\n, \"Namn\"\n    text\n);<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Tabeller : 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>Det enklaste n\u00e4r man beskriver formatet \u00e4r att b\u00f6rja \"utveckla\" relationen <b>fr\u00e5n tabeller som inte refererar<\/b> till n\u00e5gon annan.<\/p><\/blockquote>\n<p><\/p>\n<h2>Steg 4: F\u00f6rst\u00e5 de otydliga behoven<\/h2>\n<p>\nDet \u00e4r klart, vi har designat en databas som man kan skriva bra i och <i><b>p\u00e5 n\u00e5got s\u00e4tt<\/b><\/i> l\u00e4sa.<\/p>\n<p>L\u00e5t oss s\u00e4tta oss i st\u00e4llet f\u00f6r anv\u00e4ndaren av v\u00e5r tj\u00e4nst \u2013 vad skulle vi vilja g\u00f6ra med hj\u00e4lp av den?<\/p>\n<ul>\n<li><i>Senaste meddelandena<\/i><br \/>\nDetta <b>chronologiskt sorterade<\/b> enligt olika kriterier registrerar jag \"mina\" meddelanden. D\u00e4r jag \u00e4r en av mottagarna, d\u00e4r jag \u00e4r f\u00f6rfattare, d\u00e4r jag fick ett meddelande men inte svarade, d\u00e4r jag inte fick n\u00e5got svar, \u2026<\/li>\n<li><i>Deltagare i konversationen<\/i><br \/>\nVem deltar \u00f6verhuvudtaget i den h\u00e4r l\u00e5nga chatten?<\/li>\n<\/ul>\n<p>\nV\u00e5r struktur kan l\u00f6sa b\u00e5da dessa uppgifter \"\u00f6vergripande\", men snabbt \u2013 nej. Problemet \u00e4r att f\u00f6r att sortera i den f\u00f6rsta uppgiften <b>\u00e4r det om\u00f6jligt att skapa ett index<\/b>, som passar f\u00f6r varje deltagare (och vi m\u00e5ste h\u00e4mta alla poster), och f\u00f6r att l\u00f6sa den andra kr\u00e4vs det <b>att h\u00e4mta alla meddelanden<\/b> i \u00e4mnet.<\/p>\n<blockquote><p>Of\u00f6rutsedda anv\u00e4ndaruppgifter kan s\u00e4tta en djup brun f\u00e4rg <b>p\u00e5 prestandan<\/b>.<\/p><\/blockquote>\n<p><\/p>\n<h2>Steg 5: F\u00f6rnuftig denormalisering<\/h2>\n<p>\nB\u00e5da v\u00e5ra problem kan l\u00f6sas med hj\u00e4lp av extra tabeller d\u00e4r vi kommer att <b>duplicera en del av de data<\/b>, som beh\u00f6vs f\u00f6r att skapa l\u00e4mpliga index f\u00f6r v\u00e5ra uppgifter.<br \/>\n<img decoding=\"async\" alt=\"Databasen f\u00f6r meddelandeappen (del 1): vi designar ramverket f\u00f6r databasen\" src=\"\/wp-content\/uploads\/2020\/01\/f136a9904518b05bca74cc2b9c2f01b2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b class=\"spoiler_title\">Tabeller : RU<\/b><\/p>\n<pre><code class=\"sql\">CREATE TABLE \"MeddelandeRegister\"(\n  \"\u00c4gare\"\n    uuid\n, \"RegisterTyp\"\n    smallint\n, \"DatumTid\"\n    timestamp\n, \"Meddelande\"\n    uuid\n, PRIMARY KEY(\"\u00c4gare\", \"RegisterTyp\", \"Meddelande\")\n);\nCREATE INDEX ON \"MeddelandeRegister\"(\"\u00c4gare\", \"RegisterTyp\", \"DatumTid\" DESC);\n\nCREATE TABLE \"TemaDeltagare\"(\n  \"Tema\"\n    uuid\n, \"Person\"\n    uuid\n, PRIMARY KEY(\"Tema\", \"Person\")\n);<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Tabeller : 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>\nH\u00e4r har vi anv\u00e4nt tv\u00e5 typiska tillv\u00e4gag\u00e5ngss\u00e4tt vid skapandet av hj\u00e4lptabeller:<\/p>\n<ul>\n<li><b>Multiplikation av poster<\/b><br \/>\nVi skapar f\u00f6r varje ursprunglig meddelandepost flera f\u00f6ljdposter i olika typer av register f\u00f6r olika \u00e4gare \u2013 b\u00e5de f\u00f6r avs\u00e4ndaren och f\u00f6r mottagaren. Men nu ligger varje register p\u00e5 ett index \u2013 eftersom vi typiskt sett vill se bara f\u00f6rsta sidan.<\/li>\n<li><b>Unikalisering av poster<\/b><br \/>\nVid varje meddelande som skickas inom ett specifikt \u00e4mne \u00e4r det tillr\u00e4ckligt att kontrollera om en s\u00e5dan post redan existerar. Om inte \u2013 l\u00e4gger vi till den i v\u00e5r \"ordbok\".<\/li>\n<\/ul>\n<p>\nI n\u00e4sta del av artikeln kommer vi att prata om <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">implementering av partitionering<\/a><\/noindex> i strukturen av v\u00e5r databas.<br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Databas f\u00f6r meddelandeappen (del 1): designar databasen | ProHoster","description":"Hur man omvandlar aff\u00e4rskrav till specifika datatyper genom design av en databas \"fr\u00e5n grunden\" f\u00f6r en meddelandeapp. Del 1: designar databasen","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/55011","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=55011"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/55011\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=55011"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=55011"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=55011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}