简化数据库设计

时间:2012-05-05 17:22:25

标签: sql database-design

任何人都可以建议这些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

问题:

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

2 个答案:

答案 0 :(得分:1)

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

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

  1. 将数据加载到临时的全角色临时表中。
  2. 验证登台表中的数据,包括外键和类型。
  3. 如有必要,将任何缺少的主键添加到相应的表中。
  4. 将数据加载到最终表格中。
  5. 这需要更多步骤和数据移动。但是,通过对输入数据进行适当的检查,我不断被提醒节省了多少实时时间。

答案 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不是必需的,冗余的。如果你把它放在那里你必须确保它与Inp​​utFile.DesignID保持一致。如果这种关系永远不会改变,你仍然可能需要它。这只是一种正常化的暗示。

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

  1. 首次插入设计
  2. 然后插入文件
  3. 然后插入InputData
  4. 为什么InputData是InputFile的单独表?如果每个文件都有多个输入数据行,那么它就有意义了。

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