2012-03-20 199 views
1

我正在开发一个系统,其中我有一个表Employees,其中有多个与员工相关的列。我有一列JobTitle和另一列DepartmentSQL Server主键/外键

在我目前的设计中,JobTitle &的Department列在Employees表复合外键和它们与有2列复合主键(JobTitle & Department)和作业一个额外的列的Groups表链接描述。

我不开心的这个设计,因为我认为,联用2复合varchar列2个表是不好的表现,我认为这将是更好的有一个Integer列(自动编号)作为主JobTitleID键入Groups表,并将其作为Employees表中的外键而不是文本JobTitle &,Department列。

但我不得不这样做,因为当我将员工列表(Excel)导入到我的Employees表中时,它可以直接映射(JobTitle - > JobTitle & Department - > Department)。否则,如果我使用整数索引作为主键,那么我将手动重命名excel表格中的文本JobTitle列为基于Groups表中生成的键的数字以便导入。

保持我这样的数据库设计(文本复合主键与文本复合外键链接)是否正常?如果不是,那么如果我使用Groups表中的整数列作为主键并且使用Employees表中的外键,那么我如何才能将excel中的员工列表直接导入到Employees表中?

是否有可能从Excel导入列表到SQL Server的方式,从Excel工作表中的文字JobTitle将从Groups表自动转换到corespondent JobTitleID?这将是最好的解决方案,然后我可以在Groups表中添加JobTitleID列作为主键和Employees表中的外键。

谢谢

回答

2

这听起来像你正在试图使数据库表设计符合excel文件的导入,这不是一个好主意。忘记excel文件,并使用正确的主键和关系首先设计数据库表。这意味着主键的int,bigint或guid。除非你绝对知道密钥是唯一的,例如在SSN中,这将使你摆脱困境。在您导入时,然后将部门和职位填入各自的表中,创建其主键。现在它们已经被填充,将这些密钥添加到可以导入雇员表的excel文件中。

这只是我如何解决这个问题的一个例子。使用多列作为键是没有错的,但是如果你坚持使用int,bigint或guid作为主键,它肯定会让你远离危险。

+0

非常感谢你的澄清。我将使用int作为主键,但是我会遵循Adolfo Perez的建议来导入数据,这比手动编辑excel更快更直接。 – 2012-03-20 16:22:26

1

看在这个职位的答案:how-to-use-bulk-insert...

我想创建一个简单的存储过程,导入Excel数据到临时不受限制的临时表,然后执行INSERT到你的真实表通过执行相应的表连接来获取正确的外键,并将无法导入到IMPORT FAIL表的行转储。只是一些想法...

+1

非常感谢你的这个想法,我会这样做:) – 2012-03-20 16:26:08