首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在这种情况下,如何在数据库设计中避免空值?

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

Stack Overflow用户
提问于 2018-04-05 04:36:56
回答 2查看 63关注 0票数 2

因此,设想一个标准的HR数据库,其中包含以下实体: Employee、Evaluation、Training、Role、Department、Location。

如果我们想要找到一个雇员的典型退休年龄,那么最好的假设设计方法是什么?如果我们将'Retirement_Date‘作为Employee实体下的一个属性,那么我们将得到空值。

我们是否需要创建一个名为“退休”的实体来存储退休员工的数据?

EN

回答 2

Stack Overflow用户

发布于 2018-04-05 05:23:34

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

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

使用空值通常会使编写查询和从数据中获得有用的结果变得更加困难。Nulls实际上保证了一些查询会给出与您试图表示的实际情况不符的结果。

票数 1
EN

Stack Overflow用户

发布于 2018-04-05 05:09:37

您的数据模型可能过于简化。员工可以来去自如。您可能需要有关员工的总体信息,但也可能需要一个历史表。毕竟,员工会改变部门、历史等等。退休并不是唯一的问题。

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

以下两种方法都是定义停用/活跃客户的合理方式:

代码语言:javascript
复制
(case when retirement_date < current_date then 'RETIRED' else 'ACTIVE' end)
(case when retirement_date > current_date then 'ACTIVE' else 'RETIRED' end)

但是,对于活跃客户,当retirement_dateNULL时,第一种方法不起作用。出于这个原因,为活跃员工设定一个很久很久以后的日期可能会更好。在这种情况下,两种公式都可以工作,并且您不必担心应用程序逻辑。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49659994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档