数据库设计 - NULL或最大值来指示此日期值?

时间:2009-07-25 00:07:22

标签: mysql datetime timestamp scheduling

所以我正在开发一个使用MySQL DB的计划应用程序。该网站的其中一个模块是管理人员跟踪迟到,加班和缺勤。目前的网站是一团糟。它只是让管理员输入密钥数据,但它不会将管理器绑定到任何已知数据(例如,当员工预计到达/离开时),甚至要求他们使用标准格式。有些管理人员输入30分钟(意思是迟到30分钟),而其他人则输入8:30(意思是他们应该在8点到期)等等。

我的版本将受到更多限制。经理将选择员工,然后选择有问题的班次,他们基本上可以输入两个值:实际到达的时间,实际剩下的时间。这样,当运行报告并验证时间表时,只需要进行数学计算,看看它们是迟到/早/加班。但我遇到了一个困难的地方:

首先,如果有人打电话给病人(或者只是没有出现),我会得到它,所以经理只是检查一个方框,他们根本不做任何时间调整。它完全消除了那个时间。我应该通过将两个时间值都设置为NULL来执行此操作,并且当运行任何查询时,将根据需要处理NULL(可能会延迟剩余时间和时间到达,因此它在两端都为零)或者我应该将时间到达和剩余时间都设置为“预期的移位结束”时间,以便它可以达到零?

我不喜欢使用NULL,因为它感觉没有可用的数据,但我不喜欢使用预期的移位结束,因为它看起来好像它们真的到了,恰到好处,因为它们也是离开。

这实际上是一个如何使数据语义化而不必使其过于复杂(使用NULL)的问题。

6 个答案:

答案 0 :(得分:1)

在这种情况下,NULL是合适的,因为它表示没有数据的实际情况。员工不在那里。还有什么可以放在那里?

您应该在记录中附加某种类型的状态,而不是寻找空值(imho)。

答案 1 :(得分:1)

我会设置NULL,因为实际上没有可用的数据(即没有要报告的班次开始/结束时间)。

在报表上,您可以跳过这些NULL值并对其进行单独处理。例如,您现在可以通过计算NULL行来计算员工错过了多少班次。

答案 2 :(得分:0)

我认为如果有人不进来,最好将其标记为0分钟。因为他们进来了0分钟。

另外,因为它是一个数值,所以你不必对数据做任何特别的事情。在我看来,这应该是收集数据的最终目标。让一切都统一,然后对它进行测试。如果你想提醒某人这个人没有进来,只需检查时间等于0的记录。

答案 3 :(得分:0)

如何创建一个单独的表(ShiftTimes?),其中包含员工的标识符,班次的标识符(可能是日期但不适用于第3班),以及进入和退出时间。这样,如果员工在那里打电话,就不会在当天的表格中记录。

答案 4 :(得分:0)

我将它们都设置为null并添加一个标志字段,指明它们是否完全显示。

答案 5 :(得分:0)

我同意您应该添加一个单独的列来跟踪它们是否不存在。那么你是否留下开始/结束时间并不重要。您可以直接查找IsAbsent标志。

老实说,这实际上取决于你想要的花哨程度。我已经完成了一个类似的系统,我们在这样的情况下做的是有一个单独的记录,一起记录缺席并确定它是否是原谅的。因为理想情况下还有许多其他原因,除了生病或没有出现。

如果缺席是免除(即假期)并且他们应该得到报酬怎么办?您的业​​务规则将推动我的猜测。

在做出最终决定之前,请尝试考虑所有可能的情况。最后你可能会发现,在这种情况下,开始和结束时间都会变得无关紧要。