MySQL эффективно разрешает циклическую зависимость во внешних ключах - PullRequest
0 голосов
/ 22 января 2019

Я изучаю MySQL и наткнулся на упражнение по созданию базы данных для отслеживания производственных деталей по результатам сканирования штрих-кода.Для детали необходимо знать, как выполняется сканирование создания и как завершать сканирование.Окончательное сканирование определит, была ли это хорошая или плохая часть.

Похоже, что это проблема циклической зависимости и ссылочной целостности.Мой вопрос: если бы не мой предложенный вариант A или вариант B, какой был бы лучший способ устранить такую ​​зависимость?Я хотел бы услышать, что лучше всего оптимизирует скорость запроса, который определяет, сколько хороших частей основано на состоянии частей и их завершении.

(PartStateId ссылается на таблицу с именем состояния. Возможные значения: Good, Bad, NotDone).

Опция A:

Parts:
  PartId int,
  CurrentPartStateId int,
  CreatedTime timestamp,
  FinishedTime timestamp,
  Barcode varchar,
  FOREIGN KEY (CurrentPartStateId) REFERENCES Partstates(PartStateId),
Scans:
  ScanId int,
  PartId int,
  PartStateId int,
  ScanTime timestamp,
  ScanParams varchar,
  FOREIGN KEY (PartStateId) REFERENCES Partstates(PartStateId),
  FOREIGN KEY (PartId) REFERENCES Parts(PartId),

Pro:

  • Быстрые запросы по текущей информации о деталях.

Con:

  • Данные не нормализованы, детали (CreatedTime, FinishedTime, CurrentPartStateId) вседублируются в таблице сканирования.

Опция B:

Parts:
  PartId int,
  CreatedScan int,
  FinishedScan int,
  Barcode varchar,
  FOREIGN KEY (CreatedScan) REFERENCES Scans(PartStateId),
  FOREIGN KEY (FinishedScan) REFERENCES Scans(PartStateId),
Scans:
  ScanId int,
  PartId int,
  PartStateId int,
  ScanTime timestamp,
  ScanParams varchar,
  FOREIGN KEY (PartStateId) REFERENCES Partstates(PartStateId),
  FOREIGN KEY (PartId) REFERENCES Parts(PartId),

Pro:

  • Данные более нормализованы, создание / завершение деталивремя не дублируется.

Con:

  • Parts.CreatedScan fk должен иметь значение NULL для вставки записи.

РЕДАКТИРОВАТЬ:

Опция C:

Parts:
  PartId int,
  FinishedScan int nullable,
  Barcode varchar,
  FOREIGN KEY (FinishedScan) REFERENCES Scans(PartStateId),
Scans:
  ScanId int,
  PartId int,
  PartStateId int,
  ScanTime timestamp,
  ScanParams varchar,
  FOREIGN KEY (PartStateId) REFERENCES Partstates(PartStateId),
  FOREIGN KEY (PartId) REFERENCES Parts(PartId),
...