-2

任何人都可以为这些 4tables 提出一个好的设计。

设计

 Fields: DesignId (Primarykey),
Iname..,....

表 2:输入文件

FileId int,
DesignId ,
FileName,
Description,
primary key (FileId,DesignId )
foreign key(DesignId)...
//This foreign key here seems to cause insert problems.

表 3:输入数据

DesignId int,
TestCaseInputId,
FileId int,
MaterialType,
primary key(DesignId ,TestCaseInputId,FileId)
foreign key(FileId ) references InputFiles
foreign key(DesignId) refernces Design

问题:

  1. 我不确定或不相信 Table2、Table3 中的复合键。
  2. 外键。外键似乎会导致插入问题
4

2 回答 2

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 保持一致。如果这种关系永远不会改变,你可能仍然想要它。这只是正常化的暗示。

您必须按以下顺序插入数据...

  1. 第一个插入设计
  2. 然后插入文件
  3. 然后插入 InputData

为什么 InputData 是一个与 InputFile 不同的表?如果您将为每个文件提供多个输入数据行,那么这是有道理的。

您可能希望创建 DesignID、FileID 和 TestCaseInputID 标识列或服务器的等效自动递增 int id。或者,如果这些 id 是在其他地方获得的真实世界信息,那么您必须插入它们。

于 2012-05-05T17:45:57.760 回答
1

说“外键似乎导致 [原文如此] 插入问题”没有帮助。问题是什么?我推测问题是加载数据的顺序,而不是外键约束。在使用它加载数据之前,您需要确保该 id 存在。

从文件中读取数据时,我通常使用以下策略:

  1. 将数据加载到临时的全字符临时表中。
  2. 验证临时表中的数据,包括外键和类型。
  3. 如有必要,将任何缺少的主键添加到相应的表中。
  4. 将数据加载到最终表格中。

这需要更多的步骤和数据移动。但是,我不断提醒我通过对输入数据进行适当检查可以节省多少实时时间。

于 2012-05-05T17:28:38.360 回答