日期:2014-05-17  浏览次数:20482 次

求助:一个数据表的设计思路
想设计一个简单的工资核算表。表格的列应该可以通过程序控制。比如,现在使用的表格有如下列
姓名
基本工资
全勤
补贴等

如果日后有需要,我可再添加过节费、工伤补助等一些新的项目,或者去掉一些不需要的旧项目。这一切的前提是:不更改数据库结构和数据表的设计。

另外,需要有一个字段,标识该项目在核算工资时,应该进行加法操作还是减法操作。这个相对简单,一个bit字段应该可以搞定。

现有思路:
1.主表:主表Id、姓名、日期   三个字段
2.属性表:属性表Id、名称、IsPlus(True加,False减)、IsActive(True显示False隐藏)
3.明细表:明细表Id、主表Id、属性表Id、Value等几个字段

通过控制属性表的内容,基本可以实现。但....这似乎太麻烦:如果工资表中有10列(即10个属性),每次保存数据,就得先向主表添加一条数据,然后在明细表中添加10条数据。发果一次发放200个人的工资,那一个月就是2000条...

另外,还一个问题是,如果想通过数据库的数据生成一个通常意义上的表格,敲代码也是一大麻烦。。。

请大牛指点一二,可以如何设计更高效。谢谢!
数据库设计 Structure

------解决方案--------------------
LZ的设计思路没问题.
个人认为还是在数据表上加字段的方式比较简单方便.

不明白为何不允许更改数据库设计?
------解决方案--------------------
1.1. 薪资计算分类主表(分类ID, 分类名称...), 例如月工资, 年终奖,实现不同计算目的.
1.2. 薪资计算明细公式表(分类ID, 计算项目ID, 计算项目名称, 公式...), 例如 应得基本工资,公式为=[基本工资]/[标准天数] * [出勤天数], 此表可以不减加号,全部由公式实现, 例如 应发工资= [应得基本工资] + [应得职务津贴] + ... + [全勤奖]
1.3  薪资计算明细区间公式表, 用于区分人事调动,前后不一样的算法)


2.1. 薪资结构项目表 (项目ID, 项目名称...), 例如基本工资,职务津贴,岗位津贴, 电话费等
2.2. 员工薪资结构主表(结构主表ID, 年, 月, 计算分类ID)
2.3. 员工薪资结构项目表(结构主表ID, 员工ID, 项目ID, 值)
2.4. 员工薪资结构项目明细表(结构主表ID, 员工ID,项目ID,区间起结日期,区间结束日期... 项目值)

3.1. 薪资计算结果主表 (结果ID, 分类ID, 计算月,计算月,开始日期, 结束日期), 这样的表结构可以支持按月,按周,按日,及任意日期段,任决分类计算)
3.2. 薪资计算结果员工主表(结果Id, 员工id, 员工相关信息字段(一般含部门ID,职位ID,薪别ID,职等ID等), 实得工资, 再留一些自定义字段), 用来表示每个员工的每个计算的最终工资.
3.3. 薪资计算结果员工项目表(结果id, 员工ID, 计算项目ID, 项目值)
3.4. 薪资计算结果员工项目明细表(结果ID, 员工ID, 计算项目ID, 归属部门Id, 归属职位等, 计算区间起始日期, 计算区间结束日期, 项目值), 用来表示每个项目的值是如何等来, 有些公司计算需要区分人事调动(调动之前按变动前算,变动之后按变动之后算)

此表结构,经过长达十年的应用,几乎可以适用所有的计算要求.