Контракт синтеза связанных таблиц

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; статус публикации и приёмки записан отдельно в статусе кандидата.