员工休假制度的数据库模式设计

时间:2013-12-19 06:28:41

标签: sql-server sql-server-2005 database-design relational-database database-schema

情境:

员工从参与之日起每月积累 n 天数。不同的员工类别每月有权享有不同的天数,比如高级员工可能有权获得2.5天,而初级员工可能有权获得2.0天和更长时间。实习生1.75天。

当员工晋升时,从初级到高级说他们的月假权利也应该改变,但他们的累积假期总数应该考虑到类别的变化。即如果一名初级员工工作两个月( 2.0 /月),并且在第三个月晋升为高级职员(费率现在变为2.5 /月),那会是什么?是计算累积假期总数的最佳方法吗?

如果整体利率是统一的,那么在计算员工类别变化时积累的天数时,我不会有任何问题。在这里,员工类别可以在其工作期间的任何时间从一个变为另一个。

这种情况的最佳架构设计如何?

1 个答案:

答案 0 :(得分:1)

假设您有员工表

+--------------+
|   employee   |
+==============+
| employee_id  |
+--------------+
| more rows... |
+--------------+

然后,您可能有一个单独的表来跟踪开始日期和结束日期的资历级别更改,其中end_date = null表示员工当前处于该资历级别。

+--------------+
| level_events |
+==============+
| event_id     |
+--------------+
| employee_id  |
+--------------+
| level_id     |
+--------------+
| start_date   |
+--------------+
| end_date     |
+--------------+

您需要一张表格来将资历水平与请假费率相关联。

+-------------+
| level_rates |
+=============+
| level_id    |
+-------------+
| rate        |
+-------------+

从这里开始,有一百万种不同的方式,这取决于你的编程语言和风格。

基本上,你需要类似下面的伪代码:

SELECT * FROM level_events INNER JOIN level_rates ON level_id
WHERE employee_id = <the employee in question>

var months = 0
var leave = 0
var month_interval = 30 * 24 * 60 * 60  // days * hours * minutes * seconds

for Row in Results
  if (end_date == null)
    end_date = NOW()
  date_diff = end_date - start_date
  months = date_diff / month_interval
  leave += months * rate

return leave

当然,您还需要一个像“leave_used”这样的表来跟踪已使用的假期,并从累积的假期中扣除它。

希望这有助于获得一些想法!