惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 三生石上(FineUI控件)
Martin Fowler
Martin Fowler
月光博客
月光博客
AI
AI
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
CXSECURITY Database RSS Feed - CXSecurity.com
WordPress大学
WordPress大学
GbyAI
GbyAI
L
Lohrmann on Cybersecurity
O
OpenAI News
Schneier on Security
Schneier on Security
P
Palo Alto Networks Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Troy Hunt's Blog
V2EX - 技术
V2EX - 技术
W
WeLiveSecurity
L
LINUX DO - 最新话题
人人都是产品经理
人人都是产品经理
S
Security Affairs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
A
Arctic Wolf
Recorded Future
Recorded Future
Microsoft Security Blog
Microsoft Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
G
GRAHAM CLULEY
N
Netflix TechBlog - Medium
TaoSecurity Blog
TaoSecurity Blog
C
Check Point Blog
Scott Helme
Scott Helme
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Apple Machine Learning Research
Apple Machine Learning Research
PCI Perspectives
PCI Perspectives
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Vercel News
Vercel News
The Hacker News
The Hacker News
Y
Y Combinator Blog
Latest news
Latest news
SecWiki News
SecWiki News
Hugging Face - Blog
Hugging Face - Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Google Online Security Blog
Google Online Security Blog
Webroot Blog
Webroot Blog
Google DeepMind News
Google DeepMind News
Recent Commits to openclaw:main
Recent Commits to openclaw:main
C
Cisco Blogs
博客园_首页
H
Hackread – Cybersecurity News, Data Breaches, AI and More
宝玉的分享
宝玉的分享
L
LINUX DO - 热门话题

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
7 баз, 30 метрик, 150 мер — и один дашборд
Sidorel (Лем · 2026-05-20 · via Все публикации подряд на Хабре

Уровень сложностиСредний

Время на прочтение6 мин

Охват и читатели602

Кейс

Привет, Хабр!

Мы — Александр Погудин и Елена Сидорова, BI‑разработчики в Лемана Тех.​ Однажды к нам пришёл заказчик и попросил разработать дашборд, который будет показывать все ключевые метрики воронки продаж на одной странице.

Можно сделать «в лоб», но это семь таблиц фактов, 150+ мер и каша под капотом. И это только на старте проекта, до того, как заказчик попросит добавить ещё 30 метрик...

В статье расскажем, как мы обошлись одной EAV‑таблицей фактов и несколькими универсальными мерами, чтобы собрать на одном листе стратегического дашборда десятки метрик для C‑level.

Запрос

Желание заказчика довольно естественно. Хочется легко и непринуждённо зайти в один дашборд и увидеть максимальное количество показателей, которое позволит понять текущий пульс направления бизнеса, быстрее реагировать на изменения и видеть как сильные, так и уязвимые места, куда нужно направить больше внимания.

Боль заказчика понятна, приборную панель надо делать.

При этом не требуется глубокой детализации и хитрых срезов. Просто по каждому шагу воронки продаж одна цифра, которая говорит бизнесу: ОК или НЕ ОК.
А для более точечного изучения вопроса идти к конкретной команде, у которой есть свои настроенные дашборды с подробностями и деталями.

Оперативное реагирование на изменения потребностей рынка — один из важнейших критериев успешной работы, поэтому мы потёрли ладошками и принялись изучать ТЗ.

Перечень метрик дали примерно такой:

Тридцать метрик. И для каждой — факт, факт предыдущего года, дельта, план, отклонение от плана.

Ну ок. Начали распутывать метрики и раскладывать по источникам. Составляем схему, чтобы окинуть взглядом поле работ:

Получается макаронный монстр. Семь разных баз. Какие-то метрики и вовсе собираются одновременно из нескольких баз.

Уже на этом этапе понятно, что надо активно думать про масштабируемость и выбрать стратегию.

Как выкрутились?

Сразу прыгаем к результату: решение было найдено.

Получился ли треш в модели данных? Неа, вот таблица фактов:

Получился ли мрак в мерах? Неа, вот меры. Пара технических мер, одна для факта, вторая для факта прошлого года, третья для дельты, и для плана и отклонения от плана было бы ещё две.

Как же это получилось?

Ответ: EAV!

EAV

Суть заключается в следующем: EAV (Entity-Attribute-Value) — это в общем случае такая гибкая модель данных, в которой атрибуты какой-то сущности развёрнуты по вертикали.

(Информация взята из статьи https://notes.kiriha.ru/db/rdb/eav/)

(Информация взята из статьи https://notes.kiriha.ru/db/rdb/eav/)

В нашем случае за сущность принимаем дату, за атрибуты — метрики. Например:

Table 1: Традиционная модель

Table 1: Традиционная модель

В EAV-модели мы транспонируем таблицу:

Table 2: EAV-модель

Table 2: EAV-модель

И теперь, чтобы взять динамику по конкретной метрике, надо лишь дополнительно применить фильтр по названию метрики:

Table 3: Фильтр по метрике

Table 3: Фильтр по метрике

К чему это приводит?

Плюс первый

Сколько бы мы метрик ни добавили, схема таблицы не меняется. Это будет всегда три колонки.

Можно написать три меры — для факта, факта прошлого года, дельты — и управлять тем, для какой метрики это применяется, при помощи фильтра по metric_name в самом визуальном элементе.

Плюс второй

Мало того — количество баз на нас теперь тоже не сказывается. Результат SQL к каждому источнику будет возвращать одинаковую структуру, и все таблицы можно будет соединить между собой в одну таблицу фактов на стороне PowerQuery.

Если одна метрика собирается из нескольких источников — так же на стороне PowerQuery можно заджойнить компоненты в одну таблицу, посчитать метрику и результат в той же структуре EAV присоединить к общей таблице фактов.

Плюс третий

Такая модель позволяет, например, сделать дополнительную широкую таблицу-справочник по всем мерам:

Table 4: Справочник метрик

Table 4: Справочник метрик

Поля из этой таблицы, используя тот же самый фильтр по metric_name, можно выводить, например, в подсказки и описания визуальных элементов, в легенду, на инфостраничку.

С таблицей разобрались, а что с мерами?

Поскольку наша таблица фактов состоит из столбцов «дата — метрика — значение метрики» и все метрики уже предрассчитаны, осталось сделать меры для факта, факта предыдущего года, дельты, план, отклонение от плана.

Подготовительные меры

Итак, сначала мы считаем пререквизиты для мер:

1. Выводим инфо по значению метрики

000 CurrentValue = MAX(fact_report[metric_value])
— это даст нам максимальное значение из столбца с предрассчитанными метриками.

2. Выводим инфо по названию метрики

000 MetricFact = SELECTEDVALUE(fact_report[metric_name])

Форматирование метрик

Затем мы поняли, что метрики могут быть в разных форматах — абсолюты, проценты, тысячи, десятичные числа и т. д.

И вот этот момент нужно задать изначально. Мы берём наши пререквизиты мер и по названию каждой меры задаём, в каком формате она должна выводиться:

KPI_3p_format =
VAR MaxValue = [000 CurrentValue]
VAR Metric = [000 MetricFact]
RETURN
SWITCH(
TRUE(),
Metric IN { "Срок_доставки_факт", "Срок_доставки_план" },
FORMAT(MaxValue, "#,##0.0 дней"),
Metric IN { "Визиты_все", "Визиты_органика", "Визиты_платный_трафик" },
FORMAT(MaxValue / 1000, "#,##0 тыс"),
Metric IN { "GMV_доставленный_3P", "GMV_оплаченный_3P", "Выручка_3P_аналитика" },
FORMAT(MaxValue / 1000000, "#,##0 млн"),
Metric IN { "Индекс_цен_1P", "Индекс_цен_3P" },
FORMAT(MaxValue, "#,##0.00"),
Metric IN { "Продавцы_3P", "Заказы_оплаченные_3P", "Товары_3P" },
FORMAT(MaxValue, "#,##0"),
Metric IN { "OTIF_3P", "OTIF_доставки_3P", "Доля_возвратного_GMV_3P" },
FORMAT(MaxValue, "0.0%"),
Metric IN { "Доля_визитов_с_добавлением_в_корзину_3P", "Доля_визитов_с_покупкой_3P"
           , "Доля_SKU_с_рейтингом_4_5_и_выше_3P" },
FORMAT(MaxValue, "0.00%"),
FORMAT(MaxValue, "#,##0.00")
)

Аналогично делаем для расчёта прошлого периода, но меняем переменную для расчёта значения на:

VAR MaxValue =
CALCULATE(
[000 CurrentValue],
SAMEPERIODLASTYEAR('Calendar'[Date])
)

Расчёт дельты

Итого у нас получилось 2 меры, которые задают нужный формат данных. Остаётся посчитать дельту:

KPI_3p_YoY =
VAR CurrentValue = [000 CurrentValue]
VAR PreviousValue =
CALCULATE(
[000 CurrentValue],
SAMEPERIODLASTYEAR('Calendar'[Date])
)
VAR result =
IF(
PreviousValue <> BLANK() && CurrentValue <> BLANK(),
CurrentValue / PreviousValue - 1,
BLANK()
)
RETURN
result

Такой набор позволяет нам не захламлять отчёт мерами и задавать только формат вывода метрики в мере, прописывая его так же, как мы сделали выше.

Чтобы менять метрики в визуальных элементах, нужно просто выбрать фильтром название нужной метрики =)

Что было с визуалом?

Заказчик принёс свой вариант визуала. Мы его посмотрели, подумали — и решили поискать дополнительные варианты.

Задача

Вывести воронку, то есть последовательные шаги по разным направлениям бизнеса слева направо. Каждый шаг раскрывается на внутренние, более мелкие шаги.

Использование Figma

Для создания фона мы решили подключить Figma. Чем, к слову, хороша Figma в качестве фона в отчёт?

  • Помогает избежать создания кучи разных визуальных блоков, созданных вручную через коробку в инструменте.

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

Вариантов было много. Вот часть из того, что мы пробовали и обсуждали:

Затем мы начали тестировать разные варианты KPI карточек, и вариантов тоже набралось достаточно много.

Варианты на светлом фоне

Варианты на светлом фоне

Варианты на тёмном

Варианты на тёмном

В итоге 7 баз, 30+ метрик и перспектива пары сотен мер превратились в

  1. одну EAV‑таблицу фактов;

  2. несколько универсальных мер;

  3. стратегический дашборд, который легко масштабируется.

Какие ограничения?

У этого подхода, разумеется, есть свои ограничения.

Ограничение 1. Идентичный набор разрезов

Все метрики должны иметь идентичный набор разрезов.

Если одни метрики будут иметь разрез по городам, другие — по магазинам, третьи — по типу клиента, то тут надо либо как-то наращивать количество названий метрик (например, gmv_store_1, gmv_store_2, gmv_store_100), либо добавлять новые колонки, которые будут применимы к одним метрикам, но не применимы к другим. Это быстро засорит модель данных и лишит её простоты и читаемости. В штатном же случае это таблица из трёх колонок: дата, метрика, значение — суть читается с ходу.

С другой стороны, дашборд-кокпит и не предполагает уйму фильтров, которые влияют на одни элементы и не влияют на другие. Это должна быть простейшая приборная панель со светофором, которая сообщает о наличии проблем у направления в целом. Для деталей есть специализированные дашборды.

Ограничение 2. Аддитивность метрик

Либо метрики должны быть аддитивны, либо дашборд будет выводить только один отчётный период (один день / одну неделю / один месяц) за раз.

Логичный минус любого агрегата. Таблица предполагает, что метрика уже посчитана для каждого отчётного периода. Если метрика неаддитивная (например, количество пользователей), то мы не сможем выводить её в сумме за несколько периодов (один посетитель в дату_1 и тот же посетитель в дату_2 не дают в сумме за два дня двух посетителей).

Соответственно, либо в дашборд можно выводить один отчётный период за раз, либо под капотом держать разрез до идентификаторов пользователей, что уже не ложится на модель.

Вывод

Для задач уровня «одним взглядом понять, всё ли нормально по ключевым этапам воронки и продаж», EAV‑подход оказался ровно тем, что нужно.

Вместо того чтобы плодить 150+ мер под каждый показатель и его варианты по периодам, мы обошлись одной EAV‑таблицей фактов и несколькими универсальными мерами, которые работают с любым набором метрик.
Приятный бонус в том, что EAV хорошо переживает изменения: можно добавлять новые метрики и подтягивать новые источники без изменения модели данных и дополнительных расчётов в мерах.
Ещё один плюс — возможность навесить богатый справочник метрик и использовать его в подсказках и описаниях визуалов, чтобы C‑level видел не только цифру, но и контекст: как она считается и за что отвечает.

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