公司与员工ID困境

时间:2009-04-17 17:25:30

标签: php mysql database database-design

我的SQL数据库中有两个表:

公司:

  • ID(自动增量)
  • 名称
  • 地址
  • ...

雇员:

  • ID(自动增量)
  • COMPANY_ID
  • INTERNAL_ID
  • 名称
  • 名字

问题在于我希望员工ID(internal_id)与他们所属的公司相关。我得到了这个困境,因为我一直在寻找实现它的最干净的方法。

一种选择就是创建一种SELECT MAX(internal_id)FROM employees WHERE company_id = X,但问题是如果我碰巧删除了最后一个员工,那么下一个员工将使用下。

有任何想法或建议吗?

PD:我想要这样做的原因是我不希望公司X的用户创建一个例如ID = 2000的员工,而在他的公司创建的最后一个员工是,比方说, 1532.这通常发生在Y和Z公司也在同一系统上创建员工的系统中。我希望这个ID不能用作foreign_key,而是用于内部(甚至文档或报告)使用。

PD2:在这种情况下,员工永远不必改变公司

8 个答案:

答案 0 :(得分:12)

不,不要那样做!这将在您的数据库中创建许多问题(您必须担心其他事情中的并发问题)来解决不是问题并且事实上正确设计的问题。 id应该没有意义,差距也不重要。您可能希望在employeeid / companyid组合上使用唯一索引,以确保没有员工分配给多家公司。

您的员工ID应该是永远不需要更改的东西。如果您制作某种基于公司的愚蠢ID并且公司A购买公司B并成为公司C,则最终必须更改所有ID和所有相关表。在您当前的设计中,您只需要更新公司代码,而不是相关的表格。

答案 1 :(得分:4)

创建一个单独的表:

CREATE TABLE t_identity (company INT NOT NULL PRIMARY KEY, id INT NOT NULL)

并发出:

INSERT
INTO    t_identity (@company, 1)
ON DUPLICATE KEY UPDATE
SET     id = id + 1

在插入新员工之前。

答案 2 :(得分:3)

此处有很多关于创建与主键无关的“商家”ID或数字的问题。

在您的情况下,我将在Company表“NextEmployeeID”上创建一个列然后在创建新员工时,只需检索该值并将其递增。

现在我告诉你,如果员工改变公司会发生什么。 : - )

答案 3 :(得分:0)

您永远不应该从关系数据库中删除行。您应该使该员工到期(IE,Set Employee.ActiveFlag = 0)

所以如果你有一个internal_id(int)并且做了一个(SELECT MAX(internal_Id)+1 FROM Employees WHERE Company_Id = [parameterCompanyID])那么这样就可以了。

答案 4 :(得分:0)

如果您要将员工ID用作fk,您真的想要删除它以及他们在数据库中的所有工作吗?在员工中创建一个状态字段,并将其设置为“A”或“I”。如果EmployeeID在所有公司中保持唯一,那么最好让它自动增量。永远不要让用户看到ID,让他们只看到名字。

也不要将列ID,CompanyID或EmployeeID命名为更易读和更容易搜索。

答案 5 :(得分:0)

为什么不为您的internal_ids使用GUID?这样,您可以随时进行插入,而不必担心ID冲突。

根据你当前的结构,你将无法避免删除异常,但你真的不应该按照你提出的方式去做。为了可靠地获得“下一个数字”,你将不得不锁定表格,这将导致各种不良。也许你可以为员工实施某种软删除,因为他们往往有时会去。 :)

答案 6 :(得分:0)

我会像Quassnoi建议的那样,用公司和当前的最大序列号创建一个单独的表。但是我会将它包装在存储过程或UDF(MySQL做UDF吗?)中,它接受公司作为输入,递增当前值并返回该递增值。

答案 7 :(得分:0)

我宁愿为3个变量创建3列,并允许管理员修改数据库中的值!  1.公司简称代码(companyCode即COMP)  2.公司部门短代码(depCode即DEP)  3.公司开始计算值(compVal即00000) 现在添加新员工时,我每次都会加入所有变量和增量并更新compVal ++! (即COMP-DEP-0001) 或者我们也可以使用员工ID

添加date()