Appearance
Справочные данные: статус и план пополнения
Дата: 2026-06-21 Контекст: Итог по справочнику автомобилей после раската DEP-58 (импорт carsbase JSON) + DEP-59 (экспозиция новых полей через API). Используется как точка отсчёта при планировании следующих шагов по обогащению.
TL;DR
- ✅ Марки и модели обогащены: 423 марки + 4 847 моделей получили
cyrillic_name, страну, годы выпуска. Покрытие хорошее, кроме pre-existing «исторических» записей и редких ручных добавлений. - ⚠️ Поколения — слабое место: 42% моделей не имеют ни одного поколения, у 100% генерационных записей пусто поле
code(шасси), у 99% пустоsteering. - ⚠️ Модификации (двигатели) — массив с прошлого импорта (30k), не трогали.
- 🎯 Главный пробел: поколения для китайских брендов и российской классики (Лада, ГАЗ, УАЗ, Москвич) почти полностью отсутствуют.
1. Сводка по таблицам
Car hierarchy (YMMM)
| Таблица | Dev | Prod | Заполненность ключевых полей |
|---|---|---|---|
car_makes | 447 | 438 | 423 cyrillic_name • 420 country • 3 is_popular |
car_models | 8 310 | 8 303 | 4 847 cyrillic_name • 4 728 class • 4 847 year_from |
car_generations | 7 213 | 7 207 | 7 157 year_from • 4 184 year_to • 0 code • 6 steering |
car_modifications | 30 066 | 30 066 | (с прошлого импорта, не трогали) |
Разница dev/prod (+9 makes / +7 models / +6 gens в dev) — исторический test-data, не критично.
Geo + categories (не трогали)
| Таблица | Кол-во |
|---|---|
regions | 2 |
cities | 3 |
districts | 31 |
metro_stations | 104 |
categories | 203 |
2. Марки — детально
Страны производства (топ-10)
| Страна | Марок |
|---|---|
| 🇨🇳 Китай | 130 |
| 🇺🇸 США | 55 |
| 🇬🇧 Великобритания | 44 |
| 🇷🇺 Россия | 41 |
| 🇩🇪 Германия | 27 |
| 🇮🇹 Италия | 24 |
| 🇫🇷 Франция | 18 |
| 🇯🇵 Япония | 14 |
| 🇰🇷 Южная Корея | 8 |
| 🇮🇳 Индия | 6 |
Всего 38 различных стран. Поле is_popular помечено только у 3 марок (импортёр намеренно не перезаписывает is_popular у существующих, чтобы не ломать админскую разметку — JSON указывал 30 popular, но эти 30 не были применены к pre-existing рядам).
Что можно сделать: при следующем upsert'е либо разрешить перезапись is_popular через флаг --overwrite-popular, либо разметить вручную через админку.
Марки без cyrillic_name
24 марки (из 447 dev) импортированы до DEP-58 и не нашлись в carsbase JSON. Это, как правило, тестовые / устаревшие записи (например, name="21" slug="12"). Имеет смысл провести аудит и удалить мусор либо вручную проставить кириллицу.
3. Модели — детально
Распределение по классу EuroNCAP
| Class | Описание | Моделей |
|---|---|---|
| C | Medium | 929 |
| D | Large | 756 |
| S | Sport | 593 |
| B | Small | 554 |
| E | Executive | 479 |
| J | SUV / Crossover | 477 |
| M | Multi-purpose | 452 |
| A | Mini | 257 |
| F | Luxury | 231 |
| null | — | 3 582 (43%, в основном pre-existing импорт) |
Годы выпуска
- Самая старая модель: 1904
- Самая свежая: 2027
- Средний срок производства: ~10 лет
Модели без cyrillic_name
3 463 модели (из 8 310 dev) — pre-existing импорт. Источника на их кириллицу пока нет (carsbase их не содержит). Решения:
- Удалить устаревшие записи, оставив только carsbase + ручные.
- Wikidata SPARQL — для западных моделей можно вытащить русские лейблы.
- Ручная разметка через админку — для популярных моделей.
4. Поколения — детально
Покрытие
| Метрика | Значение |
|---|---|
| Моделей с ≥1 поколением | 4 801 (58%) |
| Моделей БЕЗ поколений | 3 509 (42%) |
| Всего поколений | 7 213 |
| Среднее поколений на модель | 1.50 |
| Максимум | 16 (один редкий случай) |
Распределение поколений на модель
| Поколений | Моделей |
|---|---|
| 1 | 3 536 |
| 2 | 767 |
| 3 | 212 |
| 4 | 128 |
| 5 | 71 |
| 6 | 36 |
| 7 | 23 |
| 8 | 12 |
| 9 | 7 |
| 10 | 4 |
| 11+ | 5 |
Заполненность полей car_generations
| Поле | Заполнено | Из 7 213 |
|---|---|---|
year_from | 7 157 | 99% |
year_to | 4 184 | 58% (для текущих моделей пусто = «по настоящее время») |
name | 7 213 | 100% (NOT NULL) |
code (шасси, например E46, W124) | 0 | 0% |
steering (LHD/RHD) | 6 | <0.1% |
code пуст по всей таблице — это лютая дыра для каталога автозапчастей, где деталь обычно подходит на конкретное шасси, а не на маркетинговое имя модели. Поле в схеме есть, наполнения нет.
Где главные пробелы — топ-15 марок без поколений
| Марка | Страна | Моделей без поколений | Всего моделей |
|---|---|---|---|
| Тойота (Toyota) | Япония | 144 | 276 |
| Мерседес-Бенц | Германия | 106 | 519 |
| Ниссан (Nissan) | Япония | 94 | 214 |
| Джили (Geely) | Китай | 83 | 89 |
| Чери (Chery) | Китай | 70 | 70 |
| Хонда (Honda) | Япония | 69 | 160 |
| Мазда (Mazda) | Япония | 69 | 133 |
| Митсубиси (Mitsubishi) | Япония | 66 | 141 |
| Шевроле (Chevrolet) | США | 63 | 227 |
| Чанган (Changan) | Китай | 62 | 62 |
| БИД (BYD) | Китай | 62 | 62 |
| Форд (Ford) | США | 57 | 209 |
| Хендэ (Hyundai) | Южная Корея | 52 | 133 |
| Фольксваген (VW) | Германия | 50 | 212 |
| ДонгФенг (Dongfeng) | Китай | 50 | 50 |
Паттерн: китайские бренды (Chery, Changan, BYD, Dongfeng, Geely, Jetour, Haval, GAC и др.) — поколений почти нет вообще, потому что они добавлены в БД позже исходного TecDoc-снимка. Это критично для российского рынка — китайские марки растут быстрее всех.
Российские бренды — почти все без поколений
| Бренд | Моделей | Без поколений |
|---|---|---|
| Лада | 50 | 38 |
| Москвич | 32 | 32 (100%) |
| ГАЗ | 29 | 29 (100%) |
| УАЗ | 10 | 10 (100%) |
| ТагАЗ | 7 | 7 (100%) |
| ИЖ | 7 | 7 (100%) |
| Аурус | 4 | 2 |
| Маруся | 2 | 0 |
| (остальные 33 марки) | в среднем 1–4 | почти все 100% |
Это особенно болезненно — Лада, ГАЗ, УАЗ массовые в РФ, по ним должен быть полный YMMM-каскад.
5. Что можно/нужно сделать для пополнения поколений
Перечисление от самого простого/быстрого к долгосрочно правильному.
5.1. Синтетическое поколение «по умолчанию» (быстрая разморозка UX) ⚡
Для каждой модели без поколений вставить одно поколение, склеенное из car_models.year_from / year_to:
sql
INSERT INTO car_generations (model_id, name, year_from, year_to)
SELECT m.id,
COALESCE(m.cyrillic_name, m.name) || ' ' || COALESCE(m.year_from::text, '') || '–' || COALESCE(m.year_to::text, 'наст.'),
m.year_from, m.year_to
FROM car_models m
WHERE NOT EXISTS (SELECT 1 FROM car_generations g WHERE g.model_id = m.id);Плюсы:
- Разблокирует выбор поколения в UI для всех 3 509 моделей за секунды.
- Продавец сможет указать совместимость хотя бы на уровне «модель».
- Реверсимо: можно потом удалить и заменить настоящими данными.
Минусы:
- Не даёт шасси-код (
code). - Один синтетический gen на модель — продавец не отличит дорестайл от рестайла.
Рекомендация: делать сразу как app:fill-synthetic-generations (новая команда + DEP). Параметр --dry-run, --only-make=<slug>, идемпотентность.
5.2. Wikidata SPARQL — для западных брендов 🟢
Wikidata держит структурированные данные по моделям и поколениям, в т.ч. русские лейблы. Запрос на одну марку:
sparql
SELECT ?gen ?genLabel ?yearFrom ?yearTo ?code WHERE {
?model wdt:P31 wd:Q3231690 . # instance of automobile model
?model wdt:P176 wd:Q9584 . # manufacturer = Toyota (пример)
?gen wdt:P31 wd:Q21162571 . # instance of car generation
?gen wdt:P361 ?model . # part of <model>
OPTIONAL { ?gen wdt:P571 ?yearFrom } # inception
OPTIONAL { ?gen wdt:P576 ?yearTo } # dissolved/discontinued
OPTIONAL { ?gen wdt:P528 ?code } # catalogue code
SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en". }
}Плюсы:
- Бесплатно, открытый источник, юридически чисто.
- Покрытие неплохое: Toyota / Honda / BMW / Mercedes / VW / Ford — почти все поколения.
- Иногда есть
code(W124, E46, AE86 и т.п.) — точно то что нужно.
Минусы:
- Покрытие неравномерное: китайские/российские бренды размечены плохо.
- Лейблы поколений в Wikidata часто маркетинговые, без чёткой даты.
- Нужно матчить по slug/название модели — потенциальный merge-conflict.
Рекомендация: написать команду app:import-wikidata-generations --make=<slug> с явным выбором марки и --dry-run. Запускать поочерёдно для топ-марок, проверять глазами через админку.
5.3. carsbase / drom / avto.ru — скрейпинг поколений 🟡
У этих сайтов есть пагинаты по поколениям с годами и шасси. Но:
- ToS обычно запрещают массовый скрейпинг.
- Сайты ставят анти-бот меры (Cloudflare + JS challenge), а сети CF заблокированы РКН → нужен residential-прокси.
- Долгий и хрупкий код.
Рекомендация: не делать. Использовать только как ad-hoc источник при ручной разметке через админку.
5.4. Ручная разметка через админку 🟢 (для русских и популярных)
Уже есть полный CRUD: CreateCarGenerationAction, UpdateCarGenerationAction, DeleteCarGenerationAction.
Сценарий:
- По 41 российской марке (Лада, ГАЗ, УАЗ, Москвич, ИЖ + остальные мелкие) — ручная разметка через админку. Объём небольшой: ~100–150 поколений всего.
- Топ-10 китайских (Chery, BYD, Changan, Geely, Haval, Jetour, GAC, Dongfeng, Li Auto, NIO) — основные модели, по 1–3 поколения каждая, ~50 строк.
Плюсы: контроль качества, явные шасси-коды где есть. Минусы: трудозатраты ~10–20 человеко-часов.
5.5. TecDoc — долгосрочно правильное решение 🥇
Коммерческий каталог TecDoc даёт полную YMMM-цепочку + шасси-коды + двигатели + OEM-номера. Существует план интеграции от 2026-02-14.
Плюсы: золотой стандарт, всё в одном источнике, юридически чисто. Минусы: платная подписка (от ~€500/мес), сложная инициальная интеграция, специфический формат данных.
Рекомендация: заложить в roadmap, но не блокировать MVP. До TecDoc'а — комбинация 5.1 + 5.2 + 5.4 закрывает 90% реальных кейсов.
6. Поле code (шасси) — отдельный вопрос
В таблице car_generations есть колонка code VARCHAR(50), но она пуста на всех 7 213 рядах. Что туда писать:
- BMW:
E30,E36,E46,E90,F30,G20 - Mercedes:
W124,W210,W211,W212 - Toyota:
AE86,JZA80,XV70 - VW:
A4,A5,MQB - Lada:
2101,2107,2110,21214
Без этого магазин запчастей едва ли может корректно матчить совместимость — продавцы по факту думают шасси, а не маркетинговыми именами.
План:
- Wikidata
wdt:P528(catalogue code) — где есть, забрать. - Ручная разметка через админку для топ-марок.
- TecDoc когда появится.
7. Что ещё стоит подтянуть
| Поле | Где | Сейчас | Куда стремимся |
|---|---|---|---|
car_makes.is_popular | 3 из 447 | JSON указывал 30 — надо донастроить через админку или флаг --overwrite-popular в импорте | |
car_makes.logo_url | почти везде null | Залить SVG/PNG лого через S3, по мере хождения по каталогу | |
car_generations.steering | 6 из 7 213 | Для японских/китайских поколений — RHD/LHD важно (правый руль ≠ левый по запчастям). Из Wikidata P3157 | |
car_modifications.engine_volume / fuel_type / power / transmission | старый импорт | Покрытие проверить отдельно — данные были, но не аудитированы |
8. Рекомендованная последовательность работ
| # | Что | Ожидаемый объём | Приоритет |
|---|---|---|---|
| 1 | Команда app:fill-synthetic-generations (5.1) + раскат на dev/prod | 1–2 ч | Высокий — разблокирует UX для 3 509 моделей |
| 2 | Аудит и удаление мусорных pre-existing записей (тестовые марки/модели без cyrillic_name) | 2–3 ч + ручная сверка | Высокий — чистит выдачу |
| 3 | Wikidata-импортер app:import-wikidata-generations --make=... (5.2) | 1 день | Средний — даёт правильные поколения для топ-20 западных марок |
| 4 | Ручная разметка российских + китайских топ-марок через админку (5.4) | 10–20 ч | Средний — критично для русского рынка |
| 5 | Бэкфилл is_popular + lazy-загрузка логотипов | 0.5 дня | Низкий |
| 6 | Бэкфилл code шасси через Wikidata + ручную правку | 1–2 дня | Высокий долгосрочно — без шасси-кодов магазин запчастей не работает |
| 7 | TecDoc интеграция (см. plan от 2026-02-14) | Большой проект | Низкий MVP / Высокий после product/market fit |
Приложения
- DEP-58 MR !144 — миграция + JSON-импортер
- DEP-59 MR !146 — toArray + спека
- DEP-59 OpenAPI MR !6 — обновлённые схемы CarMake/CarModel
- DEV-434 — фронт-тикет под UI
- TecDoc план — стратегия по платному источнику
- Car hierarchy frontend guide — текущий контракт API
- Frontend API reference — Cars (YMMM Cascade) — актуальные поля