任何人都可以建议这些4桌的好设计。
设计
Fields: DesignId (Primarykey),
Iname..,....
表2:InputFiles
FileId int,
DesignId ,
FileName,
Description,
primary key (FileId,DesignId )
foreign key(DesignId)...
//This foreign key here seems to cause insert problems.
表3:InputData
DesignId int,
TestCaseInputId,
FileId int,
MaterialType,
primary key(DesignId ,TestCaseInputId,FileId)
foreign key(FileId ) references InputFiles
foreign key(DesignId) refernces Design
问题:
答案 0 :(得分:1)
说“外键似乎导致[原文如此]插入问题”无济于事。问题是什么?我推测问题是加载数据的顺序,而不是外键约束。 在加载数据之前,您需要确保id存在。
从文件中读取数据时,我通常使用以下策略:
这需要更多步骤和数据移动。但是,通过对输入数据进行适当的检查,我不断被提醒节省了多少实时时间。
答案 1 :(得分:1)
没有人能真正根据使用场景的知识进行设计......但
一些伪DDL,不确定你使用哪个服务器......
create table Design (
DesignID int not null primary key,
Iname nvarchar(32) not null
)
create table InputFile (
FileID int not null primary key,
DesignID int not null, -- foreign key referencing Design (DesignID)
FileName nvarchar(max) not null,
Description nvarchar(max) null
)
create table InputData (
TestCaseInputID int not null primary key,
FileID int not null, -- Foreign key referencing InputFile (FileID)
MaterialType nvarchar(?)
)
重点是不要生成InputFile主键(FileID,DesignID),除非您打算使用相同的FileID具有多个文件。
在InputData中使用DesignID不是必需的,冗余的。如果你把它放在那里你必须确保它与InputFile.DesignID保持一致。如果这种关系永远不会改变,你仍然可能需要它。这只是一种正常化的暗示。
您必须按如下顺序插入数据......
为什么InputData是InputFile的单独表?如果每个文件都有多个输入数据行,那么它就有意义了。
您可能希望生成DesignID,FileID和TestCaseInputID标识列或服务器等效的自动递增int ID。或者,如果这些ID是在其他地方获得的真实世界信息,那么您必须插入它们。