【问题标题】:Database schema design for employee leave system员工休假系统的数据库架构设计
【发布时间】:2014-01-07 14:45:24
【问题描述】:
场景:
员工自入职之日起每月累积 n 天。不同的员工类别每月有权享受不同的天数,例如高级员工可能有权获得 2.5 天,而初级员工可能有权获得 2.0 天和实习生 1.75 天。
当员工从初级晋升到高级时,他们的月休假权利也应该发生变化,但他们的累计休假总数应该考虑到类别的这种变化。即如果初级员工工作了两个月(2.0 / 月),第三个月晋升为高级员工(现在更改为 2.5 / 月),会怎样是计算他们累积休假总数的最佳方法吗?
如果费率全面统一,那么计算员工类别变化时累积的天数就不会有任何问题。在这里,员工类别可以在其就业过程中的任何时间从一个类别更改为另一个类别。
这种场景的最佳架构设计是怎样的?
【问题讨论】:
标签:
sql-server
sql-server-2005
database-design
relational-database
database-schema
【解决方案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”这样的表来跟踪已使用的休假并将其从应计休假中减去。
希望这有助于产生一些想法!