@@ -393,9 +423,11 @@
}
function renderState(message = "") {
document.querySelectorAll("[data-view]").forEach(b => b.setAttribute("aria-pressed",String(b.dataset.view === state.view)));
- document.getElementById("upstream-legend").textContent = state.view === "flow" ? "Синий: источники" : "Синий: связанные родители";
- document.getElementById("downstream-legend").textContent = state.view === "flow" ? "Зеленый: потребители" : "Зеленый: связанные потомки";
- document.getElementById("view-hint").textContent = state.view === "flow" ? "Стрелка: откуда загрузчик читает данные и куда записывает результат. Пунктир — ожидается по ТЗ. Календарь генерируется отдельно." : "Стрелка: от родительской строки к связанным строкам. Например, от бронирования к билетам. Это не порядок загрузки и не физические FK.";
+ document.getElementById("upstream-legend").textContent = state.view === "flow" ? "Источники" : "Связанные родители";
+ document.getElementById("downstream-legend").textContent = state.view === "flow" ? "Потребители" : "Связанные потомки";
+ document.getElementById("ready-edge-legend").textContent = state.view === "flow" ? "Готовая загрузка" : "Связь по ключам";
+ document.getElementById("expected-edge-legend").textContent = state.view === "flow" ? "Загрузка по ТЗ" : "Связь с учебной заглушкой";
+ document.getElementById("view-hint").textContent = state.view === "flow" ? "Стрелка: откуда загрузчик читает данные и куда записывает результат. Календарь генерируется отдельно." : "Стрелка: от родительской строки к связанным строкам. Например, от бронирования к билетам. Это не порядок загрузки и не физические FK.";
if (state.selected?.type === "node") renderNodeCard(nodeById.get(state.selected.id));
else if (state.selected?.type === "edge") renderEdgeCard(edgeById.get(state.selected.id));
else renderIntro(message);
diff --git a/docs/design/db_schema.md b/docs/design/db_schema.md
index 7accb56..241e755 100644
--- a/docs/design/db_schema.md
+++ b/docs/design/db_schema.md
@@ -60,7 +60,9 @@ Docker для карты не нужны. Храните HTML рядом с ос
Для связи сегмента с талоном понадобятся оба поля ключа, иначе талон
первого рейса можно ошибочно присоединить ко второму.
-## Как устроен поток целиком?
+
+
+## Путь данных от источника до витрин
Оставьте билет выбранным и переключитесь на **"Поток данных"**.
Таблицы останутся на местах, выбранный билет сохранится; теперь стрелки
@@ -86,7 +88,9 @@ Docker для карты не нужны. Храните HTML рядом с ос
проверки календаря. Порядок выполнения смотрите по ссылке **"DAG · порядок задач"**
в карточке. Поля, SQL и проверки раскрываются там же, после выбора таблицы.
-## Как собирается факт?
+
+
+## Сборка факта продаж
Откройте [dds.fact_flight_sales](architecture-map.html#node=dds.fact_flight_sales).
В нашем примере в нем будет **три строки**, по одной на каждый сегмент.
@@ -111,7 +115,9 @@ SK здесь обозначены словами: конкретные числ
Нет талона - сегмент сохраняется, `seat_no` остается `NULL`, `is_boarded = false`.
В этом стенде признак посадки означает именно наличие талона.
-### Откуда берутся два аэропорта
+
+
+### Аэропорты вылета и прилета
В карточке факта откройте связи **"Коды двух аэропортов"**,
**"Аэропорт вылета"** и **"Аэропорт прилета"**:
@@ -128,7 +134,9 @@ SK здесь обозначены словами: конкретные числ
SQL использует `LEFT JOIN`, поэтому строка с таким пропуском сохранится;
допустимость пропуска отдельно оценивает [DQ факта](../../sql/dds/fact_flight_sales_dq.sql).
-### Какая версия маршрута нужна рейсу
+
+
+### Версия маршрута на дату рейса
Связь **"Версия на дату рейса"** ведет к `dds.dim_routes` по `route_bk = route_no`
и дате `scheduled_departure::DATE`. Дата должна попасть в полуоткрытый
@@ -139,7 +147,9 @@ SQL использует `LEFT JOIN`, поэтому строка с таким
поиска `airplane_sk` в `dim_airplanes`. Поэтому одного заполненного справочника
моделей недостаточно: без подходящей версии маршрута `airplane_sk` не появится.
-## Что кормит витрины?
+
+
+## Агрегация фактов в витрине продаж
Перейдите к [dm.sales_report](architecture-map.html#node=dm.sales_report).
Зерно меняется: день вылета × два аэропорта × класс обслуживания.
diff --git a/docs/design/reading_the_pipeline.md b/docs/design/reading_the_pipeline.md
index 93bb085..01db211 100644
--- a/docs/design/reading_the_pipeline.md
+++ b/docs/design/reading_the_pipeline.md
@@ -43,8 +43,9 @@
11. `LEFT JOIN dds.dim_passengers` даёт `passenger_sk`.
12. `LEFT JOIN ods.boarding_passes` даёт `seat_no` и признак `is_boarded`.
-Так список связей превращается в [схему «Как собирается факт?»](db_schema.md#как-собирается-факт):
-четыре обязательных входа рисуются сплошными стрелками, а остальные пунктирными.
+Этот путь разобран в разделе [«Сборка факта продаж»](db_schema.md#сборка-факта-продаж).
+На карте сплошные стрелки показывают готовые загрузки, пунктирные — ожидаемые
+по ТЗ. Тип соединения и поведение при отсутствии строки описаны в карточке связи.
## Как проверить свой слой