Я изучаю 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),