0

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

有任何想法吗?

让我澄清一下

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

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

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

4

6 回答 6

2

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

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

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

这种帮助?

或者,您的问题很简单:

“如何在 SQL Server 中创建复合主键”?

于 2009-04-01T23:20:58.080 回答
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 在公司中是唯一的。您将需要创建某种触发器来创建此号码。

于 2009-04-01T23:45:50.233 回答
1

简单的答案是你不能。

您通过公司 ID 和员工 ID 在员工表上创建一个主键。这需要处理唯一约束。

但是,您不能让员工 ID 自动增加,而是在插入时需要将其包装在事务中并执行类似的操作

insert @companyID, max(employeeID)+1 from employees where companyID=@companyID into employee
于 2009-04-01T23:48:10.337 回答
1

简短的回答是,你可能在找错树了。

如果将employeeID 分配为自动递增(因此是任意的)数字,则没有理由重新启动每个公司的employeeID。如果您认为我错了,请提供一个例子,我会调整我的答案。

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

于 2009-04-01T23:52:03.323 回答
0

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

我敦促您为公司和员工使用代理键。将业务逻辑排除在密钥之外是一个好主意。

于 2009-04-01T23:16:17.433 回答
0

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

于 2009-04-01T23:39:06.070 回答