{"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\/no\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy","title":{"rendered":"DB av meldingsmessengeren (del 1): design av databasen","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hvordan kan man oversette forretningskrav til konkrete datastukturer ved \u00e5 designe en database for en meldingsapp fra bunnen av.<\/p>\n<ul>\n<li>Del 1: Designer rammeverket for databasen<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">Del 2: Seksjonerer i sanntid<\/a><\/noindex><\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"DB av meldingsmessengeren (del 1): design av databasen\" src=\"\/wp-content\/uploads\/2020\/01\/d4e85052405da3f6580e4e931c292079.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nV\u00e5r database vil ikke v\u00e6re s\u00e5 stor og distribuert, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/vk\/blog\/342570\/\">som hos VKontakte<\/a><\/noindex> eller <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/340976\/\">Badoo<\/a><\/noindex>, men \u00abbare for \u00e5 ha noe\u00bb, men det skal v\u00e6re bra \u2013 funksjonelt, raskt og <b>f\u00e5 plass p\u00e5 \u00e9n server<\/b> PostgreSQL \u2013 slik at man kan sette opp en egen tjeneste et annet sted, for eksempel.<\/p>\n<p>Derfor skal vi ikke ta opp sp\u00f8rsm\u00e5l om sharding, replikering og geo-distribuerte systemer, men fokusere p\u00e5 skjematiske l\u00f8sninger inne i databasen.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Trinn 1: Litt forretningsspesifikke detaljer<\/h2>\n<p>\nVi vil designe meldingsutvekslingen ikke abstrakt, men integrere den i konteksten av <noindex><a rel=\"nofollow\" href=\"https:\/\/sbis.ru\/help\/work_in\/sms\/\">et bedrifts sosialt nettverk<\/a><\/noindex>. Det vil si at folk ikke \u00abbare skriver til hverandre\u00bb, men kommuniserer i sammenheng med \u00e5 l\u00f8se spesifikke forretningsoppgaver.<\/p>\n<p>Og hvilke oppgaver har virksomheter?... La oss se p\u00e5 et eksempel med Vasily \u2013 lederen for utviklingsavdelingen.<\/p>\n<ul>\n<li><i>\u00abNikolai, vi trenger en patch for denne oppgaven i dag!\u00bb<\/i><br \/>\nDermed kan samtalen foreg\u00e5 i konteksten av en eller annen <b>dokumentet<\/b>.<\/li>\n<li><i>\u00abKola, la oss spille Dota i kveld?\u00bb<\/i><br \/>\nS\u00e5 selv med ett par samtalepartnere kan kommunikasjonen skje <b>om flere temaer<\/b>.<\/li>\n<li><i>\u00abPetr, Nikolai, se vedlegget for prisen p\u00e5 den nye serveren.\u00bb<\/i><br \/>\nDermed kan en melding ha <b>flere mottakere<\/b>. I tillegg kan meldingen inneholde <b>vedlagte filer<\/b>.<\/li>\n<li><i>\u00abSemen, og du ogs\u00e5, ta en titt.\u00bb<\/i><br \/>\nOg det m\u00e5 v\u00e6re mulig \u00e5 invitere en ny deltaker til en allerede eksisterende samtale <b>Vi stopper forel\u00f8pig med denne listen over \u00ab\u00e5penbare\u00bb behov.<\/b>.<\/li>\n<\/ul>\n<p>\nUten \u00e5 forst\u00e5 den praktiske spesifikasjonen av oppgaven og de begrensningene den setter, er det nesten umulig \u00e5 designe<\/p>\n<blockquote><p>en effektiv <b>databasestruktur for \u00e5 l\u00f8se den.<\/b> Trinn 2: Minimal logisk plan<\/p><\/blockquote>\n<p><\/p>\n<h2>S\u00e5 langt ser den skjematiske fremstillingen veldig lik e-postkorrespondanse ut \u2013 et tradisjonelt verkt\u00f8y for forretning. Ja, \u00abalgoritmisk\u00bb er mange forretningsoppgaver like, s\u00e5 verkt\u00f8yene for \u00e5 l\u00f8se dem vil v\u00e6re strukturelt like.<\/h2>\n<p>\nLa oss fastholde den logiske planen for entitetenes forhold vi allerede har f\u00e5tt. For enkelhets skyld i v\u00e5r modell vil vi bruke den enkleste varianten av representasjonen<\/p>\n<p>ER-modellen <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/ER-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C\">uten \u00e5 komplisere med UML eller IDEF-notasjoner:<\/a><\/noindex> uten kompliserte UML- eller IDEF-notasjoner:<\/p>\n<p><img decoding=\"async\" alt=\"DB av meldingsmessengeren (del 1): design av databasen\" src=\"\/wp-content\/uploads\/2020\/01\/75d0b3cf9e5a44ae3e243449fa406fbc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI v\u00e5rt eksempel er persona, dokumentet og det bin\u00e6re \u00abkropp\u00bb av filen \u00abeksterne\u00bb enheter som eksisterer uavhengig av v\u00e5r tjeneste. S\u00e5 vi vil bare oppfatte dem videre som noen lenker \u00abet sted\u00bb via UUID.<\/p>\n<blockquote><p>Tegn <b>diagrammer s\u00e5 enkelt som mulig<\/b> \u2014 de fleste som du vil vise dem til, er ikke eksperter p\u00e5 \u00e5 lese UML\/IDEF. Men \u2014 husk \u00e5 tegne.<\/p><\/blockquote>\n<p><\/p>\n<h2>Trinn 3: Utkast til tabellstrukturen<\/h2>\n<p>\n<b class=\"spoiler_title\">Om navnene p\u00e5 tabeller og felt<\/b>Man kan se p\u00e5 \u00abrussiske\u00bb navne p\u00e5 felt og tabeller p\u00e5 forskjellige m\u00e5ter, men det er en smaksak. Siden <noindex><a rel=\"nofollow\" href=\"https:\/\/tensor.ru\/about\/career\/vacancies\">vi i \u00abTensor\u00bb<\/a><\/noindex> ikke har utenlandske utviklere, og PostgreSQL lar oss gi navn selv i hieroglyfer, hvis de <u>er innesluttet i anf\u00f8rselstegn<\/u>, s\u00e5 foretrekker vi \u00e5 navngi objekter klart og entydig for \u00e5 unng\u00e5 misforst\u00e5elser.<br \/>\nSiden mange personer skriver meldinger samtidig, kan noen av dem faktisk gj\u00f8re dette <u>i offline-modus<\/u>, s\u00e5 det enkleste alternativet er \u00e5 <b>bruke UUID som identifikatorer<\/b> ikke bare for eksterne enheter, men ogs\u00e5 for alle objekter innen v\u00e5r tjeneste. Og de kan genereres til og med p\u00e5 klientsiden \u2014 dette vil hjelpe oss \u00e5 st\u00f8tte sending av meldinger ved kortvarig databaseutilgjengelighet, og sjansen for kollisjon er ekstremt lav.<\/p>\n<p>Den forel\u00f8pige tabellstrukturen i databasen v\u00e5r vil se slik ut:<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, \"Navn\"\n    text\n);\n\nCREATE TABLE \"Melding\"(\n  \"Melding\"\n    uuid\n      PRIMARY KEY\n, \"Tema\"\n    uuid\n, \"Forfatter\"\n    uuid\n, \"DatoTid\"\n    timestamp\n, \"Tekst\"\n    text\n);\n\nCREATE TABLE \"Mottaker\"(\n  \"Melding\"\n    uuid\n, \"Persona\"\n    uuid\n, PRIMARY KEY(\"Melding\", \"Persona\")\n);\n\nCREATE TABLE \"Fil\"(\n  \"Fil\"\n    uuid\n      PRIMARY KEY\n, \"Melding\"\n    uuid\n, \"BLOB\"\n    uuid\n, \"Navn\"\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 enkleste ved beskrivelsen av formatet er \u00e5 begynne \u00e5 \u00abpuste liv\u00bb i forbindelser <b>fra tabeller som ikke refererer<\/b> til noen andre.<\/p><\/blockquote>\n<p><\/p>\n<h2>Trinn 4: Avdekke ikke-\u00e5penbare behov<\/h2>\n<p>\nVi har designet en database hvor det er lett \u00e5 skrive <i><b>og p\u00e5 en eller annen m\u00e5te<\/b><\/i> lese.<\/p>\n<p>La oss sette oss i brukeren sin plass \u2014 hva vil vi \u00f8nsker \u00e5 gj\u00f8re med hjelp av tjenesten?<\/p>\n<ul>\n<li><i>Siste meldinger<\/i><br \/>\nDette <b>chronologisk sortert<\/b> etter ulike kriterier registrerer \u00abmine\u00bb meldinger. Der jeg er en av mottakerne, der jeg er forfatteren, der det er skrevet til meg, men jeg ikke svarte, der jeg ikke fikk svar, \u2026<\/li>\n<li><i>Deltakere i samtalen<\/i><br \/>\nHvem deltar i denne lange, lange chatten?<\/li>\n<\/ul>\n<p>\nV\u00e5r struktur lar oss l\u00f8se begge disse oppgavene \u00abgenerelt\u00bb, men raskt \u2013 nei. Problemet er at for sortering i forbindelse med den f\u00f8rste oppgaven <b>er det umulig \u00e5 lage en indeks<\/b>, som er passende for hver deltaker (og vi m\u00e5 hente ut alle oppf\u00f8ringer), mens for \u00e5 l\u00f8se den andre m\u00e5 vi <b>hente ut alle meldinger<\/b> om emnet.<\/p>\n<blockquote><p>Uforutsigbare brukeroppgaver kan sette en stor <b>brems p\u00e5 ytelsen<\/b>.<\/p><\/blockquote>\n<p><\/p>\n<h2>Steg 5: Fornuftig denormalisering<\/h2>\n<p>\nBegge v\u00e5re problemer kan l\u00f8ses med ekstra tabeller, hvor vi skal <b>duplisere deler av dataene<\/b>, som er n\u00f8dvendige for \u00e5 lage passende indekser for v\u00e5re oppgaver.<br \/>\n<img decoding=\"async\" alt=\"DB av meldingsmessengeren (del 1): design av 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 \"Meldingsregister\"(\n  \"Eier\"\n    uuid\n, \"Registertype\"\n    smallint\n, \"DatoTid\"\n    timestamp\n, \"Melding\"\n    uuid\n, PRIMARY KEY(\"Eier\", \"Registertype\", \"Melding\")\n);\nCREATE INDEX ON \"Meldingsregister\"(\"Eier\", \"Registertype\", \"DatoTid\" DESC);\n\nCREATE TABLE \"TemaDeltaker\"(\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>\nHer har vi brukt to typiske tiln\u00e6rminger, som brukes ved opprettelse av hjelpe-tabeller:<\/p>\n<ul>\n<li><b>Multiplikasjon av poster<\/b><br \/>\nVi lager flere konsekvensoppf\u00f8ringer av en enkelt originalmelding i forskjellige registertyper for forskjellige eiere \u2013 b\u00e5de for avsender og mottaker. N\u00e5 ligger imidlertid hver av registrene p\u00e5 indeks \u2013 for i typiske tilfeller \u00f8nsker vi vanligvis kun \u00e5 se den f\u00f8rste siden.<\/li>\n<li><b>Unikalisering av oppf\u00f8ringer<\/b><br \/>\nVed hver sending av melding innad i et bestemt tema er det tilstrekkelig \u00e5 sjekke om en slik oppf\u00f8ring allerede eksisterer. Hvis ikke \u2013 legger vi den til v\u00e5r \u00abordbok\u00bb.<\/li>\n<\/ul>\n<p>\nI neste del av artikkelen vil vi snakke om <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">implementering av partisjonering<\/a><\/noindex> inn i strukturen i databasen v\u00e5r.<br \/>\n<br \/>Kilde: <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.5 - 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\/no\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"nn_NO\" \/>\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\/no\/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\udd47DB for meldingsapplikasjonen (del 1): vi designer rammeverket til databasen | ProHoster","description":"Hvordan oversette forretningskrav til konkrete datastrukturer med eksempler fra designet \u00abfra bunnen av\u00bb av en database for en meldingsapplikasjon. Del 1: vi designer rammeverket til databasen","canonical_url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/bd-messendzhera-ch-1-proektiruem-karkas-bazy","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nn_NO","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\/no\/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\/no\/wp-json\/wp\/v2\/posts\/55011","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/comments?post=55011"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/55011\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media?parent=55011"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/categories?post=55011"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/tags?post=55011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}