SQL Server主键/外键

时间:2012-03-20 14:17:43

标签: sql-server

我正在开发一个系统,其中我有一个表Employees,其中包含多个与员工相关的列。我有JobTitle的列和Department的另一列。

在我目前的设计中,JobTitle& Department列中的Employees列是复合外键,它们与Groups表关联,该表有2列复合主键(JobTitle& {{1} })和作业描述的额外列。

我对这个设计不满意,因为我认为使用2个复合Department列链接2个表对性能不利,我认为最好有varchar列(自动编号)Integer用作JobTitleID表中的主键,用作Groups表中的外键而不是文本Employees& JobTitle列。Department

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

保持我的数据库设计(与文本复合外键链接的文本复合主键)是否可以?如果没有,那么如果我在Groups表中使用整数列作为主键并且与Employees表中的外键相同,那么如何将员工列表从excel直接导入{{ 1}}表?

是否可以将Excel中的列表导入到SQL Server,方式是excel表中的文本Employees将自动转换为JobTitle表中的共同作用JobTitleID ?这将是最佳解决方案,然后我可以在Groups表中添加JobTitleID列作为主键和Groups表中的外键。

谢谢,

2 个答案:

答案 0 :(得分:2)

听起来你正试图让数据库表设计适合excel文件的导入,这不是一个好主意。忘记excel文件并首先使用正确的主键和关系设计db表。这意味着主键的int,bigint或guids。这将使您远离麻烦,除非您完全知道密钥是唯一的,例如在SSN中。导入时,将部门和职务标题填充到各自的表中,创建主键。现在已填充它们,将这些键添加到可导入到employees表中的excel文件中。

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

答案 1 :(得分:1)

请看这篇文章中的答案:how-to-use-bulk-insert...

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