公司 - 员工数据库设计

时间:2009-04-01 23:11:58

标签: sql-server database-design primary-key

我正在尝试构建一个具有Company数据表和Employee数据表的SQL 2005数据库。每个公司都应该有一个Employee 1,Employee 2,依此类推。我意识到每个员工记录都会有他们的EmployeeID和他们的公司ID的PK,但我还没有为我的生活确定最好的方法吗?

有什么想法吗?

让我向我澄清一点

每个公司都可以拥有自己的员工#1,#2等。假设我有一个存储过程,通过传入公司ID和请求的员工ID来返回特定员工。

exec dbo.GetEmployee @CompanyID = 1, @EmployeeID = 45 

请记住,公司1可以拥有员工1,公司2可以拥有不同的员工1,我该怎么做?如何为每个公司的员工提供增量主键?

6 个答案:

答案 0 :(得分:2)

如果您的问题是数据建模问题:

如果员工只能为一家公司工作,那么您可以将CompanyID作为Employee表中的外键引用,并且EmployeeID是任何给定人员的唯一内容(例如SSID)。

如果员工可以为多家公司工作,那么您将拥有多对多关系,这需要第三个表 - 名为CompanyEmployee,由CompanyID和EmployeeID组成。

那有帮助吗?

或者,你的问题很简单:

“如何在SQL Server中执行复合主键”?

答案 1 :(得分:2)

根据您对Jamo的评论,您需要两个员工ID。一个由雇主独有的,一个在整个数据库中独一无二的。然后你有这些表:

Employees
E_ID NUMBER(9) NOT NULL
E_NAME
E_SSID
etc.

Companies
C_ID NUMBER(9) NOT NULL
C_NAME
etc.

Employment
CE_ID NUMBER(9) NOT NULL
C_ID NUMBER(9) NOT NULL FOREIGN KEY (Companies.C_ID)
E_ID NUMBER(9) NOT NULL FOREIGN KEY (Employees.E_ID)
LOCAL_E_ID NUMBER(9) NOT NULL

C_ID是公司的唯一标识符。 E_ID是数据库中员工的唯一标识符。 CE_ID是就业表的唯一标识符,以便更新。 LOCAL_E_ID是公司独有的。您需要创建某种触发器来创建此数字。

答案 2 :(得分:1)

简单的答案是你不能。

您可以通过公司ID和员工ID在employee表上创建主键。这照顾了唯一的约束。

但是,您无法自动增加员工ID,而是在插入中需要将其包装在事务中并执行类似

的操作
insert @companyID, max(employeeID)+1 from employees where companyID=@companyID into employee

答案 3 :(得分:1)

简短的回答是你可能正在咆哮错误的树。

如果employeeID被指定为自动增量(因此是任意)号码,则没有理由重新启动每个公司的employeeID。如果你认为我弄错了,请提供一个例子,我会调整我的答案。

这种设计只会产生一种不必要的复杂设计。例如,您的存储过程实际上应该使用单个EmployeeID,然后该员工记录将用于确定公司。

答案 4 :(得分:0)

听起来在那里有一个外键。这是员工与公司之间的1:多关系,假设员工一次只能为一家公司工作。员工和公司都有PK,而员工有FK引用公司PK。

我建议您为公司和员工使用代理键。保持业务逻辑脱离密钥是一个好主意。

答案 5 :(得分:0)

我会有一个名为Company的表,其主键列为CompanyID,然后我有一个名为Employee的表,其主键列为EmployeeID,外键列为CompanyID。当然,每个表上都有EmployeeName和CompanyName以及任何其他适当的列。