MySQL有效解决外键中的循环依赖

时间:2019-01-22 17:37:06

标签: mysql database foreign-keys referential-integrity traceability

我正在学习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),

专业版:

  • 快速查询零件的当前信息。

骗局

  • 数据未规范化,零件(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),

专业版:

  • 数据更加规范化,零件创建/完成时间不再重复。

骗局

  • Parts.CreatedScan fk必须为可空以便插入条目。

编辑:

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

0 个答案:

没有答案