重新生成主键以识别员工

时间:2010-04-29 17:54:50

标签: database-design

我们公司决定通过在员工编号前添加“X”来指定承包商。但他们并没有在所有系统中都这样做。

这是危险的事吗?为什么?

6 个答案:

答案 0 :(得分:3)

如果不了解他们的系统,我会说这是一个糟糕的设计。

  • 如果他们想要查找一名员工并且他们只有员工编号,但他们不知道是否是承包商,那么他们必须检查是否有X.
  • 数据库可能允许承包商和非承包商使用相同的员工编号,因为唯一的约束条件允许它。
  • 加入REPLACE(employeenr,'X','')会有效但效率低下。

更好的选择是为承包商制作一个可以为0或1的列。我猜可能有原因阻止他们这样做(例如,无法更改的遗留系统)。

答案 1 :(得分:2)

它是否“危险”是一个有点问题。如果你这样做,人们会死,这是值得怀疑的,但是,我绝对会建议不要这样做。从根本上说,作为数据库设计者,您最重要的目标之一应该是数据完整性,这意味着每个数据值都有一个含义。我告诉我的客户当他们建议做这样的事情的一个共同声明是“我不能列出可能通过<insert bad practice here>发生的所有可能发生的坏事,但我可以说它很可能会制造问题“。在这种情况下,这种不良做法试图在单一价值上赋予多重含义。

其他人提到了您可能遇到的一些问题。我知道其他几个人:

  1. 验证员工编号。您将不得不改变您对员工编号的验证(您正在验证它吗?)忽略主角,但前提是它是“X”。
  2. 向员工/承包商报告/输出。显示员工编号的任何报告都需要删除“X”
  3. 更好的解决方案IMO,将添加一个列,表明该人在公司中的角色:员工或承包商。

答案 2 :(得分:2)

非常糟糕的主意。在第一名PK中,如果可能的话,不应该出于性能原因除了数字之外的任何东西。第二,因为现在这是字符串数据排序将使用字符串排序和数字排序。这真的会让人烦恼,因为121会跟随12而不是13!

该计划的另一个困难是承包商有时会成为雇员。您不希望更改所有相关表,因为他的ID号已更改。

如果有人想用X显示数字,那么使用位字段在数据库中标记是否有人是或不是comtractor,使用自动编号字段获取员工编号并在查询中使用case语句如果此人是承包商,则在显示屏上将122更改为X122。

由于您无法使用自动生成的号码来获取员工编号,因此会影响进一步的表现,这几乎是一个错误,因为现在您不得不担心竞争条件。

答案 3 :(得分:1)

我认为这完全取决于你如何实现它。我宁愿给他们正确的数字,并创建一个新的表格,其中数字作为外键,如果他是承包商则需要说明一行。

答案 4 :(得分:0)

以这种方式识别承包商的目的是什么?如果贵公司的工资单和人力资源系统没有更好的方法记录这些信息,那么我会说这些系统存在缺陷,应该修复或更换。

答案 5 :(得分:0)

最好添加一个新表,列出具有日期范围的顾问/联系人。