{"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\/en\/blog\/administrirovanie\/bd-messendzhera-ch-2-sektsioniruem-nazhivuyu","title":{"rendered":"Messenger Database (part 2): segmenting \"live\"","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>We successfully designed the structure of our PostgreSQL database for storing messages, a year has passed, and users are actively filling it, so far it has <b>millions of records<\/b>, and\u2026 something has started to lag.<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483176\/\">Part 1: designing the database framework<\/a><\/noindex><\/li>\n<li>Part 2: partitioning 'live'<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Messenger Database (part 2): segmenting &quot;live&quot;\" src=\"\/wp-content\/uploads\/2020\/01\/7830da046d9c472af15330e42cbb05e0.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nThe fact is that <b>as the size of the table grows, the 'depth' of the indexes also increases<\/b> \u2014 albeit logarithmically. But over time, this forces the server to handle much more data pages <i>for the same read\/write tasks<\/i>, than at the beginning.<\/p>\n<p>This is where <b>partitioning comes into play.<\/b>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nI should note that we will not be discussing sharding, i.e., distributing data across different databases or servers. Because, even if you split the data among <b>several<\/b> servers, you will not escape the problem of 'bloated' indexes over time. It is clear that if you can afford to bring a new server online every day, your issues will lie in a completely different area than a specific database.<\/p>\n<p>We will not look at specific scripts for implementing partitioning 'in hardware', but rather the approach \u2014 what and how should be 'sliced up', and what such a desire leads to.<\/p>\n<h2>Concept<\/h2>\n<p>\nLet\u2019s define our goal once again: we want to ensure that today, tomorrow, and a year from now, the amount of readable PostgreSQL data during any read\/write operation remains approximately the same.<\/p>\n<p>For any <b>chronologically accumulating data<\/b> (messages, documents, logs, archives, &#8230;) a natural choice for the partition key is <b>the date\/time of the event<\/b>. In our case, that event is the <u>moment a message is sent.<\/u>.<\/p>\n<p>We note that users almost always <b>work only with the 'latest'<\/b> data \u2014 reading the most recent messages, analyzing the latest logs,\u2026 No, they can scroll back in time, but they do this very rarely.<\/p>\n<p>From these constraints, it becomes evident that the optimal solution for messages will be <b>'daily' sections<\/b> \u2014 as our user will almost always read what has arrived 'today' or 'yesterday'.<\/p>\n<p>If we write and read almost exclusively within one section throughout the day, this also gives us <b>a more efficient use of memory and disk.<\/b> \u2014 since all section indexes easily fit into memory, unlike the \"large and bulky\" ones throughout the table.<\/p>\n<h2>step-by-step<\/h2>\n<p>\nIn general, everything said above sounds like one continuous profit. And it is achievable, but for that we will have to make a good effort \u2014 because <u>the decision to partition one of the entities leads to the need to \"split\" related ones as well<\/u>.<\/p>\n<h4>Message, its properties and projections<\/h4>\n<p>\nSince we decided to cut messages by dates, it is reasonable to also divide dependent entities-properties (attachments, list of recipients) according to <b>the date of the message as well.<\/b>.<\/p>\n<p>Since one of our standard tasks is precisely to view message registers (unread, incoming, all), it also makes sense to \"pull\" them into the partitioning by message dates.<\/p>\n<p><img decoding=\"async\" alt=\"Messenger Database (part 2): segmenting &quot;live&quot;\" src=\"\/wp-content\/uploads\/2020\/01\/5ea615ca97a2b865de537777c401038c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote><p>We add a partitioning key (message date) to all tables: recipients, file, registers. It's not necessary to add it to the message itself, but to use the existing DateTime.<\/p><\/blockquote>\n<p><\/p>\n<h4>Topics<\/h4>\n<p>\nSince the topic is the same for several messages, it cannot be \"cut\" in the same model anymore; we have to rely on something else. In our case, the perfect fit is <b>the date of the first message in the correspondence.<\/b> \u2014 that is, the moment of creation of the topic itself.<\/p>\n<p><img decoding=\"async\" alt=\"Messenger Database (part 2): segmenting &quot;live&quot;\" src=\"\/wp-content\/uploads\/2020\/01\/4f1336a9e229221f1e25ee8d3c08fb5e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote><p>We add a partitioning key (topic date) to all tables: topic, participant.<\/p><\/blockquote>\n<p>\nBut now we have two immediate problems:<\/p>\n<ul>\n<li>in which section to search for messages by topic?<\/li>\n<li>in which section to find a topic from a message?<\/li>\n<\/ul>\n<p>\nOf course, we can continue to search all sections, but that would be very unfortunate and would negate all our gains. Therefore, to know where exactly to search, we will make logical links\/references to sections:<\/p>\n<ul>\n<li>we will add in the message <b>a field with the topic date.<\/b><\/li>\n<li>to the topic we will add <b>a set of message dates<\/b> for this correspondence (it can be a separate table or an array of dates).<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Messenger Database (part 2): segmenting &quot;live&quot;\" src=\"\/wp-content\/uploads\/2020\/01\/f7bfdc96c396ca37f46d876f185bf98e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSince the modifications of the list of message dates for each individual correspondence will be few (after all, almost all messages fall into 1-2 neighboring days), I will stick exactly to this option.<\/p>\n<p>In summary, the structure of our database has taken the following form considering the partitioning:<\/p>\n<p><b class=\"spoiler_title\">Tables : RU, if you have an aversion to Cyrillic in table\/field names, it is better not to look.<\/b><\/p>\n<pre><code class=\"sql\">-- sections by message date\nCREATE TABLE \"Message_YYYYMMDD\"(\n  \"Message\"\n    uuid\n      PRIMARY KEY\n, \"Subject\"\n    uuid\n, \"SubjectDate\"\n    date\n, \"Author\"\n    uuid\n, \"DateTime\" -- used as date\n    timestamp\n, \"Text\"\n    text\n);\n\nCREATE TABLE \"Recipient_YYYYMMDD\"(\n  \"MessageDate\"\n    date\n, \"Message\"\n    uuid\n, \"Person\"\n    uuid\n, PRIMARY KEY(\"Message\", \"Person\")\n);\n\nCREATE TABLE \"File_YYYYMMDD\"(\n  \"MessageDate\"\n    date\n, \"File\"\n    uuid\n      PRIMARY KEY\n, \"Message\"\n    uuid\n, \"BLOB\"\n    uuid\n, \"Name\"\n    text\n);\n\nCREATE TABLE \"MessageRegistry_YYYYMMDD\"(\n  \"MessageDate\"\n    date\n, \"Owner\"\n    uuid\n, \"RegistryType\"\n    smallint\n, \"DateTime\"\n    timestamp\n, \"Message\"\n    uuid\n, PRIMARY KEY(\"Owner\", \"RegistryType\", \"Message\")\n);\nCREATE INDEX ON \"MessageRegistry_YYYYMMDD\"(\"Owner\", \"RegistryType\", \"DateTime\" DESC);\n\n-- sections by subject date\nCREATE TABLE \"Subject_YYYYMMDD\"(\n  \"SubjectDate\"\n    date\n, \"Subject\"\n    uuid\n      PRIMARY KEY\n, \"Document\"\n    uuid\n, \"Title\"\n    text\n);\n\nCREATE TABLE \"SubjectParticipant_YYYYMMDD\"(\n  \"SubjectDate\"\n    date\n, \"Subject\"\n    uuid\n, \"Person\"\n    uuid\n, PRIMARY KEY(\"Subject\", \"Person\")\n);\n\nCREATE TABLE \"SubjectMessageDates_YYYYMMDD\"(\n  \"SubjectDate\"\n    date\n, \"Subject\"\n    uuid\n      PRIMARY KEY\n, \"Date\"\n    date\n);\n<\/code><\/pre>\n<h2>Saving a penny<\/h2>\n<p>\nWell, if we do not use a <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/10\/ddl-partitioning\">classic approach to partitioning<\/a><\/noindex> based on the distribution of the field values (through triggers and inheritance or PARTITION BY), but instead \"manually\" at the application level, it's noticeable that the partitioning key is already stored in the table name itself.<\/p>\n<p>Therefore, if you are so <b>concerned about the volume of stored data<\/b>, you can eliminate these \"extra\" fields and directly reference specific tables. However, all queries from multiple sections will then have to be handled by the application.<br \/>\n<br \/>Source: <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.2 - 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\/en\/blog\/administrirovanie\/bd-messendzhera-ch-2-sektsioniruem-nazhivuyu\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\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\/en\/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\udd47Messenger Database (Part 2): Partitioning \"On-the-Fly\" | ProHoster","description":"We have successfully designed our PostgreSQL database structure for storing correspondence, a year has passed, users are actively populating it, and now it has millions of records, and... something has started to lag.","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/bd-messendzhera-ch-2-sektsioniruem-nazhivuyu","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","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\/en\/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\/en\/wp-json\/wp\/v2\/posts\/55027","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=55027"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/55027\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=55027"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=55027"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=55027"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}