{"id":55027,"date":"2020-01-10T00:00:00","date_gmt":"2020-01-09T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/bd-messendzhera-ch-2-sektsioniruem-nazhivuyu"},"modified":"2020-02-18T14:03:06","modified_gmt":"2020-02-18T11:03:06","slug":"bd-messendzhera-ch-2-sektsioniruem-nazhivuyu","status":"publish","type":"post","link":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/bd-messendzhera-ch-2-sektsioniruem-nazhivuyu","title":{"rendered":"Messenger database (part 2): live partitioneren","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>We successfully designed the structure of our PostgreSQL database for storing correspondence. A year has passed, and users are actively filling it up; it already contains <b>millions of records<\/b>, and\u2026 everything has begun to lag a bit.<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483176\/\">Deel 1: we ontwerpen de basisstructuur van de database<\/a><\/noindex><\/li>\n<li>Deel 2: we secties \u2018live\u2019<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Messenger database (part 2): live partitioneren\" src=\"\/wp-content\/uploads\/2020\/01\/7830da046d9c472af15330e42cbb05e0.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHet punt is dat <b>With the increase in the volume of the table, the 'depth' of the indexes also increases<\/b> \u2014 albeit logarithmically. But over time, this forces the server to handle significantly more pages of data <i>for the same read\/write tasks<\/i>, than at the beginning.<\/p>\n<p>This is where <b>partitioning<\/b>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\ncomes into play. I note that we are not talking about sharding, or distributing data across different databases or servers. Because even if you divide the data among different <b>een aantal<\/b> servers, you will not eliminate the problem of index 'bloating' over time. It is clear that if you can afford to bring a new server online every day, your problems will be located in a completely different plane than that of a specific database.<\/p>\n<p>We will examine not specific scripts for implementing partitioning 'in hardware', but rather the approach \u2014 what and how should be 'cut into pieces', and what this desire leads to.<\/p>\n<h2>Concept<\/h2>\n<p>\nOnce again, let us define our goal: we want to ensure that the amount of readable PostgreSQL data during any read\/write operation remains approximately the same today, tomorrow, and a year from now.<\/p>\n<p>For any <b>chronologically accumulating data<\/b> (berichten, documenten, logs, archieven, &#8230;) de natuurlijke keuze voor de partitioneringssleutel is <b>the date\/time of the event<\/b>. In our case, that event is the <u>moment of sending the message<\/u>.<\/p>\n<p>Note that users almost always <b>work only with the 'latest'<\/b> such data \u2014 they read the most recent messages, analyze the latest logs,\u2026 Of course, they may scroll further back in time, but they do this very rarely.<\/p>\n<p>From these limitations, it becomes obvious that the optimal solution for messages would be <b>'daily' sections<\/b> \u2014 since almost always our user will read what arrived 'today' or 'yesterday'.<\/p>\n<p>If we write and read practically only within one section throughout the day, this also gives us <b>more efficient use of memory and disk<\/b> \u2014 because all the indexes of the section easily fit into RAM, unlike 'large and bulky' ones across the entire table.<\/p>\n<h2>step-by-step<\/h2>\n<p>\nIn het algemeen klinkt alles wat hierboven is gezegd als \u00e9\u00e9n grote winst. En die is haalbaar, maar daarvoor moeten we wel ons best doen \u2014 want <u>de beslissing om een van de entiteiten te splitsen leidt tot de noodzaak om ook gerelateerde<\/u>.<\/p>\n<h4>Berichten, hun eigenschappen en projecties<\/h4>\n<p>\nAangezien we besloten hebben om berichten op datum te splitsen, is het logisch om ook de aan hen gerelateerde entiteiten-eigenschappen (bijgevoegde bestanden, lijst van ontvangers) te splitsen, en <b>ook op datum van het bericht<\/b>.<\/p>\n<p>Omdat een van onze typische taken het bekijken van berichtenregisters (ongelezen, inkomend, alles) is, is het ook logisch om deze in de datumsegmentatie van berichten op te nemen.<\/p>\n<p><img decoding=\"async\" alt=\"Messenger database (part 2): live partitioneren\" src=\"\/wp-content\/uploads\/2020\/01\/5ea615ca97a2b865de537777c401038c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote><p>We voegen de splitsingssleutel (datum van het bericht) toe aan alle tabellen: ontvangers, bestand, registers. In het bericht zelf kan dit weggelaten worden, en gebruiken we de bestaande DatumTijd.<\/p><\/blockquote>\n<p><\/p>\n<h4>Thema's<\/h4>\n<p>\nAangezien het onderwerp over meerdere berichten gaat, is het niet mogelijk om dit in hetzelfde model te splitsen; we moeten op iets anders steunen. In ons geval is perfect geschiktheid <b>de datum van het eerste bericht in de correspondentie<\/b> \u2014 dat is het moment van creatie, namelijk, het onderwerp.<\/p>\n<p><img decoding=\"async\" alt=\"Messenger database (part 2): live partitioneren\" src=\"\/wp-content\/uploads\/2020\/01\/4f1336a9e229221f1e25ee8d3c08fb5e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote><p>We voegen de splitsingssleutel (datum van het onderwerp) toe aan alle tabellen: onderwerp, deelnemer.<\/p><\/blockquote>\n<p>\nMaar nu hebben we direct twee problemen:<\/p>\n<ul>\n<li>in welke sectie moeten we berichten op onderwerp zoeken?<\/li>\n<li>in welke sectie moeten we het onderwerp van het bericht zoeken?<\/li>\n<\/ul>\n<p>\nWe kunnen natuurlijk blijven zoeken in alle secties, maar dat zou erg teleurstellend zijn, en al onze winsten tenietdoen. Daarom, om te weten waar precies te zoeken, maken we logische links\/verwijzingen naar secties:<\/p>\n<ul>\n<li>in het bericht voegen we toe <b>een veld met de datum van het onderwerp<\/b><\/li>\n<li>aan het onderwerp voegen we toe <b>een set datums van berichten<\/b> van deze correspondentie (dit kan een aparte tabel zijn, of een array van datums)<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Messenger database (part 2): live partitioneren\" src=\"\/wp-content\/uploads\/2020\/01\/f7bfdc96c396ca37f46d876f185bf98e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAangezien er voor elke afzonderlijke correspondentie slechts enkele aanpassingen van de lijst van berichtdatums zullen zijn (bijna alle berichten vallen binnen 1-2 aangrenzende dagen), houd ik me aan deze optie.<\/p>\n<p>Al met al heeft onze database de volgende structuur aangenomen met inachtneming van de segmentatie:<\/p>\n<p><b class=\"spoiler_title\">Tabellen: RU, als je een afkeer hebt van het cyrillische schrift in de namen van tabellen\/velden, kun je het beter niet bekijken<\/b><\/p>\n<pre><code class=\"sql\">-- secties op datum van bericht\nCREATE TABLE \"Bericht_YYYYMMDD\"(\n  \"Bericht\"\n    uuid\n      PRIMARY KEY\n, \"Onderwerp\"\n    uuid\n, \"DatumOnderwerp\"\n    date\n, \"Auteur\"\n    uuid\n, \"DatumTijd\" -- gebruiken als datum\n    timestamp\n, \"Tekst\"\n    text\n);\n\nCREATE TABLE \"Ontvanger_YYYYMMDD\"(\n  \"DatumBericht\"\n    date\n, \"Bericht\"\n    uuid\n, \"Persoon\"\n    uuid\n, PRIMARY KEY(\"Bericht\", \"Persoon\")\n);\n\nCREATE TABLE \"Bestand_YYYYMMDD\"(\n  \"DatumBericht\"\n    date\n, \"Bestand\"\n    uuid\n      PRIMARY KEY\n, \"Bericht\"\n    uuid\n, \"BLOB\"\n    uuid\n, \"Naam\"\n    text\n);\n\nCREATE TABLE \"RegisterBerichten_YYYYMMDD\"(\n  \"DatumBericht\"\n    date\n, \"Eigenaar\"\n    uuid\n, \"TypeRegister\"\n    smallint\n, \"DatumTijd\"\n    timestamp\n, \"Bericht\"\n    uuid\n, PRIMARY KEY(\"Eigenaar\", \"TypeRegister\", \"Bericht\")\n);\nCREATE INDEX ON \"RegisterBerichten_YYYYMMDD\"(\"Eigenaar\", \"TypeRegister\", \"DatumTijd\" DESC);\n\n-- secties op datum van onderwerp\nCREATE TABLE \"Onderwerp_YYYYMMDD\"(\n  \"DatumOnderwerp\"\n    date\n, \"Onderwerp\"\n    uuid\n      PRIMARY KEY\n, \"Document\"\n    uuid\n, \"Titel\"\n    text\n);\n\nCREATE TABLE \"DeelnemerOnderwerp_YYYYMMDD\"(\n  \"DatumOnderwerp\"\n    date\n, \"Onderwerp\"\n    uuid\n, \"Persoon\"\n    uuid\n, PRIMARY KEY(\"Onderwerp\", \"Persoon\")\n);\n\nCREATE TABLE \"DatumsBerichtenOnderwerp_YYYYMMDD\"(\n  \"DatumOnderwerp\"\n    date\n, \"Onderwerp\"\n    uuid\n      PRIMARY KEY\n, \"Datum\"\n    date\n);\n<\/code><\/pre>\n<h2>We besparen een cent.<\/h2>\n<p>\nMaar als we niet de <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/10\/ddl-partitioning\">klassieke variant van partitionering<\/a><\/noindex> gebaseerd op de verdeling van de waarde van het veld (via triggers en erfelijkheid of PARTITION BY), maar 'handmatig' op applicatieniveau, dan merken we dat de waarde van de partitioneringssleutel al in de naam van de tabel is opgeslagen.<\/p>\n<p>Daarom, als je zo <b>heel erg bezorgd bent over de hoeveelheid opgeslagen gegevens<\/b>, dan kunnen we van deze 'overtollige' velden afkomen en direct naar specifieke tabellen verwijzen. Maar dan moeten alle selecties uit meerdere secties al aan de applicatiezijde worden uitgevoerd.<br \/>\n<br \/>Bron: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u044b \u0443\u0434\u0430\u0447\u043d\u043e \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043d\u0430\u0448\u0435\u0439 PostgreSQL-\u0431\u0430\u0437\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u043a\u0438, \u043f\u0440\u043e\u0448\u0435\u043b \u0433\u043e\u0434, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0435\u0435 \u043d\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442, \u0432\u043e\u0442 \u0432 \u043d\u0435\u0439 \u0443\u0436\u0435 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0438\u2026 \u0447\u0442\u043e-\u0442\u043e \u0432\u0441\u0435 \u043d\u0430\u0447\u0430\u043b\u043e \u043f\u043e\u0434\u0442\u043e\u0440\u043c\u0430\u0436\u0438\u0432\u0430\u0442\u044c. \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 \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441 \u0440\u043e\u0441\u0442\u043e\u043c \u043e\u0431\u044a\u0435\u043c\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0440\u0430\u0441\u0442\u0435\u0442 \u0438 \u00ab\u0433\u043b\u0443\u0431\u0438\u043d\u0430\u00bb \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u2014 \u0445\u043e\u0442\u044c \u0438 \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0438. \u041d\u043e \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u044d\u0442\u043e [&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-55027","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041c\u044b \u0443\u0434\u0430\u0447\u043d\u043e \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043d\u0430\u0448\u0435\u0439 PostgreSQL-\u0431\u0430\u0437\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u043a\u0438, \u043f\u0440\u043e\u0448\u0435\u043b \u0433\u043e\u0434, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0435\u0435 \u043d\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442, \u0432\u043e\u0442 \u0432 \u043d\u0435\u0439 \u0443\u0436\u0435 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0438\u2026 \u0447\u0442\u043e-\u0442\u043e \u0432\u0441\u0435 \u043d\u0430\u0447\u0430\u043b\u043e \u043f\u043e\u0434\u0442\u043e\u0440\u043c\u0430\u0436\u0438\u0432\u0430\u0442\u044c. .\" \/>\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\/nl\/blog\/administrirovanie\/bd-messendzhera-ch-2-sektsioniruem-nazhivuyu\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\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.2): \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u00ab\u043d\u0430\u0436\u0438\u0432\u0443\u044e\u00bb | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u044b \u0443\u0434\u0430\u0447\u043d\u043e \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043d\u0430\u0448\u0435\u0439 PostgreSQL-\u0431\u0430\u0437\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u043a\u0438, \u043f\u0440\u043e\u0448\u0435\u043b \u0433\u043e\u0434, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0435\u0435 \u043d\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442, \u0432\u043e\u0442 \u0432 \u043d\u0435\u0439 \u0443\u0436\u0435 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0438\u2026 \u0447\u0442\u043e-\u0442\u043e \u0432\u0441\u0435 \u043d\u0430\u0447\u0430\u043b\u043e \u043f\u043e\u0434\u0442\u043e\u0440\u043c\u0430\u0436\u0438\u0432\u0430\u0442\u044c. .\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/bd-messendzhera-ch-2-sektsioniruem-nazhivuyu\" \/>\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:06+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 van de messenger (deel 2): partitioneren 'in real-time' | ProHoster","description":"We hebben de structuur van onze PostgreSQL-database voor het opslaan van berichten succesvol ontworpen, er is een jaar voorbijgegaan, gebruikers vullen deze actief, en er zijn al miljoenen records in, en\u2026 iets begint traag te worden.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/bd-messendzhera-ch-2-sektsioniruem-nazhivuyu","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","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.2): \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u00ab\u043d\u0430\u0436\u0438\u0432\u0443\u044e\u00bb | ProHoster","og:description":"\u041c\u044b \u0443\u0434\u0430\u0447\u043d\u043e \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043d\u0430\u0448\u0435\u0439 PostgreSQL-\u0431\u0430\u0437\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u043a\u0438, \u043f\u0440\u043e\u0448\u0435\u043b \u0433\u043e\u0434, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0435\u0435 \u043d\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442, \u0432\u043e\u0442 \u0432 \u043d\u0435\u0439 \u0443\u0436\u0435 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0438\u2026 \u0447\u0442\u043e-\u0442\u043e \u0432\u0441\u0435 \u043d\u0430\u0447\u0430\u043b\u043e \u043f\u043e\u0434\u0442\u043e\u0440\u043c\u0430\u0436\u0438\u0432\u0430\u0442\u044c. .","og:url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/bd-messendzhera-ch-2-sektsioniruem-nazhivuyu","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:06+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"55027","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:34:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:53:48","updated":"2026-01-24 13:34:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/55027","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=55027"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/55027\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=55027"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=55027"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=55027"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}