Контракт синтеза связанных таблиц¶
English · Русский
Профиль связи — свидетельство, а не доказанный бизнес-факт. Разделяйте объявленные PK/FK, наблюдаемые агрегаты и гипотезы advisor. Confidence помогает review, но не даёт права автоматически принять связь.
Что гарантирует детерминированное ядро¶
- Identifiers создаются заново; карта source ID → output ID не сохраняется.
- Foreign keys указывают на сгенерированные parent keys; nullable child references сохраняют null.
- One-to-one capacity считается по ненулевым ссылкам.
- Явные ограничения и бизнес-правила валидируются; rejected relationships/constraints не исполняются.
- Identifier pool задаёт число синтетических ключей и циклирование, а не распределение исходных ID.
Что не следует выводить из результата¶
FK coverage не доказывает бизнес-смысл связи. Round-robin назначение не сохраняет fan-out, частоты или корреляции источника. Uniform numeric sampling не является полным моделированием распределения. Arbitrary interacting rules не решаются универсальным solver.
Если active aggregate mapping зависит от rejected связи, исправьте spec: молчаливое игнорирование не разрешено. При нехватке parent capacity, конфликте уникальности, правил или temporal changes генерация останавливается, а не выдаёт частичный доверенный набор.
Проверьте имена parent/child полей, статус связей, cardinality, nullable и число строк до генерации. После неё прочитайте relationships и constraints в validation_report, затем business_validation_report. Практика: связанные таблицы.
Явные сценарии связей (1.7.0rc1)¶
В проверенную спецификацию DatasetSpec можно добавить relational_scenarios.
Декларация задаёт parent_entity, parent_field, child_entity, child_field,
точное orphan_count (по умолчанию 0) и необязательное fanout_counts.
Это независимо заданная синтетическая модель, а не гистограмма исходных данных
и не сопоставление исходных строк. Полный синтетический пример
можно передать обычной команде генерации из спецификации.
При трёх родительских строках, шести дочерних строках без пустых ключей,
orphan_count: 2 и fanout_counts: [3, 1, 0] генератор создаёт три ссылки
на родителя с порядковым номером 0, одну на родителя 1, ни одной на родителя 2
и два разных синтетических ключа без родителя. Номера относятся к сгенерированным
строкам. Пустые дочерние ключи сохраняются и не входят в квоту. Сумма распределения
и отсутствующих ссылок должна совпасть с фактическим числом непустых ключей;
случайная доля null может сделать конкретный запрос невыполнимым.
Положительное orphan_count требует режима mixed или negative и
invalid_ratio: 0. Остальные поля сначала генерируются валидными; случайная
инъекция ошибок вне сценария не применяется. Без деклараций прежняя генерация
и воспроизводимость сохраняются. Для выбора дочерних позиций используется
отдельный детерминированный генератор случайных чисел. Повтор требует той же
упорядоченной эффективной спецификации, seed и версии алгоритма.
Поддержаны одинаковые типы integer/string и одна однозначная активная связь. Для one-to-one и дочернего первичного ключа требуется уникальность. Явное распределение требует разных непустых родительских ключей для положительных квот. Конфликтующие записи в ключи, отрицательная инъекция бизнес-правил, несовместимые бизнес-проверки внешнего ключа и общая ненулевая доля ошибок отклоняются. Сценарий не меняет размеры таблиц: после count-переопределений и load-расширения квоты всё ещё должны совпасть. Действуют пределы 1 000 сценариев, миллион родительских позиций на декларацию и общие лимиты строк, ячеек, байтов, работы и времени.
Перед изменением проверяется полный снимок сгенерированных ключей. Ошибка или устаревший план не публикует частичный набор. После генерации и перед экспортом обязательны сверка сценариев, схемы, ограничений, совместимых бизнес-правил и приватности. Отключение необязательных настроек отчёта эти проверки не отменяет.
Отчёт добавляет relational_scenarios: хеш эффективной спецификации spec_sha256,
хеш размеров sizes_sha256, общее expectations_met и наблюдения только в виде
счётчиков — заданное/фактическое число отсутствующих ссылок, распределение,
число непустых и пустых ключей. Разность непустых ключей и отсутствующих ссылок
даёт число разрешённых ссылок. Неоднозначное распределение при повторяющихся
родительских ключах без явной квоты остаётся null.
Ожидаемые нарушения всё равно делают обычную проверку и validation_valid
манифеста ложными. CLI возвращает прежний код невалидного результата. Совпадение
квот не означает валидность набора, точность относительно источника или одобрение
данных.
CSV, JSON и Parquet допускают такие явно заданные невалидные наборы. Экспорт SQL PostgreSQL по-прежнему требует валидности и отклоняет отсутствующие ссылки до публикации DDL с внешними ключами. Валидное распределение допускает SQL-экспорт. Эти изменения входят в кандидат 1.7.0rc1; статус публикации и приёмки записан отдельно в статусе кандидата.