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),

0 ответов

Другие вопросы по тегам