Лысенко Андрей

+8
с 2021

Автоматизация AI-процессов. Стабилизация инференса промпт-техниками.

5 подписчиков
0 подписок

В статье рассказывается о техниках, позволяющих получить от ИИ результат, точно соответствующий требованиям. Если вы хотите, чтобы ИИ был послушным исполнителем, без галлюцинаций и девиаций, то это статья для вас.

В значительной степени советы предназначены для промптов, написанных в императивной парадигме. Отмечу, что здесь приводятся техник…

Эта статья содержит спецификацию разметки для промптов императивного типа.

Создавалась разметка постепенно, эволюционно, в процессе её создания учитывались мнения разных флагманских ИИ. Разметка испытана в сложных промптах. Большинство ИИ, которым я показывал свои промпты, называют это DSL (Domain-Specific Language). Промпт выглядит как прогр…

В статье рассматривается задача, с которой часто можно столкнуться при автоматизации интеллектуальной деятельности, а именно – технический аудит документа, и практики под эту задачу.

Уточнение: предполагается, что работа с ИИ производится через агента, т.е. задача решается за несколько сеансов взаимодействия с сохранением контекста. Все практ…

В корпоративной ткани данных большинства компаний имеется некоторая неправильность, которую как-то исправляет DWH с помощью моделей типа Data Vault. От этой неправильности так просто не избавиться, но и оставлять проблему без внимания тоже неправильно.

Начнем издалека, с понимания данных и задач DWH ...

Заметка содержит несколько кейсов с индексами для больших таблиц.

Короткие индексы работают чуть быстрее, чем полные, но основное преимущество – компактность.

Как сократить затраты на дисковое пространство в EDH конструктивным образом.

Проблема

В заметке дан краткий обзор стратегий переноса горячих изменений (CDC) с помощью запросов к БД.

Способ интеграции довольно архаичный, но при отсутствии возможности реализовать более технологичные варианты ещё применяется. Оперативность переноса достигается запуском процесса с коротким интервалом: раз в 5 минут, каждую минуту, нон-стоп.

В статье представлены рекомендации для формирования культуры владения сложными комплексами знаний, адаптированные под AI.

Введение

В статье содержится информация для организации быстрой вставки в таблицы PG.

Быстрая вставка может потребоваться в самых разных случаях …

В статье рассказывается о проблеме обновления данных в учётных системах и полезности учёта состояний справочных сущностей.

Амбула

Немного информации на тему интеграции с сохранением консистентности данных на стороне потребителя.

Потоковая интеграция

11

Несколько рекомендаций к REST API.

Общие рекомендации

Лысенко Андрей

+8
с 2021

Автоматизация AI-процессов. Стабилизация инференса промпт-техниками.

5 подписчиков
0 подписок

В статье рассказывается о техниках, позволяющих получить от ИИ результат, точно соответствующий требованиям. Если вы хотите, чтобы ИИ был послушным исполнителем, без галлюцинаций и девиаций, то это статья для вас.

В значительной степени советы предназначены для промптов, написанных в императивной парадигме. Отмечу, что здесь приводятся техник…

Эта статья содержит спецификацию разметки для промптов императивного типа.

Создавалась разметка постепенно, эволюционно, в процессе её создания учитывались мнения разных флагманских ИИ. Разметка испытана в сложных промптах. Большинство ИИ, которым я показывал свои промпты, называют это DSL (Domain-Specific Language). Промпт выглядит как прогр…

В статье рассматривается задача, с которой часто можно столкнуться при автоматизации интеллектуальной деятельности, а именно – технический аудит документа, и практики под эту задачу.

Уточнение: предполагается, что работа с ИИ производится через агента, т.е. задача решается за несколько сеансов взаимодействия с сохранением контекста. Все практ…

В корпоративной ткани данных большинства компаний имеется некоторая неправильность, которую как-то исправляет DWH с помощью моделей типа Data Vault. От этой неправильности так просто не избавиться, но и оставлять проблему без внимания тоже неправильно.

Начнем издалека, с понимания данных и задач DWH ...

Заметка содержит несколько кейсов с индексами для больших таблиц.

Короткие индексы работают чуть быстрее, чем полные, но основное преимущество – компактность.

Как сократить затраты на дисковое пространство в EDH конструктивным образом.

Проблема

В заметке дан краткий обзор стратегий переноса горячих изменений (CDC) с помощью запросов к БД.

Способ интеграции довольно архаичный, но при отсутствии возможности реализовать более технологичные варианты ещё применяется. Оперативность переноса достигается запуском процесса с коротким интервалом: раз в 5 минут, каждую минуту, нон-стоп.

В статье представлены рекомендации для формирования культуры владения сложными комплексами знаний, адаптированные под AI.

Введение

В статье содержится информация для организации быстрой вставки в таблицы PG.

Быстрая вставка может потребоваться в самых разных случаях …

В статье рассказывается о проблеме обновления данных в учётных системах и полезности учёта состояний справочных сущностей.

Амбула

Немного информации на тему интеграции с сохранением консистентности данных на стороне потребителя.

Потоковая интеграция

11

Несколько рекомендаций к REST API.

Общие рекомендации

. Пример: `$param = 1`.\n Маркер переменной ставится непосредственно перед именем переменной (как в языках PHP, Perl).\n Точка в имени переменной - оператор, который открывает цепочку доступа к свойству переменной или к операции над переменной/свойством. Примеры: `$object.property`, `$list.append`.\n Используй переменную в качестве дискурсивной метки.\n\nАлгоритмический оператор :\n Маркер, определяющий поведение AI:\n - `FOR EACH` .. `IN` : маркер применения вложенного блока инструкций к каждому элементу коллекции.\n - `DO` .. `LOOP WHILE` : маркер первичного и повторного выполнения вложенного блока инструкций, пока контрольная проверка возвращает положительный ответ.\n - `CONTINUE` / `BREAK` : маркеры управления циклами.\n - `IF` / `ELSE` : маркеры логического ветвления потока инструкций.\n Пишется всегда заглавными буквами.\n\nМаркер подстановки :\n Для оформления подстановки значений используются маркеры `\u003C\u003C` `\u003E\u003E`. Пример: `folder/\u003C\u003C$component\u003E\u003E_api/`.\n Параметр подстановки может быть замкнутым выражением, ссылкой на дискурсивную метку (переменную), гибридным выражением.\n\nКомментарий :\n Начинается с ключа `//`.\n Используй комментарий для улучшения понимания инструкций.","lang":""}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Примеры разметки"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВ своих практиках я использую аналоги функций, но они называются навыками и используются только для взаимодействия с окружением.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПример №1 (ознакомительный)\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"@ Загрузка предметных знаний\n$subject_knowledge = {{ Примени навык [READ_CONFLUENCE_PAGE_FAST] для загрузки страницы ($page_id = $param.knowledge_page) }} :\n IF NOT {{ страница загружена }} : Немедленно и безусловно прекрати выполнение промпта, выдай сообщение об ошибке. Никакие другие инструкции после этого не выполняй.\n $general_instructions = {{ Верни список указаний из раздела [Общие указания] в $subject_knowledge }}\n $special_instructions = {{ Верни список указаний из раздела [Указания к процессу определения целевых объектов и параметров тестов] в $subject_knowledge }}\n\n@ Загрузка чек-листа\n$document = {{ Примени навык [READ_CONFLUENCE_PAGE] для загрузки страницы $params.checklist.url }} :\n IF NOT {{ страница загружена }} : Немедленно и безусловно прекрати выполнение промпта, выдай сообщение об ошибке. Никакие другие инструкции после этого не выполняй.\n IF NOT {{ $document содержит $techparams.component_code_in_checklist }} : Немедленно и безусловно прекрати выполнение промпта, выдай сообщение об ошибке. Никакие другие инструкции после этого не выполняй.\n\n@ Формирование базовых сведений о чек-листе и тестируемом компоненте\n$checklist = {} :\n .description = {{ Создай краткое описание (несколько слов) чек-листа из $document }}\n .component = $techparams.component_code_in_checklist\n .endpoint = {{ Возьми $params.endpoint, добавь ведущий символ `/`, если его нет }}\n .http_method = {{ Возьми $params.http_method, преобразуй к верхнему регистру }}\n .information = {{\n !! Исключай информацию, которая уже есть в $checklist.\n !! Исключай информацию о группах и тест-кейсах.\n !! Исключай информацию, которая не относится к целевому методу компонента.\n -\u003E Определи предметную информацию из $document, если такая есть.\n }}","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПример №2 (применение циклов)\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"@ Создание методов\nFOR EACH $group IN $checklist.groups :\n FOR EACH $test_case IN $group.test_cases :\n @@ Создание параметров тестового метода\n $test_method = {} :\n .name = {{\n !! Имя должно начинаться с типа сценария ($test_case.scenario_type).\n !! Длина имени не должна превышать 40 символов.\n !! Имя должно быть в нотации lowerCamelCase.\n -\u003E Придумай уникальное имя тестового метода.\n }}\n\n @@ Создание Data Providers\n IF NOT {{ список $test_case.matrix_params пустой }} :\n $data_providers_program_code.append {{\n !! Имя метода: \"\u003C\u003C$test_method.name\u003E\u003EDataProvider\"\n !! Значения для return Stream.of возьми из $test_case.matrix\n !! Пример: private Stream\u003CArguments\u003E positive() ... return Stream.of.\n -\u003E Создай Java-код метода для $test_method.\n }}","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПример №3 (применение цикла с условием)\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"@ Загрузка контракта API\n$api = {{ Загрузи файл $params.api (это адрес относительно корневой директории Workapace) }} :\n IF NOT {{ файл загружен }} : Немедленно и безусловно прекрати выполнение промпта, выдай сообщение об ошибке. Никакие другие инструкции после этого не выполняй.\n\n@ Поиск целевого эндпоинта в контракте\n$api_endpoint = {{\n !! Сопоставляй эндпоинты по общей структуре URL-пути. Игнорируй различия в названиях path-параметров (например, пути `/users/{id}` и `/users/{userId}` должны считаться идентичными).\n -\u003E Найди в $api эндпоинт соответствующий $params.endpoint.\n}} :\n IF NOT {{ эндпоинт найден }} : Немедленно и безусловно прекрати выполнение промпта, выдай сообщение об ошибке. Никакие другие инструкции после этого не выполняй.\n\n@ Фильтрация\n$api = {{ Возьми $api, удали всё, что НЕ связано с методом $params.http_method эндпоинта $api_endpoint }}\n\n@ Загрузка файлов и реконструкция API\nDO :\n $api = {{\n !! Учитывай в атрибуте `$ref` комментарий с адресным объектом.\n !! Ограничься объектами, связанными с методом $params.http_method эндпоинта $api_endpoint.\n -\u003E Замени в $api (inline) все атрибуты `$ref` со ссылкой на файл.\n }}\nLOOP WHILE {{ в $api есть атрибут `$ref` со ссылкой на файл }}","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПример №4 (применение спецификаторов контекста)\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"$targets = {{ Примени навык [READ_FILE] к файлу $file }}\n\n{{\n $! Формат файла: Markdown\n !! Выводи проблемы списком с нумерацией.\n !! Учитывай приоритет категорий проблем в $problem_categories при определении угрозы [конечной цели].\n !! Оставь для каждого $target не более 7 проблем, которые более всего блокируют достижение [конечной цели].\n $! Структура проблемы:\n \u003C\u003C пустая строка \u003E\u003E\n \u003C\u003C$problem\u003E\u003E\n $! Структура цели:\n \u003C\u003C пустая строка \u003E\u003E\n ## Цель: \u003C\u003C$target.service\u003E\u003E » \u003C\u003C$target.endpoint\u003E\u003E » \u003C\u003C$target.http_method\u003E\u003E\n \u003C\u003C список $problem из target.problems по шаблону [Структура проблемы] \u003E\u003E\n $! Структура контента:\n # МЕТАДАННЫЕ\n \u003C\u003C пустая строка \u003E\u003E\n Название документа: \u003C\u003C название документа из $document \u003E\u003E\n \u003C\u003C пустая строка \u003E\u003E\n # ПРОБЛЕМЫ\n \u003C\u003C список $target из $targets по шаблону [Структура цели] \u003E\u003E\n -\u003E Примени навык [WRITE_FILE], сохрани $targets в файл `prompts/x-checklist/art/audit.md` по шаблону [Структура контента] }}","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПример №5 (применение именного декларатора)\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"BK_SIMPLE_TEST_METHOD_ANNOTATIONS (Аннотации) :\n !! Аннотации, перечисленные ниже, должны быть указаны над тестовым методом. Иные аннотации запрещены.\n !! Плейсхолдеры должны остаться без изменений.\n $! Аннотации:\n - @Tag(\"test_id=\u003C\u003C$test_case.test_id\u003E\u003E\")\n - @Test\n - @AllureId(\"PLACEHOLDER\")\n - @DisplayName(\"\u003C\u003CКраткое описание функции тестового метода $test_method на русском языке\u003E\u003E\") :\n - @Priority(TestOpsPriority.MEDIUM)\n\n$test_methods_program_code.append {{\n !! Создай перед методом аннотации, соблюдая требования в блоке [BK_SIMPLE_TEST_METHOD_ANNOTATIONS].\n !! Начинай декларацию метода с public void.\n !! Включи в тело метода $enviroment_program_code.\n -\u003E Создай тестовый метод $test_method.\n}}","lang":""}}],"customUri":"razmetka-promptov-dlya-ii-specifikatsiya-i-primenenie","commentEditor":{"enabled":false,"who":null,"text":"Автор блога ограничил комментирование своих постов","until":null,"reason":null,"type":"nobody"},"commentsSeenCount":null,"counters":{"comments":0,"favorites":0,"reposts":0,"online":0,"views":0,"hits":0,"reads":0,"shares":0,"reactions":0,"timespent":0,"total":84},"isPinned":false,"isNews":false,"ogTitle":null,"ogDescription":"Разметка промптов, спецификация разметки, императивный тип, использование разметки для ИИ, структурирование инструкций, алгоритмическое управление","isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"summaryContent":null,"isExistSummaryContent":false,"reactions":{"counters":[],"reactionId":0},"url":"https://vc.ru/id1028591/3123991-razmetka-promptov-dlya-ii-specifikatsiya-i-primenenie","repostData":null,"dateFavorite":0,"isFavorited":false,"warningFromEditorTitle":null,"warningFromEditor":null,"subscribedToTreads":false,"author":{"id":1028591,"name":"Лысенко Андрей","nickname":null,"description":"Автоматизация AI-процессов. Стабилизация инференса промпт-техниками.","uri":"","avatar":{"type":"image","data":{"uuid":"ea553f55-6437-567a-a50d-f077ccda4741","width":1024,"height":1024,"size":292650,"type":"png","color":"202f45","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAAC/8QAIxAAAgEDBAEFAAAAAAAAAAAAAQIDBRESAAYHIRMECEJRcf/EABUBAQEAAAAAAAAAAAAAAAAAAAAE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAIDIjEEEVH/2gAMAwEAAhEDEQA/AFHy97i+ZNkc+DY1K2070TyenSmwpS5JHq3khVpSr/MRsWvgRjj2Dfq7jyjRM9+96JbPVWxFchLIrEWJAJH1qEqJo42ZXZFLJfEkdj80BrQH/9k="}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468"}],"collectibles":[{"type":"achievement","data":{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555","dateAchieved":1753342427,"isPinned":false}},{"type":"achievement","data":{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468","dateAchieved":1753289086,"isPinned":false}}],"lastModificationDate":1791093093,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":5},"favoriteCollectible":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":1028591,"name":"Лысенко Андрей","nickname":null,"description":"Автоматизация AI-процессов. Стабилизация инференса промпт-техниками.","uri":"","avatar":{"type":"image","data":{"uuid":"ea553f55-6437-567a-a50d-f077ccda4741","width":1024,"height":1024,"size":292650,"type":"png","color":"202f45","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAAC/8QAIxAAAgEDBAEFAAAAAAAAAAAAAQIDBRESAAYHIRMECEJRcf/EABUBAQEAAAAAAAAAAAAAAAAAAAAE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAIDIjEEEVH/2gAMAwEAAhEDEQA/AFHy97i+ZNkc+DY1K2070TyenSmwpS5JHq3khVpSr/MRsWvgRjj2Dfq7jyjRM9+96JbPVWxFchLIrEWJAJH1qEqJo42ZXZFLJfEkdj80BrQH/9k="}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468"}],"collectibles":[{"type":"achievement","data":{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555","dateAchieved":1753342427,"isPinned":false}},{"type":"achievement","data":{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468","dateAchieved":1753289086,"isPinned":false}}],"lastModificationDate":1791093093,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":5},"favoriteCollectible":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"donations":{"amount":0,"isDonated":false},"gifts":[],"isBlur":false}},{"type":"entry","data":{"id":3081125,"subsiteId":1028591,"date":1786891549,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"repostId":null,"isEditorial":false,"isPublished":true,"isDisabledAd":false,"source":null,"withheld":[],"dateModified":1791069571,"title":"AI . Технический аудит документа","isGame":false,"blocks":[{"type":"text","cover":true,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВ статье рассматривается задача, с которой часто можно столкнуться при автоматизации интеллектуальной деятельности, а именно – технический аудит документа, и практики под эту задачу.\u003C/p\u003E"}},{"type":"text","cover":true,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EУточнение: предполагается, что работа с ИИ производится через агента, т.е. задача решается за несколько сеансов взаимодействия с сохранением контекста. Все практики взяты из реально работающего решения и дают гарантированный результат даже на flash-моделях.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Вводная часть"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВозьмём в качестве примера технический документ, содержащий какие-либо сущности (техническое задание, чек-лист тестирования и т.д.). Если вы сделаете аудит такого документа на предмет качества описания (ошибки, полнота и т.д.) сущностей, то статистически вы обнаружите следующие факты:\u003C/p\u003E"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["ИИ всегда находит разное количество проблем. Причем количественная разница может быть 3 и более раз.","ИИ всегда обнаруживает разные проблемы. Некоторые проблемы могут повторяться в разных ответах, но в целом множество нестабильно."],"type":"UL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EТакая недетерминированность весьма неудобна для потребителей и вызывает закономерные вопросы о полезности аудита.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EКачество результата можно существенно улучшить, применив некоторые практики ...\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Практики"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Подготовка контекста"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EОбычно такую подготовку делают после аудита, и не всегда, но если хотите усиление эффекта, то рассмотрите ...\u003C/p\u003E"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Выполните денормализацию лексики. Замените референсные и дискурсивные дейктические ссылки на оригинальное знание. Обычно это подстановка значения параметров и смыслов (вместо: \u003Ci\u003Eтам\u003C/i\u003E, \u003Ci\u003Eниже\u003C/i\u003E, \u003Ci\u003Eвыше\u003C/i\u003E, \u003Ci\u003Eранее\u003C/i\u003E, \u003Ci\u003Eсмотри документе\u003C/i\u003E).","Выполните формализацию документа, если есть возможность привести документ в более формальный вид."],"type":"UL"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Прогрев контекста"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПрежде, чем давать ИИ целевую задачу, стоит сперва выполнить подготовительные действия, которые помогут качественнее воспринимать текст.\u003C/p\u003E"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Извлеките из документа целевые объекты исследования (сущности).","Определите неочевидные правила, скрытые зависимости, негласные допущения и прочие тематические аспекты. Если сущностей мало, то рекомендуется делать это индивидуально для каждой сущности."],"type":"OL"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Качественное принуждение"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Составьте список категорий рассматриваемых проблем.\u003Cbr /\u003E\u003Ci\u003E* Иногда также полезно иметь список исключаемых из рассмотрения категорий.\u003C/i\u003E","Заставьте ИИ искать проблемы по каждой категории для каждой сущности. Если обстоятельства позволяют (скорость, деньги, ограничения токенов), то применяйте и количественное принуждение (вернуть не менее Х проблем).\u003Cbr /\u003E\u003Ci\u003E* Количественное принуждение заставит ИИ искать скрытые и неочевидные проблемы.\u003Cbr /\u003E\u003C/i\u003E"],"type":"OL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EДробите процесс на отдельные сеансы, если пользователь готов ждать ради лучшего качества, а входной токен дёшев.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Повторный прогон"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПервый прогон аудита не даст полного покрытия проблем (особенно без количественного принуждения), поэтому стоит выполнить повторный прогон (в отдельной сессии). В идеале, повторный прогон лучше выполнить с другой LLM или с высокой температурой.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Усечение претензий"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EСделайте результатом процесса только некоторое количество (например, 7) проблем, которые представляют максимальную угрозу конечной цели. Определите приоритет для категорий проблем, который ИИ будет использовать для оценки критичности проблем.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Применение"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EИсправляйте проблемы в документе и запускайте аудит повторно, выполните несколько раундов, пока не будут закрыты все существенные проблемы.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EИнструмент рекомендован к применению в первую очередь автору документа, но потребители также могут участвовать в его улучшении. Одна голова хорошо, две лучше, а две головы с LLM ещё лучше, а если LLM разные, да ещё и модели флагманские – вообще отлично.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Экспертный вклад"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Расширение пространства предметных знаний"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EСоздайте тематический документ, который будет содержать УНИВЕРСАЛЬНЫЕ знания (применяемые к значительной части документов), помогающие понимать документы определенного вида (например, ТЗ на разработку бэкенда) в некотором домене (команда, стрим, компания), и подключите документ к промпту. В нем могут быть такие знания:\u003C/p\u003E"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Трактовка, пояснения и маппинг терминов.\u003Cbr /\u003E\u003Ci\u003E* Не полагайтесь на RAG в этом аспекте.\u003C/i\u003E","Пояснения к структуре документа.","Пояснения к сленгу, знакам, разметке, таблицам и экстремально лаконичной лексике.","Рекомендации для процесса определения целевых объектов.","Рекомендации для процессов, выполняемым после аудита."],"type":"UL"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Доработка исходного документа"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЕсли ИИ не хватает специфических знаний, которые нужны, чтобы правильно понимать конкретный документ, то помещайте знания в этот документ, не засоряйте пространство универсальных знаний.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Жизненный цикл артефактов"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Промпт"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВы создали промпт, обкатали его с экспертом на репрезентативном корпусе документов, и, получив обратную связь, довели результат до приемлемого уровня. На этом процесс создания промпта почти завершается. Не нужно стремиться к идеальному промпту, в который вложено миллион правил и который поддерживает тысяча человек – это неэффективно. Закройте 90-95% типового функционала и направьте усилия на создание шаблонных документов с полными, понятными и актуальными знаниями. Вкладывайтесь в культуру \u003Ca href=\"https://vc.ru/id1028591/555329\" rel=\"noopener\"\u003Eвладения сложными комплексами знаний\u003C/a\u003E.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Опорные знания"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВы создали документ, поддерживающий процесс, наполнили его знаниями и дополнили в процессе обкатки. На этом процесс сбора опорных знаний не завершается, он может продолжаться в фоновом режиме, если пользователи хотят доучивать ИИ, чтобы получать правильный результат сразу или в следующих генерациях.\u003C/p\u003E"}}],"customUri":"avtomatizatsiya-intellektualnoy-deyatelnosti-s-pomoshchyu-ii","commentEditor":{"enabled":false,"who":null,"text":"Автор блога ограничил комментирование своих постов","until":null,"reason":null,"type":"nobody"},"commentsSeenCount":null,"counters":{"comments":0,"favorites":0,"reposts":0,"online":0,"views":0,"hits":0,"reads":0,"shares":0,"reactions":0,"timespent":0,"total":92},"isPinned":false,"isNews":false,"ogTitle":null,"ogDescription":"Автоматизация интеллектуальной деятельности, анализ сущностей, улучшение качества, декомпозиция процессов, борьба с девиациями, ИИ в инженерии","isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"summaryContent":null,"isExistSummaryContent":false,"reactions":{"counters":[],"reactionId":0},"url":"https://vc.ru/id1028591/3081125-avtomatizatsiya-intellektualnoy-deyatelnosti-s-pomoshchyu-ii","repostData":null,"dateFavorite":0,"isFavorited":false,"warningFromEditorTitle":null,"warningFromEditor":null,"subscribedToTreads":false,"author":{"id":1028591,"name":"Лысенко Андрей","nickname":null,"description":"Автоматизация AI-процессов. Стабилизация инференса промпт-техниками.","uri":"","avatar":{"type":"image","data":{"uuid":"ea553f55-6437-567a-a50d-f077ccda4741","width":1024,"height":1024,"size":292650,"type":"png","color":"202f45","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAAC/8QAIxAAAgEDBAEFAAAAAAAAAAAAAQIDBRESAAYHIRMECEJRcf/EABUBAQEAAAAAAAAAAAAAAAAAAAAE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAIDIjEEEVH/2gAMAwEAAhEDEQA/AFHy97i+ZNkc+DY1K2070TyenSmwpS5JHq3khVpSr/MRsWvgRjj2Dfq7jyjRM9+96JbPVWxFchLIrEWJAJH1qEqJo42ZXZFLJfEkdj80BrQH/9k="}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468"}],"collectibles":[{"type":"achievement","data":{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555","dateAchieved":1753342427,"isPinned":false}},{"type":"achievement","data":{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468","dateAchieved":1753289086,"isPinned":false}}],"lastModificationDate":1791093093,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":5},"favoriteCollectible":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":1028591,"name":"Лысенко Андрей","nickname":null,"description":"Автоматизация AI-процессов. Стабилизация инференса промпт-техниками.","uri":"","avatar":{"type":"image","data":{"uuid":"ea553f55-6437-567a-a50d-f077ccda4741","width":1024,"height":1024,"size":292650,"type":"png","color":"202f45","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAAC/8QAIxAAAgEDBAEFAAAAAAAAAAAAAQIDBRESAAYHIRMECEJRcf/EABUBAQEAAAAAAAAAAAAAAAAAAAAE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAIDIjEEEVH/2gAMAwEAAhEDEQA/AFHy97i+ZNkc+DY1K2070TyenSmwpS5JHq3khVpSr/MRsWvgRjj2Dfq7jyjRM9+96JbPVWxFchLIrEWJAJH1qEqJo42ZXZFLJfEkdj80BrQH/9k="}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468"}],"collectibles":[{"type":"achievement","data":{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555","dateAchieved":1753342427,"isPinned":false}},{"type":"achievement","data":{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468","dateAchieved":1753289086,"isPinned":false}}],"lastModificationDate":1791093093,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":5},"favoriteCollectible":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"donations":{"amount":0,"isDonated":false},"gifts":[],"isBlur":false}},{"type":"entry","data":{"id":2879869,"subsiteId":1028591,"date":1776810435,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"repostId":null,"isEditorial":false,"isPublished":true,"isDisabledAd":false,"source":null,"withheld":[],"dateModified":1785076288,"title":"Дефект корпоративной ткани данных","isGame":false,"blocks":[{"type":"text","cover":true,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВ корпоративной \u003Ci\u003Eткани\u003C/i\u003E данных большинства компаний имеется некоторая \u003Ci\u003Eнеправильность\u003C/i\u003E, которую как-то исправляет DWH с помощью моделей типа Data Vault. От этой неправильности так просто не избавиться, но и оставлять проблему без внимания тоже неправильно.\u003C/p\u003E"}},{"type":"text","cover":true,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EНачнем издалека, с понимания данных и задач DWH ... \u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Понимание Данных"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПо моим наблюдениям в DWH хранятся данные, скажем так, разного рода ...\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Потоковые, Фактические данные"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EДанные этого вида никогда не изменяется. Технически возможны форс-мажоры и перезаливка, но это не принципиально. У этих данных нет версий, да и хранятся они не всегда в DWH.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Операционные данные"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EОперационные сущности имеют свой жизненный цикл, сперва они существуют в виде черновиков, а в конце пути становятся застывшим фактом. Из чего следует ...\u003C/p\u003E"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Актуализировать операционные сущности в Хранилище раз в сутки вполне приемлемо.","Устаревшие версии операционных сущностей никому не интересны.\u003Cbr /\u003E"],"type":"OL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EИногда нужно наблюдать за некоторыми отдельными атрибутами сущности, связанными с её жизненным циклом (статус, баланс). Для наблюдения за жизнью атрибута лучше применить подход из Anchor Modeling. Впрочем, это редкая потребность и должна реализовываться в домене частного решения.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Справочные данные"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EДля Справочных сущностей нужна и важна историчность, но не \u003Ci\u003Eслепая\u003C/i\u003E, в виде ежедневных снимков, а управляемая бизнесом (подробнее \u003Ca href=\"https://vc.ru/id1028591/336191\" rel=\"noopener\"\u003Eтут\u003C/a\u003E). \u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Некоторые типовые задачи DWH"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Аудит данных"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EХотите хранить аудит в DWH – пожалуйста, но лучше отдельно и с более низкой стоимостью хранения. При аудите хранятся только измененные атрибуты сущностей и контекст, аудит должен хранить каждое изменение сущности, а не снимок раз в сутки.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Неизменность отчетов"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЕсли в вашем домене есть требование на неизменность утвержденных отчетов – делайте снимок и сохраняйте в слой Reporting, не надо пытаться догмами \u003Ci\u003Eзаморозить\u003C/i\u003E исходные данные в DWH.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Мастер данные"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EИдея свести нормативный базис источников и получить корпоративные справочники – правильная, но не системная. Это бизнес-задача, как и тысячи других бизнес-задач, начиная с построения частных оптимизационных таблиц и заканчивая витринами и кубами данных. Инженер DWH может помогать в решении этой задачи специальной команде, но это зона ответственности частного домена.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Сведение данных"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПриземлить данные разных систем в одну среду – половина дела, ещё нужно свести данные с одинаковым профилем атрибутов. Это не совсем профильная, но полезная оптимизационная задача, так как в противном случае запросы потребителей станут чрезмерно сложными.\u003C/p\u003E"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["\u003Ci\u003EПотоковые данные\u003C/i\u003E. Для сущностей с одинаковым профилем атрибутов можно и нужно выполнять вертикальное сведение данных в одну таблицу (с сохранением метки источника). Обычно это делают еще до DWH, но могут быть исключения.","\u003Ci\u003EОперационные данные\u003C/i\u003E. Как правило, операционные сущности уникальны, но есть исключение, например, распределенная система. В этом случае решение такое же.","\u003Ci\u003EСправочные данные\u003C/i\u003E. Для этих сущностей все немного сложнее, тут требуется не только вертикальное сведение сущностей, но и слияние сущностей и данных атрибутов. Это типичная MDM-задача, которая решается с помощью алгоритмов, \u003Ci\u003Eзолотых\u003C/i\u003E таблиц и таблиц маппинга."],"type":"UL"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Собственно сам дефект"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EС учетом сказанного выше ... \u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЕсли ваши источники данных не имеют аудита или не ведут учетную историю справочных сущностей, то инженеры DWH будут вынуждены использовать что-то вроде Data Vault. Такой костыль над архаичными источниками дает возможность закрывать требования, но ...\u003C/p\u003E"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Нормального аудита не будет.","Настоящей учетной истории для справочных сущностей не будет.","Отслеживать изменение состояний операционных сущностей получится, но с издержками в 1-2 порядка на хранение всей сущности."],"type":"OL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВ итоге – сложная и неполноценная реализация типовых требований не в том месте, ещё и весьма неудобная и дорогая в использовании.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЕсли вы сможете избавиться от неприятного наследия и приведёте источники к современному стандарту, то DWH не нужно будет заниматься нецелевой деятельностью, порождая при этом \u003Ci\u003Eстранные\u003C/i\u003E или избыточные данные.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EКакие вы получите плюсы при правильном подходе к данным?\u003C/p\u003E"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Дискового пространства и процессоров нужно будет на один-два порядка меньше (тут все от профиля систем в компании зависит).","Запросы пользователей будут конструктивно значительно проще и быстрее выполняться. Скорость может и на три порядка вырасти.","Обслуживание DWH и ELT процессы будут немного проще и быстрее."],"type":"UL"}}],"customUri":"pereosmyslenie-korporativnogo-khranilishcha-dannykh","commentEditor":{"enabled":false,"who":null,"text":"Автор блога ограничил комментирование своих постов","until":null,"reason":null,"type":"nobody"},"commentsSeenCount":null,"counters":{"comments":0,"favorites":0,"reposts":0,"online":0,"views":0,"hits":0,"reads":0,"shares":0,"reactions":0,"timespent":0,"total":165},"isPinned":false,"isNews":false,"ogTitle":null,"ogDescription":"Корпоративное хранилище данных, понимание данных, аудит данных, операционные сущности, справочные сущности, оптимизация хранилища","isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"summaryContent":null,"isExistSummaryContent":false,"reactions":{"counters":[],"reactionId":0},"url":"https://vc.ru/id1028591/2879869-pereosmyslenie-korporativnogo-khranilishcha-dannykh","repostData":null,"dateFavorite":0,"isFavorited":false,"warningFromEditorTitle":null,"warningFromEditor":null,"subscribedToTreads":false,"author":{"id":1028591,"name":"Лысенко Андрей","nickname":null,"description":"Автоматизация AI-процессов. Стабилизация инференса промпт-техниками.","uri":"","avatar":{"type":"image","data":{"uuid":"ea553f55-6437-567a-a50d-f077ccda4741","width":1024,"height":1024,"size":292650,"type":"png","color":"202f45","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAAC/8QAIxAAAgEDBAEFAAAAAAAAAAAAAQIDBRESAAYHIRMECEJRcf/EABUBAQEAAAAAAAAAAAAAAAAAAAAE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAIDIjEEEVH/2gAMAwEAAhEDEQA/AFHy97i+ZNkc+DY1K2070TyenSmwpS5JHq3khVpSr/MRsWvgRjj2Dfq7jyjRM9+96JbPVWxFchLIrEWJAJH1qEqJo42ZXZFLJfEkdj80BrQH/9k="}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468"}],"collectibles":[{"type":"achievement","data":{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555","dateAchieved":1753342427,"isPinned":false}},{"type":"achievement","data":{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468","dateAchieved":1753289086,"isPinned":false}}],"lastModificationDate":1791093093,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":5},"favoriteCollectible":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":1028591,"name":"Лысенко Андрей","nickname":null,"description":"Автоматизация AI-процессов. Стабилизация инференса промпт-техниками.","uri":"","avatar":{"type":"image","data":{"uuid":"ea553f55-6437-567a-a50d-f077ccda4741","width":1024,"height":1024,"size":292650,"type":"png","color":"202f45","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAAC/8QAIxAAAgEDBAEFAAAAAAAAAAAAAQIDBRESAAYHIRMECEJRcf/EABUBAQEAAAAAAAAAAAAAAAAAAAAE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAIDIjEEEVH/2gAMAwEAAhEDEQA/AFHy97i+ZNkc+DY1K2070TyenSmwpS5JHq3khVpSr/MRsWvgRjj2Dfq7jyjRM9+96JbPVWxFchLIrEWJAJH1qEqJo42ZXZFLJfEkdj80BrQH/9k="}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468"}],"collectibles":[{"type":"achievement","data":{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555","dateAchieved":1753342427,"isPinned":false}},{"type":"achievement","data":{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468","dateAchieved":1753289086,"isPinned":false}}],"lastModificationDate":1791093093,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":5},"favoriteCollectible":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"donations":{"amount":0,"isDonated":false},"gifts":[],"isBlur":false}},{"type":"entry","data":{"id":2006695,"subsiteId":1028591,"date":1748117259,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"repostId":null,"isEditorial":false,"isPublished":true,"isDisabledAd":false,"source":null,"withheld":[],"dateModified":1750378966,"title":"Короткие индексы","isGame":false,"blocks":[{"type":"text","cover":true,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЗаметка содержит несколько кейсов с индексами для больших таблиц.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EКороткие индексы работают чуть быстрее, чем полные, но основное преимущество – компактность.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Высокоселективный индекс"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВы заметили, что к таблице часто обращаются запросы с отбором строк по конкретному высокоселективному значению.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВам однозначно нужен индекс именно на это значение. Места такой индекс много не займет, так как строк мало.\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"CREATE INDEX index_name \n ON table_name USING BTREE (column_name)\n WHERE column_name = 1;","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВ некоторых случаях несколько специализированных индексов будут предпочтительнее, чем один общий. В некоторых случаях можно создать общий индекс, исключив из него значения, которые использованы более чем в 30% строк.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Динамический индекс"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВы заметили, что к таблице часто обращаются запросы с отбором строк за небольшой интервал (последний день / неделя / месяц).\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЕсли данные хотя бы примерно упорядочены по опорному полю (со значениями меток времени), то можно использовать BRIN индекс, он очень компактный.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EИли можно использовать динамический индекс с ограничением значений по опорному полю.\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"CREATE OR REPLACE FUNCTION index_name_from()\n RETURNS timestamp -- должен совпадать с типом опорного поля\n LANGUAGE sql\n IMMUTABLE\nAS \n$function$\n SELECT CURRENT_DATE - INTERVAL '1 week' -- глубина = неделя\n$function$;\n\nCREATE INDEX index_name \n ON table_name USING BTREE (column_name) -- или BRIN индекс\n WHERE column_name \u003E index_name_from();","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EИндекс нужно обновлять раз в день / неделю.\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"REINDEX INDEX CONCURRENTLY index_name;","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E» Динамический индекс может быть более простой альтернативой контролю индексов отдельных партиций.\u003C/p\u003E"}}],"customUri":"korotkie-indeksy-dlya-bolshikh-tablic","commentEditor":{"enabled":false,"who":null,"text":"Автор блога ограничил комментирование своих постов","until":null,"reason":null,"type":"nobody"},"commentsSeenCount":null,"counters":{"comments":0,"favorites":0,"reposts":0,"online":0,"views":0,"hits":0,"reads":0,"shares":0,"reactions":0,"timespent":0,"total":292},"isPinned":false,"isNews":false,"ogTitle":null,"ogDescription":"Короткие индексы, высокоселективные индексы, динамические индексы, создание индексов, оптимизация запросов к таблицам","isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"summaryContent":null,"isExistSummaryContent":false,"reactions":{"counters":[],"reactionId":0},"url":"https://vc.ru/id1028591/2006695-korotkie-indeksy-dlya-bolshikh-tablic","repostData":null,"dateFavorite":0,"isFavorited":false,"warningFromEditorTitle":null,"warningFromEditor":null,"subscribedToTreads":false,"author":{"id":1028591,"name":"Лысенко Андрей","nickname":null,"description":"Автоматизация AI-процессов. Стабилизация инференса промпт-техниками.","uri":"","avatar":{"type":"image","data":{"uuid":"ea553f55-6437-567a-a50d-f077ccda4741","width":1024,"height":1024,"size":292650,"type":"png","color":"202f45","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAAC/8QAIxAAAgEDBAEFAAAAAAAAAAAAAQIDBRESAAYHIRMECEJRcf/EABUBAQEAAAAAAAAAAAAAAAAAAAAE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAIDIjEEEVH/2gAMAwEAAhEDEQA/AFHy97i+ZNkc+DY1K2070TyenSmwpS5JHq3khVpSr/MRsWvgRjj2Dfq7jyjRM9+96JbPVWxFchLIrEWJAJH1qEqJo42ZXZFLJfEkdj80BrQH/9k="}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468"}],"collectibles":[{"type":"achievement","data":{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555","dateAchieved":1753342427,"isPinned":false}},{"type":"achievement","data":{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468","dateAchieved":1753289086,"isPinned":false}}],"lastModificationDate":1791093093,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":5},"favoriteCollectible":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":1028591,"name":"Лысенко Андрей","nickname":null,"description":"Автоматизация AI-процессов. Стабилизация инференса промпт-техниками.","uri":"","avatar":{"type":"image","data":{"uuid":"ea553f55-6437-567a-a50d-f077ccda4741","width":1024,"height":1024,"size":292650,"type":"png","color":"202f45","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAAC/8QAIxAAAgEDBAEFAAAAAAAAAAAAAQIDBRESAAYHIRMECEJRcf/EABUBAQEAAAAAAAAAAAAAAAAAAAAE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAIDIjEEEVH/2gAMAwEAAhEDEQA/AFHy97i+ZNkc+DY1K2070TyenSmwpS5JHq3khVpSr/MRsWvgRjj2Dfq7jyjRM9+96JbPVWxFchLIrEWJAJH1qEqJo42ZXZFLJfEkdj80BrQH/9k="}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468"}],"collectibles":[{"type":"achievement","data":{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555","dateAchieved":1753342427,"isPinned":false}},{"type":"achievement","data":{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468","dateAchieved":1753289086,"isPinned":false}}],"lastModificationDate":1791093093,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":5},"favoriteCollectible":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"donations":{"amount":0,"isDonated":false},"gifts":[],"isBlur":false}},{"type":"entry","data":{"id":1972272,"subsiteId":1028591,"date":1746662012,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"repostId":null,"isEditorial":false,"isPublished":true,"isDisabledAd":false,"source":null,"withheld":[],"dateModified":1778008501,"title":"Компактный Data Hub","isGame":false,"blocks":[{"type":"text","cover":true,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EКак сократить затраты на дисковое пространство в EDH конструктивным образом.\u003C/p\u003E"}},{"type":"header","cover":true,"hidden":false,"anchor":"","data":{"style":"h2","text":"Проблема"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EEDH часто создается для концентрации данных под оперативные задачи. В таких задачах требуется свежие данные за несколько последних дней/месяцев. Стало быть, хранить полные таблицы смысла нет – это очень накладно. Организовать TTL данных просто, если речь идет о потоковых данных, но заметно сложнее, если речь идет о транзакционных данных учетных систем. В учетной системе данные организованы в модель и находятся в \u003Ca href=\"https://vc.ru/id1028591/336156\" rel=\"noopener\"\u003Eконсистентном\u003C/a\u003E состоянии. Удаление устаревших данных может привести к разрушению ссылочной целостности с соответствующими неприятными последствиями. В процессе добавления новых записей также можно получить на руки \u003Ci\u003Eхолостой\u003C/i\u003E внешний ключ.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Решение"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EДля решения проблемы нам понадобится:\u003C/p\u003E"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["таблица отношений сущностей,","механизм восстановления ссылочной целостности,","сервис удаления устаревших записей."],"type":"UL"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Таблица отношений"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EТаблица с описанием отношений между сущностями нужна и для корректного удаления, и для восстановления записей.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Механизм восстановления ссылочной целостности"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВосстановление ссылочной целостности реализуется так …\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПосле приземления данных в EDH производится проверка внешних ключей. Если найдены ключи, не замкнутые на целевую сущность, то производится повторное обращение к источнику за недостающими данными. Процесс этот рекурсивный, так как новые данные также нужно проверить, но сходящийся. Наиболее оптимально реализовать этот механизм в формате встраиваемого модуля, но могут быть и альтернативные варианты реализации.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E\u003Ci\u003EЛайфхак\u003C/i\u003E » Если в целевой таблице есть редкие внешние ключи к очень большой, но вспомогательной таблице (нужна только чтобы обогатиться / дотянуться / отфильтроваться), то такую таблицу можно заполнять только через механизм восстановления ссылочной целостности. В результате вы получите значительную экономию дискового пространства, снизите трафик, ускорите загрузку и запросы.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Сервис удаления записей"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EУдаление записей реализуется так …\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EНайдите в таблице устаревшие записи, к которым не ведут внешние ключи, и удалите их.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E\u003Ci\u003EЛайфхак\u003C/i\u003E » Процесс не нужно делать рекурсивным, если его запускать ежедневно.\u003C/p\u003E"}}],"customUri":"optimizatsiya-zatrat-na-diskovoe-prostranstvo-v-enterprise-data-hub","commentEditor":{"enabled":false,"who":null,"text":"Автор блога ограничил комментирование своих постов","until":null,"reason":null,"type":"nobody"},"commentsSeenCount":null,"counters":{"comments":0,"favorites":0,"reposts":0,"online":0,"views":0,"hits":0,"reads":0,"shares":0,"reactions":0,"timespent":0,"total":321},"isPinned":false,"isNews":false,"ogTitle":null,"ogDescription":"Сокращение затрат на дисковое пространство в EDH, восстановление ссылочной целостности, удаление устаревших записей, эффективные методы хранения данных","isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"summaryContent":null,"isExistSummaryContent":false,"reactions":{"counters":[],"reactionId":0},"url":"https://vc.ru/id1028591/1972272-optimizatsiya-zatrat-na-diskovoe-prostranstvo-v-enterprise-data-hub","repostData":null,"dateFavorite":0,"isFavorited":false,"warningFromEditorTitle":null,"warningFromEditor":null,"subscribedToTreads":false,"author":{"id":1028591,"name":"Лысенко Андрей","nickname":null,"description":"Автоматизация AI-процессов. Стабилизация инференса промпт-техниками.","uri":"","avatar":{"type":"image","data":{"uuid":"ea553f55-6437-567a-a50d-f077ccda4741","width":1024,"height":1024,"size":292650,"type":"png","color":"202f45","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAAC/8QAIxAAAgEDBAEFAAAAAAAAAAAAAQIDBRESAAYHIRMECEJRcf/EABUBAQEAAAAAAAAAAAAAAAAAAAAE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAIDIjEEEVH/2gAMAwEAAhEDEQA/AFHy97i+ZNkc+DY1K2070TyenSmwpS5JHq3khVpSr/MRsWvgRjj2Dfq7jyjRM9+96JbPVWxFchLIrEWJAJH1qEqJo42ZXZFLJfEkdj80BrQH/9k="}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468"}],"collectibles":[{"type":"achievement","data":{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555","dateAchieved":1753342427,"isPinned":false}},{"type":"achievement","data":{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468","dateAchieved":1753289086,"isPinned":false}}],"lastModificationDate":1791093093,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":5},"favoriteCollectible":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":1028591,"name":"Лысенко Андрей","nickname":null,"description":"Автоматизация AI-процессов. Стабилизация инференса промпт-техниками.","uri":"","avatar":{"type":"image","data":{"uuid":"ea553f55-6437-567a-a50d-f077ccda4741","width":1024,"height":1024,"size":292650,"type":"png","color":"202f45","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAAC/8QAIxAAAgEDBAEFAAAAAAAAAAAAAQIDBRESAAYHIRMECEJRcf/EABUBAQEAAAAAAAAAAAAAAAAAAAAE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAIDIjEEEVH/2gAMAwEAAhEDEQA/AFHy97i+ZNkc+DY1K2070TyenSmwpS5JHq3khVpSr/MRsWvgRjj2Dfq7jyjRM9+96JbPVWxFchLIrEWJAJH1qEqJo42ZXZFLJfEkdj80BrQH/9k="}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468"}],"collectibles":[{"type":"achievement","data":{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555","dateAchieved":1753342427,"isPinned":false}},{"type":"achievement","data":{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468","dateAchieved":1753289086,"isPinned":false}}],"lastModificationDate":1791093093,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":5},"favoriteCollectible":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"donations":{"amount":0,"isDonated":false},"gifts":[],"isBlur":false}},{"type":"entry","data":{"id":1880464,"subsiteId":1028591,"date":1742688489,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"repostId":null,"isEditorial":false,"isPublished":true,"isDisabledAd":false,"source":null,"withheld":[],"dateModified":1751401441,"title":"Стратегии near real-time CDC","isGame":false,"blocks":[{"type":"text","cover":true,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВ заметке дан краткий обзор стратегий переноса \u003Ci\u003Eгорячих\u003C/i\u003E изменений (CDC) с помощью запросов к БД.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EСпособ интеграции довольно архаичный, но при отсутствии возможности реализовать более технологичные варианты ещё применяется. Оперативность переноса достигается запуском процесса с коротким интервалом: раз в 5 минут, каждую минуту, нон-стоп.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Транзакционно-толерантные стратегии"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЭтот вид стратегий допускает длинные транзакции в источнике, но не допускает параллельные операции с данными.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Отслеживание суррогатного ключа"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EСтратегию рекомендуется выбирать, если в источник производится только добавление строк.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЭто, пожалуй, самая простая стратегия, суть которой заключается в отслеживании фактического значения суррогатного ключа.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EК простоте прилагаются ограничения:\u003Cbr /\u003E• Данные должны содержать целочисленный суррогатный ключ.\u003Cbr /\u003E• Значения ключа должны возрастать монотонно.\u003Cbr /\u003E• Параллельные операции INSERT в таблице недопустимы.\u003Cbr /\u003E• Операции UPDATE и DELETE недопустимы.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EРекомендуется:\u003Cbr /\u003E• Индексировать ключ.\u003Cbr /\u003E• Ограничивать размер выборки.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЗапрос к источнику содержит:\u003Cbr /\u003E• Сортировку ключа по возрастанию.\u003Cbr /\u003E• Условие выборки.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Отслеживание временных меток"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЭту стратегию рекомендуется выбирать, если запись в источник производится длительными транзакциями.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПроизводится отслеживание значений меток времени (и ключа, если есть), проставляемых системой для целей CDC. \u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EОграничения:\u003Cbr /\u003E• Данные должны содержать одно или несколько полей с метками времени операции над строкой.\u003Cbr /\u003E• Параллельные операции изменения данных в таблице недопустимы.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EРекомендуется:\u003Cbr /\u003E• Иметь в данных ключ.\u003Cbr /\u003E» Без ключа можно нарваться на большой блок изменений с одинаковой временной меткой, что может стать проблемой.\u003Cbr /\u003E• Индексировать метки и ключ.\u003Cbr /\u003E• Ограничивать размер выборки.\u003Cbr /\u003E• Генерировать значения меток в БД (default-функцией или функцией, указанной в DML операторе).\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЗапрос к источнику может быть довольно сложным, если меток несколько, а ключ составной. Запрос содержит:\u003Cbr /\u003E• Сортировку по возрастанию метки и ключа (если есть).\u003Cbr /\u003E• Условие выборки.\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"-- простой случай\nORDER BY updated_at, key\n\n-- случай с составным ключом\nORDER BY updated_at, key_part_1, key_part_2, key_part_3\n\n-- случай с несколькими метками\nORDER BY coalesce(deleted_at, updated_at, created_at), key\n-- если образуется большой долг, то запрос может долго выполняться \n\n-- сложный случай\nORDER BY coalesce(deleted_at, updated_at, created_at), \n key_part_1, key_part_2, key_part_3","lang":""}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"-- сложный случай\n-- READ_FROM - сохраненное ранее максимальное значение\n-- … created_at/updated_at/deleted_at из последней записи \n-- … в предыдущей итерации\n-- LAST_KEY - сохраненные ранее значения ключа из последней записи\n-- … в предыдущей итерации\nWHERE \n created_at \u003E READ_FROM\n or updated_at \u003E READ_FROM\n or deleted_at \u003E READ_FROM\n or ( created_at = READ_FROM \n or updated_at = READ_FROM \n or deleted_at = READ_FROM ) \n and key_part_1 \u003E= LAST_KEY1 \n and key_part_2 \u003E= LAST_KEY2 \n and key_part_3 \u003E LAST_KEY3 -- здесь именно \u003E","lang":""}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Конкурентно-толерантные стратегии"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЭтот вид стратегий допускает параллельные операции с данными в источнике, но не допускает длинные транзакции.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Агрессивная выборка"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВыбирайте эту стратегию, если требуется получать самые свежие изменения из источника по метке времени.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EДанные из таблицы выбираются за определенный интервал времени – окно (есть нижняя и верхняя граница).\u003Cbr /\u003E» Верхняя граница актуальна для ограничения выборки, если образовался технический долг.\u003Cbr /\u003E» Нижняя граница – значение, рассчитанное в предыдущей итерации.\u003C/p\u003E\u003Cp\u003EЕсли окно выборки данных находится рядом с текущим временем (в штатной ситуации это так, но окно может быть далеко, если образовался технический долг), то в следующей итерации часть данных будет прочитана повторно. Это объясняется тем, что некоторые транзакции могут быть ещё не завершены и вы не увидите изменений, хотя у таких записей уже есть метка времени. \u003Cbr /\u003E• Определите максимально возможную продолжительность транзакции (МПТ). \u003Cbr /\u003E• Нижняя граница запроса не может быть больше, чем текущее время минус МПТ.\u003Cbr /\u003E• Текущее время определяется запросом к БД-источника.\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"ВГ = НГ + ИТД\n• ВГ - верхняя граница окна\n• НГ - нижняя граница окна (вычислено в предыдущей итерации)\n• ИТД - размер окна при обслуживании техдолга (10-30 мин)\n\nНГСИ = min(ВГ, ТВ – МПТ)\n• НГСИ - нижняя граница окна для следующей итерации\n• ТВ - текущее время\n• МПТ - максимальная продолжительность транзакции","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EНедостатки:\u003Cbr /\u003E• Повторное чтение данных порождает издержки – нагрузка на источник, получателя, сеть.\u003Cbr /\u003E» Если в перекрывающийся интервал войдет большой блок изменений, то издержки удвоятся.\u003Cbr /\u003E• Если какая-либо транзакция выйдет за МПТ, то произойдёт потеря изменений.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EОграничения:\u003Cbr /\u003E• Данные должны содержать одно или несколько полей с метками времени операции над строкой.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EРекомендуется:\u003Cbr /\u003E• Индексировать метки.\u003Cbr /\u003E• Генерировать значения меток в БД (default-функцией или функцией, указанной в DML операторе).\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЗапрос к источнику содержит:\u003Cbr /\u003E• Условие выборки.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Аккуратная выборка"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВыбирайте эту стратегию как альтернативу агрессивной выборке. Отличие состоит в том, что уже верхняя граница запроса не может быть больше, чем текущее время минус МПТ (т.е. выжидается время МПТ, пока транзакции, стартовавшие до верхней границы, завершатся). Профит в том, что издержки ниже, чем при агрессивной выборке.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EНедостатки:\u003Cbr /\u003E• Поставка изменений отстает на интервал МПТ.\u003Cbr /\u003E» Т.е. фаза переноса данных происходит быстрее, чем при агрессивной выборке, но уровень актуализации ниже, так как изменения за интервал МПТ не переносятся.\u003Cbr /\u003E• Если какая-то строка с изменениями вдруг ещё раз обновится в зоне МПТ (т.е. метка времени получит значение больше, чем верхняя граница), то она ускользнет из запроса. Если строка будет обновляться постоянно и часто, то она будет ускользать вечно (эффект может наблюдаться, например, в витринах данных). В учетных таблицах эффект постоянного выскальзывания маловероятен, но разовое выскальзывание может случаться часто.\u003Cbr /\u003E• Если какая-либо транзакция выйдет за МПТ, то произойдёт потеря изменений.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Дополнительная информация"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Проблема меток"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EДля стратегий, работающих с метками времени, перевод системного таймера сервера БД назад недопустим, даже службой точного времени. Если служба точного времени подключена и таймер спешит, то рекомендуется сделать небольшой сдвиг вниз порога выборки (нижней границы окна), это может привести к некоторым издержкам, иногда значительным.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Сокращение времени загрузки"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EОперативность поставки данных определяется, в том числе, длительностью фазы переноса данных. Для максимального ускорения рекомендуется распараллелить процесс загрузки, для этого нужно открыть несколько соединений с БД. В идеале нужно иметь для каждой таблицы свое соединение, но так как у БД ограниченное количество ядер, то некоторые запросы встанут в очередь. Минимизация общего времени переноса данных достигается управлением очередью. Для этого нужно иметь статистику времени выполнения процессов загрузки по каждой таблице, первыми в очередь должны заходить самые тяжелые процессы.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Консистентность"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПро сохранение консистентности данных можно почитать \u003Ca href=\"https://vc.ru/u/1028591/336156\" rel=\"noopener\" target=\"_blank\"\u003Eтут\u003C/a\u003E.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Резюме"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EКак видите, все стратегии оперативного переноса инкремента имеют некоторые ограничения и недостатки, поэтому рекомендуется применять более технологичные варианты интеграции (работа с журналами).\u003C/p\u003E"}}],"customUri":null,"commentEditor":{"enabled":false,"who":null,"text":"Автор блога ограничил комментирование своих постов","until":null,"reason":null,"type":"nobody"},"commentsSeenCount":null,"counters":{"comments":0,"favorites":0,"reposts":0,"online":0,"views":0,"hits":0,"reads":0,"shares":0,"reactions":0,"timespent":0,"total":438},"isPinned":false,"isNews":false,"ogTitle":null,"ogDescription":null,"isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"summaryContent":null,"isExistSummaryContent":false,"reactions":{"counters":[],"reactionId":0},"url":"https://vc.ru/id1028591/1880464-strategii-near-real-time-cdc","repostData":null,"dateFavorite":0,"isFavorited":false,"warningFromEditorTitle":null,"warningFromEditor":null,"subscribedToTreads":false,"author":{"id":1028591,"name":"Лысенко Андрей","nickname":null,"description":"Автоматизация AI-процессов. Стабилизация инференса промпт-техниками.","uri":"","avatar":{"type":"image","data":{"uuid":"ea553f55-6437-567a-a50d-f077ccda4741","width":1024,"height":1024,"size":292650,"type":"png","color":"202f45","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAAC/8QAIxAAAgEDBAEFAAAAAAAAAAAAAQIDBRESAAYHIRMECEJRcf/EABUBAQEAAAAAAAAAAAAAAAAAAAAE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAIDIjEEEVH/2gAMAwEAAhEDEQA/AFHy97i+ZNkc+DY1K2070TyenSmwpS5JHq3khVpSr/MRsWvgRjj2Dfq7jyjRM9+96JbPVWxFchLIrEWJAJH1qEqJo42ZXZFLJfEkdj80BrQH/9k="}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468"}],"collectibles":[{"type":"achievement","data":{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555","dateAchieved":1753342427,"isPinned":false}},{"type":"achievement","data":{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468","dateAchieved":1753289086,"isPinned":false}}],"lastModificationDate":1791093093,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":5},"favoriteCollectible":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":1028591,"name":"Лысенко Андрей","nickname":null,"description":"Автоматизация AI-процессов. Стабилизация инференса промпт-техниками.","uri":"","avatar":{"type":"image","data":{"uuid":"ea553f55-6437-567a-a50d-f077ccda4741","width":1024,"height":1024,"size":292650,"type":"png","color":"202f45","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAAC/8QAIxAAAgEDBAEFAAAAAAAAAAAAAQIDBRESAAYHIRMECEJRcf/EABUBAQEAAAAAAAAAAAAAAAAAAAAE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAIDIjEEEVH/2gAMAwEAAhEDEQA/AFHy97i+ZNkc+DY1K2070TyenSmwpS5JHq3khVpSr/MRsWvgRjj2Dfq7jyjRM9+96JbPVWxFchLIrEWJAJH1qEqJo42ZXZFLJfEkdj80BrQH/9k="}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468"}],"collectibles":[{"type":"achievement","data":{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555","dateAchieved":1753342427,"isPinned":false}},{"type":"achievement","data":{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468","dateAchieved":1753289086,"isPinned":false}}],"lastModificationDate":1791093093,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":5},"favoriteCollectible":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"donations":{"amount":0,"isDonated":false},"gifts":[],"isBlur":false}},{"type":"entry","data":{"id":555329,"subsiteId":1028591,"date":1670275161,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"repostId":null,"isEditorial":false,"isPublished":true,"isDisabledAd":false,"source":null,"withheld":[],"dateModified":1790719957,"title":"AI . Владение сложными комплексами знаний","isGame":false,"blocks":[{"type":"text","cover":true,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВ статье представлены рекомендации для формирования культуры владения сложными комплексами знаний, адаптированные под AI.\u003C/p\u003E"}},{"type":"header","cover":true,"hidden":false,"anchor":"","data":{"style":"h2","text":"Введение"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EAI, как феномен, оказался мощным катализатором прогресса. Сейчас AI проходит фазу взросления, модели становятся надежнее, адекватнее, и через несколько лет основным препятствием на пути эффективной эксплуатации AI будут не её детские болезни, а низкое качество и культура организации знаний в компании. AI, как и человек, никогда не сможет хорошо выполнить задачу с низким качеством постановки или построить решение на знаниях, которых нет, которые врут, которые надежно зарыты или распылены. \u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EКультурно организованные, качественные комплексы знаний являются важным условием для успешного применения AI.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Базовые принципы"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Связывание знаний","Структурирование знаний\u003Cbr /\u003E","Форматирование знаний\u003Cbr /\u003E","Фрагментирование знаний\u003Cbr /\u003E","Актуализация знаний","Полнота знаний","Контентная адаптация знаний","Разметка и маркировка знаний"],"type":"OL"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Связывание знаний"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EСвязывание является одним из самых полезных для потребителей принципов. Именно связывание позволяет сформировать полноценный граф знаний, преобразующий \u003Ci\u003Eсвалку\u003C/i\u003E в систему.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЧтобы AI видела и понимала зависимости знаний в огромном комплексе, необходимо образовать связи ...\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВ документе рекомендуется иметь:\u003C/p\u003E"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Ссылку на родительский документ – эта ссылка подскажет AI, что блок знаний есть часть (объектная или аспектная) целого.","Ссылку на точку входа (корневой документ) – эта ссылка покажет AI самый верхний документ, через который можно получить все знания об артефакте.\u003Cbr /\u003EУ артефакта должна быть единая точка входа. Сами данные могут располагаться в разных платформах (Confluence, Git и т.д.), но они обязательно должны быть включены в граф знаний (через ссылки). Недопустимо порождать знания, не связанные с корневой точкой артефакта.","Контекстные ссылки – ссылки на контекст.\u003Cbr /\u003EТак как контекст бывает очень обширен, то рекомендуется разделить его на: Предметный контекст (схемы БД, спецификации, системы, сервисы, модели и т.д.) и Общий контекст (шаблон документа, регламенты, стандарты, методички, описания паттернов решений, энциклопедические знания и т.д.).","Обратные ссылки – чрезвычайно полезны для спецификации исходящих зависимостей, они показывают, где используются знания, представленные в документе. Именно с помощью этого вида связывания можно пройти по всей цепочке документов для внесения согласованных изменений. Применение AI для актуализации знаний весьма эффективно скажется на затратах в управлении знаниями.\u003Cbr /\u003EОбратные и контекстные ссылки рекомендуется собрать (продублировать, если надо) и оформить в виде отдельных блоков, и поместить в начало документа (сразу после структуры). Это избыточно для AI, но очень удобно для человека, особенно при многократной работе с документом."],"type":"UL"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Структурирование знаний"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Объектное структурирование"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПрименяется к знаниям, специфицирующим объект (система, сервис, модуль и т.д.). Объектное структурирование знаний выполняется в полном соответствии с принципами декомпозиции объекта. Структурной единицей является документ, представляющий компонент любого уровня. Глубина декомпозиции определяется требованием к уровню владения знаниями, при котором не происходит потеря возможности воспроизводить решения, принятые ранее. Структура объекта, выраженная связями документов, позволяет качественно улучшить возможность ориентироваться в его конструктивном аспекте, это особенно ценно для новых потребителей и AI.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Аспектное структурирование"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EАспектное структурирование позволяет представить \u003Ci\u003Eсвалку\u003C/i\u003E знаний набором аспектов и субаспектов. Применяется к знаниям внутри документа. Тщательность выделения аспектов является важным качеством, которое делает комплекс знаний удобным.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EСтруктура документа будет такой:\u003C/p\u003E"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Аспекты документа – представлены разделами верхнего уровня. Наиболее консервативная часть документов определенного типа.","Предметные аспекты – представлены разделами, помещенными в профильный аспект документа (Техническая информация).","Субаспекты – применяются для структуризации и улучшения восприятия аспектов любого типа."],"type":"UL"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Форматирование знаний"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EФорматирование знаний осуществляется с помощью шаблонов. Шаблон является мощным средством упаковки знаний. Для AI шаблоны действуют как схемы данных, они задают ожидаемую структуру, типы информации и обязательные моменты, что позволяет более надёжно интерпретировать контент.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EШаблоны дают такие преимущества: \u003C/p\u003E"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Ускоряется создание однотипных документов.\u003Cbr /\u003E\u003Ci\u003EШаблон содержит памятки к разделам (например, о составе информации или способе заполнения), текстовые заготовки, структуры и прочие элементы форматирования знаний.\u003C/i\u003E\u003Cbr /\u003E","Улучшается использование однотипных документов.\u003Cbr /\u003E\u003Ci\u003EУскоряется поиск информации, вычитывание, повышается процент усвоенной информации.\u003C/i\u003E","Информация стандартизируется."],"type":"UL"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Фрагментирование знаний"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПроблема: длинные документы неудобно читать, в них неудобно искать информацию, по ним неудобно разрабатывать, их неудобно исправлять, их версионирование избыточно нагружает систему.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EФрагментирование – это вынесение особо \u003Ci\u003Eобъемных и переиспользуемых\u003C/i\u003E аспектов в отдельные документы. Что это дает?\u003C/p\u003E"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Сохраняется целостность восприятия документа.\u003Cbr /\u003E\u003Ci\u003E Человек может завязнуть в каком-то аспекте ещё до того, как получит общее представление о предмете.\u003C/i\u003E\u003Cbr /\u003E","Работа человека с документом становится быстрее и удобнее, особенно при актуализации знаний.\u003Cbr /\u003E","Короткий контент быстрее, точнее и дешевле обрабатывается AI.\u003Cbr /\u003E\u003Ci\u003EВ случае, если используется Document-level retrieval.\u003C/i\u003E\u003Cbr /\u003E","Вынесенные фрагменты могут переиспользоваться, исключается бойлерплейт (DRY)."],"type":"UL"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Актуализация знаний"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВ графе знаний какого-либо артефакта можно выделить две части: специфицирующую и фактическую (например, задачи в Jira). Из-за фактической части полный граф со временем может стать очень большим, что неизбежно приведет к проблемам его обработки (время, стоимость, ограничение контекстного окна и пр.). Поэтому все знания, специфицирующие артефакт, его контекст и состояния, указанные в фактической части, должны быть перенесены в специфицирующую часть.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЕсли при разработке программ специалисты уточняют требования и не сохраняют новые знания в источник, то владение артефактом будет прервано, так как код перестанет объясняться требованиями, а создание независимых тестов станет принципиально невозможным.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Полнота знаний"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВопрос: Какой уровень детализации знаний необходим, чтобы владение решением (системой, сервисом, продуктом, инфраструктурой) не прерывалось?\u003C/p\u003E\u003Cp\u003EОтвет: Уровень детализации знаний должен гарантировать воспроизведение любого действующего решения.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Контентная адаптация знаний"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Лексический порог"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПредставим сухой технический текст, где в предложении может быть сразу несколько требований, например – \"Микросервис должен быть отказоустойчивым, высокодоступным и поддерживать нагрузку не менее 100 запросов в секунду\". Это плохой текст для AI, так как некоторые требования выражены всего одним словом. Дело в том, что одно слово не обладает достаточной лексической массой, поэтому требование получит мало внимания и может быть игнорировано. Стало быть ...\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E\u003Ci\u003EЛюбое утверждение должно быть выражено минимум одним предложением, а лучше двумя.\u003Cbr /\u003E\u003C/i\u003EВ некоторой степени исключением могут быть маркированные списки (они получают больше внимания).\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПример ... Высокая доступность: Микросервис должен обеспечивать доступ к своему API 99.99% времени. Максимальное время простоя 1 минута.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Парафраз"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЕсть случаи, когда текст составлен не очень удачно:\u003C/p\u003E"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Академический текст – трудно воспринимается в контексте из-за всеобщей правильности формулировки, пониженная ситуативная точность.","Общая формулировка – размытая семантика и неоднозначность.","Непонятная / неудачная формулировка – высокий риск искаженного понимания смысла.","Предложения с большим количеством терминов, определенных в других документах – высокий риск непонимания или искаженного понимания смысла.","Экстремальная лаконичность (AUTH_JWT: Аутентификация — JWT с RS256) – недостаток \u003Ci\u003Eграмматического клея\u003C/i\u003E может приводить к ошибкам в трактовке утверждений."],"type":"UL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E\u003Ci\u003EВо всех этих случаях рекомендуется применять парафраз или пояснение.\u003Cbr /\u003E\u003C/i\u003EПеределывать оригинальный текст не нужно.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Локальный глоссарий"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВнутри документов рекомендуется давать определение не только аббревиатурам, но и ключевым терминам. Если этого не сделать, то ожидайте, что AI может не угадать ситуативную коннотацию термина, заложенную автором.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Отказ от дискурсивных дейктических ссылок"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EФразы типа \"см. выше\", \"как указано ранее\", \"в соседнем разделе\", \"там\" теряют смысл при фрагментации и RAG-поиске. AI обрабатывает тексты чанками, а на дейктических ссылках цепочка суждений рвется.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Разметка и маркировка знаний"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЕсли вы захотите использовать документ с прикладной целью, то достаточно быстро обнаружите, что для AI как-то нужно выделить ссылки (на другие документы), которые ОБЯЗАТЕЛЬНО нужно изучить для качественного понимания этого документа. Загружать документы в контекстное окно тоже нужно в определенном порядке (от листьев к корню). Не полагайтесь на RAG в этом вопросе, он не даст нужной полноты, чистоты и порядка знаний.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЕсли у вас есть документ с требованиями, по которым создаётся программа, то каждому требованию разумно выдать уникальную метку (это распространенная практика). Используйте эти метки в комментариях к программным блокам и операциям (если уместно), чтобы связывать требования и результат.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВ промптах очень удобно и точно можно обращаться к знаниям, если они обозначены специальной меткой или декларатором (например, кодовое название списка). Такая разметка позволяет AI намного точнее, быстрее и дешевле выделять подмножества или находить целевые массивы знаний. Некоторые виды разметок полезны не только для AI, но и для потребителей и авторов документов (сразу понятно, какие аспекты принципиально важны для применения документа). Разметки создаются исключительно с прикладной целью и должны делаться только на основании требований к документу.\u003C/p\u003E"}}],"customUri":null,"commentEditor":{"enabled":false,"who":null,"text":"Автор блога ограничил комментирование своих постов","until":null,"reason":null,"type":"nobody"},"commentsSeenCount":null,"counters":{"comments":0,"favorites":0,"reposts":0,"online":0,"views":0,"hits":0,"reads":0,"shares":0,"reactions":0,"timespent":0,"total":1273},"isPinned":false,"isNews":false,"ogTitle":null,"ogDescription":null,"isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"summaryContent":null,"isExistSummaryContent":false,"reactions":{"counters":[],"reactionId":0},"url":"https://vc.ru/id1028591/555329-ai-vladenie-slozhnymi-kompleksami-znanii","repostData":null,"dateFavorite":0,"isFavorited":false,"warningFromEditorTitle":null,"warningFromEditor":null,"subscribedToTreads":false,"author":{"id":1028591,"name":"Лысенко Андрей","nickname":null,"description":"Автоматизация AI-процессов. Стабилизация инференса промпт-техниками.","uri":"","avatar":{"type":"image","data":{"uuid":"ea553f55-6437-567a-a50d-f077ccda4741","width":1024,"height":1024,"size":292650,"type":"png","color":"202f45","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAAC/8QAIxAAAgEDBAEFAAAAAAAAAAAAAQIDBRESAAYHIRMECEJRcf/EABUBAQEAAAAAAAAAAAAAAAAAAAAE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAIDIjEEEVH/2gAMAwEAAhEDEQA/AFHy97i+ZNkc+DY1K2070TyenSmwpS5JHq3khVpSr/MRsWvgRjj2Dfq7jyjRM9+96JbPVWxFchLIrEWJAJH1qEqJo42ZXZFLJfEkdj80BrQH/9k="}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468"}],"collectibles":[{"type":"achievement","data":{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555","dateAchieved":1753342427,"isPinned":false}},{"type":"achievement","data":{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468","dateAchieved":1753289086,"isPinned":false}}],"lastModificationDate":1791093093,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":5},"favoriteCollectible":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":1028591,"name":"Лысенко Андрей","nickname":null,"description":"Автоматизация AI-процессов. Стабилизация инференса промпт-техниками.","uri":"","avatar":{"type":"image","data":{"uuid":"ea553f55-6437-567a-a50d-f077ccda4741","width":1024,"height":1024,"size":292650,"type":"png","color":"202f45","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAAC/8QAIxAAAgEDBAEFAAAAAAAAAAAAAQIDBRESAAYHIRMECEJRcf/EABUBAQEAAAAAAAAAAAAAAAAAAAAE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAIDIjEEEVH/2gAMAwEAAhEDEQA/AFHy97i+ZNkc+DY1K2070TyenSmwpS5JHq3khVpSr/MRsWvgRjj2Dfq7jyjRM9+96JbPVWxFchLIrEWJAJH1qEqJo42ZXZFLJfEkdj80BrQH/9k="}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468"}],"collectibles":[{"type":"achievement","data":{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555","dateAchieved":1753342427,"isPinned":false}},{"type":"achievement","data":{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468","dateAchieved":1753289086,"isPinned":false}}],"lastModificationDate":1791093093,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":5},"favoriteCollectible":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"donations":{"amount":0,"isDonated":false},"gifts":[],"isBlur":false}},{"type":"entry","data":{"id":395999,"subsiteId":1028591,"date":1649191761,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"repostId":null,"isEditorial":false,"isPublished":true,"isDisabledAd":false,"source":null,"withheld":[],"dateModified":1755286837,"title":"PostgreSQL – быстрая вставка","isGame":false,"blocks":[{"type":"text","cover":true,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВ статье содержится информация для организации быстрой вставки в таблицы PG.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EБыстрая вставка может потребоваться в самых разных случаях … \u003C/p\u003E"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["для сокращения времени транзакции.","для высоконагруженного решения.","для быстрого журналирования."],"type":"UL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВот несколько основных напоминаний, которые помогут оптимизировать вставку:\u003C/p\u003E"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Минимизируйте использование индексов, триггеров, ограничений.\u003Cbr /\u003E","Если значение индексируемого поля возрастает монотонно, то вместо B-tree используйте BRIN индекс.","Используйте максимально большой набор строк в одной операции INSERT или COPY.","Рассмотрите возможность параллельной вставки с помощью нескольких сессий.","Рассмотрите возможность поместить индекс в другое табличное пространство на отдельном диске.","Рассмотрите возможность отказаться от использования транзакций (CREATE UNLOGGED TABLE …).\u003Cbr /\u003E"],"type":"UL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EДополнительно можно задуматься об использовании быстрых дисков (SSD NVMe) и конвергентных архитектурах (например VSAN).\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЕсли будете делать высоконагруженное решение с индексом B-tree, то обратите внимание на параметр \u003Ci\u003Eshared_buffers\u003C/i\u003E. Как только индексы перестанут помещаться в RAM, скорость вставки катастрофически деградирует. В этом случае нужно будет увеличить размер \u003Ci\u003Eshared_buffers \u003C/i\u003Eили уменьшить количество строк, помещаемых в одну партицию.\u003C/p\u003E"}}],"customUri":null,"commentEditor":{"enabled":false,"who":null,"text":"Автор блога ограничил комментирование своих постов","until":null,"reason":null,"type":"nobody"},"commentsSeenCount":null,"counters":{"comments":0,"favorites":1,"reposts":0,"online":0,"views":0,"hits":0,"reads":0,"shares":0,"reactions":0,"timespent":0,"total":777},"isPinned":false,"isNews":false,"ogTitle":null,"ogDescription":null,"isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"summaryContent":null,"isExistSummaryContent":false,"reactions":{"counters":[],"reactionId":0},"url":"https://vc.ru/id1028591/395999-postgresql-bystraya-vstavka","repostData":null,"dateFavorite":0,"isFavorited":false,"warningFromEditorTitle":null,"warningFromEditor":null,"subscribedToTreads":false,"author":{"id":1028591,"name":"Лысенко Андрей","nickname":null,"description":"Автоматизация AI-процессов. Стабилизация инференса промпт-техниками.","uri":"","avatar":{"type":"image","data":{"uuid":"ea553f55-6437-567a-a50d-f077ccda4741","width":1024,"height":1024,"size":292650,"type":"png","color":"202f45","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAAC/8QAIxAAAgEDBAEFAAAAAAAAAAAAAQIDBRESAAYHIRMECEJRcf/EABUBAQEAAAAAAAAAAAAAAAAAAAAE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAIDIjEEEVH/2gAMAwEAAhEDEQA/AFHy97i+ZNkc+DY1K2070TyenSmwpS5JHq3khVpSr/MRsWvgRjj2Dfq7jyjRM9+96JbPVWxFchLIrEWJAJH1qEqJo42ZXZFLJfEkdj80BrQH/9k="}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468"}],"collectibles":[{"type":"achievement","data":{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555","dateAchieved":1753342427,"isPinned":false}},{"type":"achievement","data":{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468","dateAchieved":1753289086,"isPinned":false}}],"lastModificationDate":1791093093,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":5},"favoriteCollectible":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":1028591,"name":"Лысенко Андрей","nickname":null,"description":"Автоматизация AI-процессов. Стабилизация инференса промпт-техниками.","uri":"","avatar":{"type":"image","data":{"uuid":"ea553f55-6437-567a-a50d-f077ccda4741","width":1024,"height":1024,"size":292650,"type":"png","color":"202f45","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAAC/8QAIxAAAgEDBAEFAAAAAAAAAAAAAQIDBRESAAYHIRMECEJRcf/EABUBAQEAAAAAAAAAAAAAAAAAAAAE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAIDIjEEEVH/2gAMAwEAAhEDEQA/AFHy97i+ZNkc+DY1K2070TyenSmwpS5JHq3khVpSr/MRsWvgRjj2Dfq7jyjRM9+96JbPVWxFchLIrEWJAJH1qEqJo42ZXZFLJfEkdj80BrQH/9k="}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468"}],"collectibles":[{"type":"achievement","data":{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555","dateAchieved":1753342427,"isPinned":false}},{"type":"achievement","data":{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468","dateAchieved":1753289086,"isPinned":false}}],"lastModificationDate":1791093093,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":5},"favoriteCollectible":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"donations":{"amount":0,"isDonated":false},"gifts":[],"isBlur":false}},{"type":"entry","data":{"id":336191,"subsiteId":1028591,"date":1639831978,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"repostId":null,"isEditorial":false,"isPublished":true,"isDisabledAd":false,"source":null,"withheld":[],"dateModified":1777378125,"title":"Учетная история Справочных сущностей","isGame":false,"blocks":[{"type":"text","cover":true,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВ статье рассказывается о проблеме обновления данных в учётных системах и полезности учёта состояний справочных сущностей.\u003C/p\u003E"}},{"type":"header","cover":true,"hidden":false,"anchor":"","data":{"style":"h2","text":"Амбула"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПредставим, что у вас есть MVP и вы сделали справочник сотрудников для бухгалтера, самым тривиальным образом, и запустили в эксплуатацию.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Явление бухгалтера первое"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EК вам приходит бухгалтер и говорит, что сотрудница Иванова поменяла фамилию на Петрова.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВы: заходите в справочник и меняете фамилию сотрудницы.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Явление бухгалтера второе"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПриходит бухгалтер и говорит, что в отчете за прошлый квартал Петрова отображается неправильно, поскольку тогда она была еще Иванова.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВы: понимаете, что исправить этот дефект можно с помощью учётного версионирования строк с указанием даты ввода в учёт нового значения и дорабатываете.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Явление бухгалтера третье"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЕще через 3 месяца бухгалтер приходит опять и говорит, что у этой же сотрудницы ошибка в отчестве. \u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВы: заходите в справочник, исправляете ошибку, и в результате порождается новая версия записи с правильным отчеством.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h3","text":"Явление бухгалтера четвертое"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EБухгалтер звонит и жалуется, что в отчетах за предыдущие кварталы отчество сотрудницы выводится неправильно.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EТут приходит понимание, что в справочнике нужно сделать кнопку \"Сохранить\" для update`а немного сложнее. При нажатии кнопки необходимо спросить у пользователя, а что, собственно, он хочет сделать, исправить ошибку или актуализировать значение?\u003C/p\u003E"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["если нужно Исправить ошибку ...\u003Cbr /\u003E» Это Коррекционное изменение.\u003Cbr /\u003E» В этом случае версия записи порождаться не будет, но исправление должно быть сделано в актуальной и исторических версиях.","если нужно Актуализировать значение ...\u003Cbr /\u003E» Это Эволюционное изменение.\u003Cbr /\u003E» В этом случае нужно потребовать дату ввода в учёт нового значения. Будет порождена новая версия записи."],"type":"UL"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Важный нюанс"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E\u003Cb\u003EAT\u003C/b\u003E – дата окончания учётного состояния\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EДля \u003Ci\u003Eсамостоятельной \u003C/i\u003Eсущности (на которую могут быть ссылки) допускается удаление (если она ошибочно создана), но не допускается ограничение AT в актуальной записи. Дело в том, что технически актуальность сущности должна быть непрерывна и покрывать диапазон 2000 – 3000 гг. Это нужно для того, чтобы ретроспективные запросы не разрушались в ситуации, когда ссылка на сущность есть, а актуальности в исторической точке нет (а такое случается). Тогда управлять видимостью сущности в UI надо с помощью отдельного признака (т.е. учетные состояния – отдельно, видимость в UI – отдельно).\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EДля \u003Ci\u003Eподчиненной \u003C/i\u003Eсущности (на которую не может быть ссылок, например: предметный состав), допускается удаление (если она ошибочно создана), а также допускается ограничение AT в актуальной записи. Здесь уже не нужен дополнительный признак для UI (используется AT).\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Общие тезисы"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EУчётная история нужна только для нормативного базиса (справочники). \u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EТак как некоторые кейсы могут быть достаточно запутанными, то необходим интерфейс для управления учетной историей (иногда нужно исправить даты или отменить изменение).\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EАудит действий пользователя никак не связан с учетной историей, поэтому моделируйте его отдельно.\u003C/p\u003E"}}],"customUri":null,"commentEditor":{"enabled":false,"who":null,"text":"Автор блога ограничил комментирование своих постов","until":null,"reason":null,"type":"nobody"},"commentsSeenCount":null,"counters":{"comments":0,"favorites":0,"reposts":0,"online":0,"views":0,"hits":0,"reads":0,"shares":0,"reactions":0,"timespent":0,"total":808},"isPinned":false,"isNews":false,"ogTitle":null,"ogDescription":null,"isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"summaryContent":null,"isExistSummaryContent":false,"reactions":{"counters":[],"reactionId":0},"url":"https://vc.ru/id1028591/336191-uchetnaya-istoriya-spravochnyh-sushnostei","repostData":null,"dateFavorite":0,"isFavorited":false,"warningFromEditorTitle":null,"warningFromEditor":null,"subscribedToTreads":false,"author":{"id":1028591,"name":"Лысенко Андрей","nickname":null,"description":"Автоматизация AI-процессов. Стабилизация инференса промпт-техниками.","uri":"","avatar":{"type":"image","data":{"uuid":"ea553f55-6437-567a-a50d-f077ccda4741","width":1024,"height":1024,"size":292650,"type":"png","color":"202f45","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAAC/8QAIxAAAgEDBAEFAAAAAAAAAAAAAQIDBRESAAYHIRMECEJRcf/EABUBAQEAAAAAAAAAAAAAAAAAAAAE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAIDIjEEEVH/2gAMAwEAAhEDEQA/AFHy97i+ZNkc+DY1K2070TyenSmwpS5JHq3khVpSr/MRsWvgRjj2Dfq7jyjRM9+96JbPVWxFchLIrEWJAJH1qEqJo42ZXZFLJfEkdj80BrQH/9k="}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468"}],"collectibles":[{"type":"achievement","data":{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555","dateAchieved":1753342427,"isPinned":false}},{"type":"achievement","data":{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468","dateAchieved":1753289086,"isPinned":false}}],"lastModificationDate":1791093093,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":5},"favoriteCollectible":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":1028591,"name":"Лысенко Андрей","nickname":null,"description":"Автоматизация AI-процессов. Стабилизация инференса промпт-техниками.","uri":"","avatar":{"type":"image","data":{"uuid":"ea553f55-6437-567a-a50d-f077ccda4741","width":1024,"height":1024,"size":292650,"type":"png","color":"202f45","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAAC/8QAIxAAAgEDBAEFAAAAAAAAAAAAAQIDBRESAAYHIRMECEJRcf/EABUBAQEAAAAAAAAAAAAAAAAAAAAE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAIDIjEEEVH/2gAMAwEAAhEDEQA/AFHy97i+ZNkc+DY1K2070TyenSmwpS5JHq3khVpSr/MRsWvgRjj2Dfq7jyjRM9+96JbPVWxFchLIrEWJAJH1qEqJo42ZXZFLJfEkdj80BrQH/9k="}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468"}],"collectibles":[{"type":"achievement","data":{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555","dateAchieved":1753342427,"isPinned":false}},{"type":"achievement","data":{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468","dateAchieved":1753289086,"isPinned":false}}],"lastModificationDate":1791093093,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":5},"favoriteCollectible":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"donations":{"amount":0,"isDonated":false},"gifts":[],"isBlur":false}},{"type":"entry","data":{"id":336156,"subsiteId":1028591,"date":1639823598,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"repostId":null,"isEditorial":false,"isPublished":true,"isDisabledAd":false,"source":null,"withheld":[],"dateModified":1749418288,"title":"Сохранение консистентности при интеграции систем","isGame":false,"blocks":[{"type":"text","cover":true,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EНемного информации на тему интеграции с сохранением консистентности данных на стороне потребителя.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Потоковая интеграция"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЕсли вы используете брокер сообщений для интеграции, например Kafka, то сохранить консистентность на стороне потребителя можно, но требуется выполнить несколько условий:\u003C/p\u003E"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Использовать в топиках только 1 партицию.","Передать во все топики финальное сообщение, сигнализирующее об окончании пакета изменений – кадра (см. пояснения ниже), даже если пакет был пустой. \u003Cbr /\u003E» Потребителю нужно дождаться финальных сообщений во всех топиках. После этого данные можно перекладывать в предметные таблицы или завершать транзакцию, если запись была непосредственно в них.","Для чтения данных можно использовать только одну сессию.","Перед чтением необходимо открыть транзакцию с уровнем изоляции Repeatable Read. \u003Cbr /\u003E» Это условие актуально, если чтение данных производится из нескольких предметных таблиц. Если чтение делается из логов, размеченных кадром, то это условие можно не учитывать.","Если переносится инкремент (CDC), то он должен быть перенесен целиком.\u003Cbr /\u003E» Это условие актуально, если чтение данных производится из предметных таблиц.\u003Cbr /\u003E","При работе с брокером нужно использовать транзакцию, чтобы гарантировать целостность кадра."],"type":"UL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EОчевидно, что дизайн решения непростой и есть ограничение по производительности. Потоковая интеграция плохо подходит для строгого сохранения консистентности, но это в принципе достижимо.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EОптимально иметь общий кадрированный лог, это позволит минимизировать операции чтения, упростить дизайн и качественно обрабатывать технический долг (после длительного простоя source коннектора).\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Прямой запрос к БД"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПри прямом обращении к БД также можно реализовать перенос данных с сохранением консистентности, но требуется выполнить условия:\u003C/p\u003E"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Использовать только 1 сессию к БД-источнику.","Перед чтением необходимо открыть транзакцию с уровнем изоляции Repeatable Read.\u003Cbr /\u003E» Это условие актуально, если чтение данных производится из нескольких таблиц.\u003Cbr /\u003E","Если переносится инкремент (CDC), то он должен быть перенесен целиком.\u003Cbr /\u003E\u003Ci\u003EУчтите вот что »\u003C/i\u003E Данные вы конечно увидите консистентные, но вы не увидите изменения, сделанные другими незавершенными транзакциями до старта вашей транзакции. Поэтому нужно перечитывать данные (сдвигать порог чтения назад на максимально возможную продолжительность транзакции), чтобы захватить пропущенные (в прошлый сеанс) изменения. \u003Cbr /\u003E"],"type":"UL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EУвы, но консистентность и многопоточность несовместимы. Если интеграционный адаптер остановится на длительное время, то перенос накопившегося инкремента целиком может стать проблемой.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Чтение из лога"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EИногда требуется организовать перенос данных из журнала/ов, в котором записаны изменения строк. Эта информация относится к источнику данных и подготовке данных для передачи с сохранением консистентности. Лог хорошо подходит для передачи инкремента в брокер или с помощью REST API.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EДля инкрементного вычитывания данных из лога необходимо отслеживать значение \u003Ci\u003Eid\u003C/i\u003E (идентификатор строки, порождаемый генератором). Вычитывать данные из лога нужно в порядке возрастания \u003Ci\u003Eid\u003C/i\u003E, но … так как некоторые записи (с меньшими \u003Ci\u003Eid\u003C/i\u003E) могут быть еще недоступны для чтения (из-за незавершенных транзакций), то одного \u003Ci\u003Eid\u003C/i\u003E мало, тут требуется дополнительное действие – раскадровка журнала. Сразу оговорюсь, есть случаи, когда раскадровка может быть не нужна:\u003C/p\u003E"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["если есть возможность удалять строки из лога при вычитывании.","если данные пишутся в лог монопольно, т.е. всего одним процессом, и строго последовательно.\u003Cbr /\u003E","если есть другой способ правильно отслеживать инкремент."],"type":"UL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EРазметка кадра выполняется примерно так …\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"UPDATE data_log \nSET frame_id = \u003Cnew id\u003E \nWHERE frame_id is null","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EРазмечаем новые строки лога идентификатором кадра. Значения кадра можно брать из того же генератора, что используется для \u003Ci\u003Eid\u003C/i\u003E. Если логов несколько, то разметку нужно делать единым идентификатором с уровнем изоляции транзакции Repeatable Read.\u003C/p\u003E"}},{"type":"quote","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EКрайне важно! Разметка должна выполняться строго в отдельной транзакции. Разметку можно выполнять по регламенту (job), например раз в 5 секунд.\u003C/p\u003E","subline1":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВычитывать данные из лога нужно в порядке возрастания идентификаторов (ORDER BY frame_id , id), отслеживать тоже нужно оба значения.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EКадр должен быть целиком передан потребителю и атомарно применен, это будет главное условие сохранения консистентности.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EДля ускорения записи и чтения сделайте всего 1 BRIN-индекс для поля \u003Ci\u003Eframe_id\u003C/i\u003E. \u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Так ли нужна консистентность?"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Иногда это просто необоснованное требование со стороны заказчика.","Иногда нарушение консистентности будет иметь временный эффект (Eventual Consistency), целостность восстановится в следующей итерации.","Несогласованность ссылочной целостности можно закрыть с помощью \u003Ca href=\"https://vc.ru/id1028591/1972272\" rel=\"noopener\" target=\"_blank\"\u003Eспециальной доработки\u003C/a\u003E."],"type":"UL"}}],"customUri":null,"commentEditor":{"enabled":false,"who":null,"text":"Автор блога ограничил комментирование своих постов","until":null,"reason":null,"type":"nobody"},"commentsSeenCount":null,"counters":{"comments":1,"favorites":0,"reposts":0,"online":0,"views":0,"hits":0,"reads":0,"shares":0,"reactions":0,"timespent":0,"total":1198},"isPinned":false,"isNews":false,"ogTitle":null,"ogDescription":null,"isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"summaryContent":null,"isExistSummaryContent":false,"reactions":{"counters":[{"id":1,"count":1}],"reactionId":0},"url":"https://vc.ru/id1028591/336156-sohranenie-konsistentnosti-pri-integracii-sistem","repostData":null,"dateFavorite":0,"isFavorited":false,"warningFromEditorTitle":null,"warningFromEditor":null,"subscribedToTreads":false,"author":{"id":1028591,"name":"Лысенко Андрей","nickname":null,"description":"Автоматизация AI-процессов. Стабилизация инференса промпт-техниками.","uri":"","avatar":{"type":"image","data":{"uuid":"ea553f55-6437-567a-a50d-f077ccda4741","width":1024,"height":1024,"size":292650,"type":"png","color":"202f45","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAAC/8QAIxAAAgEDBAEFAAAAAAAAAAAAAQIDBRESAAYHIRMECEJRcf/EABUBAQEAAAAAAAAAAAAAAAAAAAAE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAIDIjEEEVH/2gAMAwEAAhEDEQA/AFHy97i+ZNkc+DY1K2070TyenSmwpS5JHq3khVpSr/MRsWvgRjj2Dfq7jyjRM9+96JbPVWxFchLIrEWJAJH1qEqJo42ZXZFLJfEkdj80BrQH/9k="}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468"}],"collectibles":[{"type":"achievement","data":{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555","dateAchieved":1753342427,"isPinned":false}},{"type":"achievement","data":{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468","dateAchieved":1753289086,"isPinned":false}}],"lastModificationDate":1791093093,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":5},"favoriteCollectible":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":1028591,"name":"Лысенко Андрей","nickname":null,"description":"Автоматизация AI-процессов. Стабилизация инференса промпт-техниками.","uri":"","avatar":{"type":"image","data":{"uuid":"ea553f55-6437-567a-a50d-f077ccda4741","width":1024,"height":1024,"size":292650,"type":"png","color":"202f45","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAAC/8QAIxAAAgEDBAEFAAAAAAAAAAAAAQIDBRESAAYHIRMECEJRcf/EABUBAQEAAAAAAAAAAAAAAAAAAAAE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAIDIjEEEVH/2gAMAwEAAhEDEQA/AFHy97i+ZNkc+DY1K2070TyenSmwpS5JHq3khVpSr/MRsWvgRjj2Dfq7jyjRM9+96JbPVWxFchLIrEWJAJH1qEqJo42ZXZFLJfEkdj80BrQH/9k="}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468"}],"collectibles":[{"type":"achievement","data":{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555","dateAchieved":1753342427,"isPinned":false}},{"type":"achievement","data":{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468","dateAchieved":1753289086,"isPinned":false}}],"lastModificationDate":1791093093,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":5},"favoriteCollectible":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"donations":{"amount":0,"isDonated":false},"gifts":[],"isBlur":false}},{"type":"entry","data":{"id":336040,"subsiteId":1028591,"date":1639821382,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"repostId":null,"isEditorial":false,"isPublished":true,"isDisabledAd":false,"source":null,"withheld":[],"dateModified":1789508590,"title":"REST API – памятка","isGame":false,"blocks":[{"type":"text","cover":true,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EНесколько рекомендаций к REST API.\u003C/p\u003E"}},{"type":"header","cover":true,"hidden":false,"anchor":"","data":{"style":"h2","text":"Общие рекомендации"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Создавайте API всегда и только под конкретные сценарии потребления.\u003Cbr /\u003E","Разумно оптимизируйте количество методов, делая их более универсальными.","Входные параметры делайте массивами, если это может упростить сценарий использования API.","Указывайте параметры в:\u003Cbr /\u003E\u003Ci\u003E• header – \u003C/i\u003Eдля передачи технического, системного, глобального контекста\u003Cbr /\u003E\u003Ci\u003E• path –\u003C/i\u003E для передачи идентификатора объекта\u003Cbr /\u003E\u003Ci\u003E• query –\u003C/i\u003E для передачи управляющих опций, параметров\u003Cbr /\u003E\u003Ci\u003E• requestBody\u003C/i\u003E – для передачи данных","Используйте выделенные методы, если нужно выполнить изменение атрибута объекта по особому алгоритму.","Не используете множественное наследование в объектах.","Используйте опции \u003Ci\u003EreadOnly \u003C/i\u003Eи \u003Ci\u003EwriteOnly\u003C/i\u003E, чтобы оптимизировать количество объектов в контракте."],"type":"UL"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Доступ к ассоциативной сущности через корень агрегата"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EDELETE /team/{team-id}/member/{member-id}:\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EРеализуйте доступ к дочерним сущностям через корень агрегата (DDD), но не доверяйте ему. Может показаться, что \u003Ci\u003Eteam-id\u003C/i\u003E лишний, ведь для удаления достаточно \u003Ci\u003Emember-id\u003C/i\u003E, но \u003Ci\u003Eteam-id\u003C/i\u003E позволит ускорить выполнение операции, так как можно выполнить параллельно:\u003Cbr /\u003E• проверку Row Level Security на уровне предметной сущности;\u003Cbr /\u003E• проверку, что \u003Ci\u003Emember-id\u003C/i\u003E подчинена именно \u003Ci\u003Eteam-id\u003C/i\u003E;\u003Cbr /\u003E• часть основной операции.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"POST – PUT – PATCH"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EPOST и PUT используйте, если вы передаете полное описание объекта. Если вы хотите выполнить обновление объекта слиянием, т.е. передать произвольную часть объекта, то рекомендую использовать PATCH. \u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EPOST – применяется, если пользователь (фронт) считает, что он передает новый объект. Объект передается целиком. В БД это реализуется операцией INSERT.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EPUT – применяется, если пользователь (фронт) считает, что он обновляет объект. Объект передается целиком. В БД это может реализовываться операцией UPDATE или UPSERT или UPDATE + INSERT версионной строки.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EPATCH – для замены части объекта (фронт отдает произвольный набор свойств).\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Не используйте нотацию CamelCase"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EРазработчики таблиц в БД часто любят давать полям имена с цифрами, например: agg12_3, agg1_23, agg1_2_3 (особенно в промышленном ИТ). При попытке привести имя к нотации Camel вы получите проблему: конфликт имен или невнятное имя или длинное имя. Camel не подходит для работы с цифровыми именами, но отлично подходит Kebab – это оптимальное и универсальное решение, хотя и немного не традиционное. Если вы абсолютно уверены, что в вашем проекте не будет атрибутов сущностей с цифрами, то используйте Camel, но это плохой выбор для средних и больших проектов.\u003Cbr /\u003E* \u003Ci\u003EДля справки, \u003Ca href=\"https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FList_of_HTTP_header_fields&postId=336040\" rel=\"nofollow noopener\" target=\"_blank\"\u003Eимена переменных в HTTP-заголовках\u003C/a\u003E в традиционно создаются в нотации Train (Kebab + Camel).\u003C/i\u003E\u003C/p\u003E"}}],"customUri":null,"commentEditor":{"enabled":false,"who":null,"text":"Автор блога ограничил комментирование своих постов","until":null,"reason":null,"type":"nobody"},"commentsSeenCount":null,"counters":{"comments":0,"favorites":3,"reposts":0,"online":0,"views":0,"hits":0,"reads":0,"shares":0,"reactions":0,"timespent":0,"total":2106},"isPinned":false,"isNews":false,"ogTitle":null,"ogDescription":null,"isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"summaryContent":null,"isExistSummaryContent":false,"reactions":{"counters":[],"reactionId":0},"url":"https://vc.ru/id1028591/336040-rest-api-pamyatka","repostData":null,"dateFavorite":0,"isFavorited":false,"warningFromEditorTitle":null,"warningFromEditor":null,"subscribedToTreads":false,"author":{"id":1028591,"name":"Лысенко Андрей","nickname":null,"description":"Автоматизация AI-процессов. Стабилизация инференса промпт-техниками.","uri":"","avatar":{"type":"image","data":{"uuid":"ea553f55-6437-567a-a50d-f077ccda4741","width":1024,"height":1024,"size":292650,"type":"png","color":"202f45","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAAC/8QAIxAAAgEDBAEFAAAAAAAAAAAAAQIDBRESAAYHIRMECEJRcf/EABUBAQEAAAAAAAAAAAAAAAAAAAAE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAIDIjEEEVH/2gAMAwEAAhEDEQA/AFHy97i+ZNkc+DY1K2070TyenSmwpS5JHq3khVpSr/MRsWvgRjj2Dfq7jyjRM9+96JbPVWxFchLIrEWJAJH1qEqJo42ZXZFLJfEkdj80BrQH/9k="}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468"}],"collectibles":[{"type":"achievement","data":{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555","dateAchieved":1753342427,"isPinned":false}},{"type":"achievement","data":{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468","dateAchieved":1753289086,"isPinned":false}}],"lastModificationDate":1791093093,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":5},"favoriteCollectible":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":1028591,"name":"Лысенко Андрей","nickname":null,"description":"Автоматизация AI-процессов. Стабилизация инференса промпт-техниками.","uri":"","avatar":{"type":"image","data":{"uuid":"ea553f55-6437-567a-a50d-f077ccda4741","width":1024,"height":1024,"size":292650,"type":"png","color":"202f45","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAACAAC/8QAIxAAAgEDBAEFAAAAAAAAAAAAAQIDBRESAAYHIRMECEJRcf/EABUBAQEAAAAAAAAAAAAAAAAAAAAE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAIDIjEEEVH/2gAMAwEAAhEDEQA/AFHy97i+ZNkc+DY1K2070TyenSmwpS5JHq3khVpSr/MRsWvgRjj2Dfq7jyjRM9+96JbPVWxFchLIrEWJAJH1qEqJo42ZXZFLJfEkdj80BrQH/9k="}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468"}],"collectibles":[{"type":"achievement","data":{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4412555,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4412555","dateAchieved":1753342427,"isPinned":false}},{"type":"achievement","data":{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":788468,"userId":1028591,"count":0,"shareImage":"https://api.vc.ru/achievements/share/788468","dateAchieved":1753289086,"isPinned":false}}],"lastModificationDate":1791093093,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":5},"favoriteCollectible":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"donations":{"amount":0,"isDonated":false},"gifts":[],"isBlur":false}}],"cursor":"PuR2GsZKFTvhhGlSA47m6NrVS6IzQAa09I6wtbz/zlbeaPDONLWtzkVZ42lMl24=","isAnonymized":true}};