在这种情况下,如何避免数据库设计的空值?

时间:2018-04-04 20:36:56

标签: sql database database-design

设想一个标准的HR数据库,其中包含以下实体:员工,评估,培训,角色,部门,位置。

如果我们想找到一个员工的典型退休年龄,那么设计这个假设的最佳方式是什么?如果我们有退休日期'作为Employee实体下的属性,我们将留下空值。

我们是否需要创建一个名为'退休'只是为退休的员工存储数据?

2 个答案:

答案 0 :(得分:1)

似乎可能存在与退休人员相关的其他属性,这些属性不适用于当前员工。将这些属性(包括退休日期)放在退休人员的单独表格中。

这两种不同类型的人组合成一个表(又名“捆绑”)的一个危险是,它可能会允许出现不一致的状态:其中一名雇员填充一个或多个特定退休的属性而不是全部。您可以添加额外的约束来防止这种情况,但通常更简单的是不将不同类型的数据捆绑在一起。如果员工不是员工,那么在名为Employee的表中记录人员似乎也是违反直觉的。

使用空值通常会使编写查询并从数据中获取有用的结果变得更加困难。 Nulls几乎可以保证某些查询会产生的结果不符合您试图表达的现实。

答案 1 :(得分:0)

您的数据模型可能过于简化。员工可以来去匆匆。您可能需要有关员工的整体信息,但您可能还需要历史记录表。毕竟,员工会更改部门,历史等。退休不是唯一的问题。

至于退休本身,我认为在其中一个实体中包括退休日期并没有错。如果它是NULL,那么就没有已知的退休。您可能希望将默认日期放在远处,而不是NULL

以下两种方法都是定义退休/活跃客户的合理方法:

(case when retirement_date < current_date then 'RETIRED' else 'ACTIVE' end)
(case when retirement_date > current_date then 'ACTIVE' else 'RETIRED' end)

但是,如果活跃客户retirement_dateNULL,则第一个不起作用。出于这个原因,将活跃员工的日期远远地放在一起可能会更好。在这种情况下,两种方法都有效,您不必担心(尽可能多)应用程序逻辑。