MySQL эффективно разрешает циклическую зависимость во внешних ключах
Я изучаю MySQL, и наткнулся на упражнение по созданию базы данных для отслеживания производственных деталей с помощью сканирования штрих-кода. Для детали необходимо знать, на какой стадии сканирования она находится, и на какой стадии сканирования. Окончательное сканирование определит, была ли это хорошая или плохая часть.
Кажется, что это проблема циклической зависимости и ссылочной целостности. Мой вопрос: если бы не предложенный мной вариант A или вариант B, какой был бы лучший способ устранить такую зависимость? Я хотел бы услышать, что лучше всего оптимизирует скорость запроса, который определяет, сколько хороших частей основано на состоянии частей и их завершении.
(PartStateId ссылается на таблицу с именем состояния. Возможные значения: Good, Bad, NotDone).
Вариант А:
Детали: PartId int, CurrentPartStateId int, метка времени CreatedTime, метка времени FinishedTime, varchar штрих-кода, FOREIGN KEY (CurrentPartStateId) ССЫЛКИ Детали состояния (PartStateId),
сканы: ScanId int, PartId int, PartStateId int, Временная метка ScanTime, ScanParams varchar, ИНОСТРАННЫЙ КЛЮЧ (PartStateId) ССЫЛКИ Partstates (PartStateId), ЗАРУБЕЖНЫЙ КЛЮЧ (PartId) Ссылки Ссылки (PartId),
Pro:
- Быстрые запросы на запчасти текущая информация.
Против:
- Данные не нормализованы, детали (CreatedTime, FinishedTime, CurrentPartStateId) все дублируются в таблице сканирования.
Вариант Б:
Части: PartId int, CreatedScan int, FinishedScan int, Штрих-код VARCHAR, ИНОСТРАННЫЙ КЛЮЧ (CreatedScan) ССЫЛКИ Сканирование (PartStateId), ИНОСТРАННЫЙ КЛЮЧ (FinishedScan) ССЫЛКИ Сканирование (PartStateId),
сканы: ScanId int, PartId int, PartStateId int, Временная метка ScanTime, ScanParams varchar, ИНОСТРАННЫЙ КЛЮЧ (PartStateId) ССЫЛКИ Partstates (PartStateId), ЗАРУБЕЖНЫЙ КЛЮЧ (PartId) Ссылки Ссылки (PartId),
Pro:
- Данные более нормализованы, время создания / окончания детали не дублируется.
Против:
- Parts.CreatedScan fk должен иметь значение NULL для вставки записи.
РЕДАКТИРОВАТЬ:
Вариант С:
Части: PartId int, FinishedScan int nullable, Штрих-код VARCHAR, ИНОСТРАННЫЙ КЛЮЧ (FinishedScan) ССЫЛКИ Сканирование (PartStateId),
сканы: ScanId int, PartId int, PartStateId int, Временная метка ScanTime, ScanParams varchar, ИНОСТРАННЫЙ КЛЮЧ (PartStateId) ССЫЛКИ Partstates (PartStateId), ЗАРУБЕЖНЫЙ КЛЮЧ (PartId) Ссылки Ссылки (PartId),