这是一个简单的 SQLite 架构:
CREATE TABLE Lots (
Id INTEGER PRIMARY KEY
);
CREATE TABLE Parts (
Id INTEGER PRIMARY KEY,
LotId INTEGER NOT NULL REFERENCES Lots
);
CREATE TABLE Inspections (
Id INTEGER PRIMARY KEY,
LotId INTEGER NOT NULL REFERENCES Lots,
PartId INTEGER NULL REFERENCES Parts
);
每个批次都有关联的零件和检查,但某些检查也与特定零件相关。问题在于,无法确保检验及其引用的零件都引用相同的批次。
我在我的应用程序中使用类似的东西作为本地数据存储,所以我不担心这些理论上的不一致,但我有兴趣学习如何正确处理这个问题。
您可以在包含 LotId 列的零件表中添加额外的 UNIQUE 索引:
CREATE UNIQUE INDEX i1 ON Parts(Id, LotId)
然后您可以在外键约束中引用这个新的“超级键”:
CREATE TABLE Inspections (
Id INTEGER PRIMARY KEY,
LotId INTEGER NOT NULL REFERENCES Lots,
PartId INTEGER NULL REFERENCES Parts,
FOREIGN KEY (PartId, LotId) REFERENCES Parts (Id, LotId)
);
您是否选择不将简单的 FK 包含在
PartId
上取决于您。