求助:一个数据表的设计思路

没来 2013-06-20 12:07:30
想设计一个简单的工资核算表。表格的列应该可以通过程序控制。比如,现在使用的表格有如下列
姓名
基本工资
全勤
补贴等

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

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

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

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

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

请大牛指点一二,可以如何设计更高效。谢谢!
...全文
288 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
没来 2013-07-20
  • 打赏
  • 举报
回复
感觉可行,谢谢!
引用 16 楼 tsp3ng 的回复:
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, 归属职位等, 计算区间起始日期, 计算区间结束日期, 项目值), 用来表示每个项目的值是如何等来, 有些公司计算需要区分人事调动(调动之前按变动前算,变动之后按变动之后算) 此表结构,经过长达十年的应用,几乎可以适用所有的计算要求.
tsp3ng 2013-07-12
  • 打赏
  • 举报
回复
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, 归属职位等, 计算区间起始日期, 计算区间结束日期, 项目值), 用来表示每个项目的值是如何等来, 有些公司计算需要区分人事调动(调动之前按变动前算,变动之后按变动之后算) 此表结构,经过长达十年的应用,几乎可以适用所有的计算要求.
csdnTimePeriod 2013-06-22
  • 打赏
  • 举报
回复
像你说的,这样设计,一条数据来了,需要影响几个表,那么记录多了,不就影响效率了。 在这种情况下,使用7楼提到的也是常用的设计方式建库,就行了。 以后遇到更复杂的情况,再按你的思路实现。 供你参考。
没来 2013-06-21
  • 打赏
  • 举报
回复
引用 11 楼 anonymoususer 的回复:
想法挺好,不过实现起来是效率不好。也许在这种情况,使用传统的数据表设计更合适。也许这种思路可以用在以后,就是牺牲效率也值得的情况。
是指一个字段保存所有吗?还是动态属性?
没来 2013-06-21
  • 打赏
  • 举报
回复
引用 9 楼 hgwyl 的回复:
ID 姓名 基本工资 附加工资 合计 前三个字段和最后一个字段属性不用多说,注意“附加工资”字段 内容: 医疗费,50;电话费,20;加班费,30;过节费,10;开房费,9999; 具体的数组分割放到前台去处理
开房费? 不过这也是个办法。谢谢!不过,若要添加或删除新项,似乎得更改页面。我的思路是,UI的工资项目列表是根据数据库动态生成的,可以使用动态用户控件,也可以使用标准的数据控件。控制面板做出改动后,页面的控件实时更新。这方面,确实涉及效率问题。
hgwyl 2013-06-21
  • 打赏
  • 举报
回复
引用 11 楼 anonymoususer 的回复:
想法挺好,不过实现起来是效率不好。也许在这种情况,使用传统的数据表设计更合适。也许这种思路可以用在以后,就是牺牲效率也值得的情况。
效率不好……? 没看明白……求指点……
csdnTimePeriod 2013-06-21
  • 打赏
  • 举报
回复
想法挺好,不过实现起来是效率不好。也许在这种情况,使用传统的数据表设计更合适。也许这种思路可以用在以后,就是牺牲效率也值得的情况。
hgwyl 2013-06-21
  • 打赏
  • 举报
回复
忘了打颜色标记了 医疗费,50;电话费,20;加班费,30;过节费,10;开房费,9999; ——还是看不清 医疗费和50之间,英文状态的逗号 50和电话费之间,英文状态的分号
hgwyl 2013-06-21
  • 打赏
  • 举报
回复
ID 姓名 基本工资 附加工资 合计 前三个字段和最后一个字段属性不用多说,注意“附加工资”字段 内容: 医疗费,50;电话费,20;加班费,30;过节费,10;开房费,9999; 具体的数组分割放到前台去处理
没来 2013-06-20
  • 打赏
  • 举报
回复
引用 7 楼 ap0405140 的回复:
LZ的设计思路没问题. 个人认为还是在数据表上加字段的方式比较简单方便. 不明白为何不允许更改数据库设计?
谢谢提点。确实,数据表上加字段最简单,后续的代码也省事。但如果日后想多加一项(比如加个某某津贴或补助),就得在数据表中多加一个字段。相应地,程序中的模型就得重建,存储库也得更新,UI及页面代码也得检查。。。会比较麻烦。有其他方法实现吗?
唐诗三百首 2013-06-20
  • 打赏
  • 举报
回复
LZ的设计思路没问题. 个人认为还是在数据表上加字段的方式比较简单方便. 不明白为何不允许更改数据库设计?
没来 2013-06-20
  • 打赏
  • 举报
回复
引用 4 楼 zbdzjx 的回复:
通常,灵活度和效率成反比。 越灵活,写代码及代码执行的效率就越低。
所以想找一个最优的方法。
没来 2013-06-20
  • 打赏
  • 举报
回复
引用 4 楼 zbdzjx 的回复:
通常,灵活度和效率成反比。 越灵活,写代码及代码执行的效率就越低。
很精辟。
zbdzjx 2013-06-20
  • 打赏
  • 举报
回复
通常,灵活度和效率成反比。 越灵活,写代码及代码执行的效率就越低。
没来 2013-06-20
  • 打赏
  • 举报
回复
引用 2 楼 anonymoususer 的回复:
楼主的思路是把表格建成可以动态添加属性的表,用属性表存储所有的属性,旧的属性也留在属性表里吗?
是的。属性表中保存各列的名称。如果想添加一列,在属性表中添加一条数据即可。如果想去掉一列,将属性表中相应数据的IsActive设为False。 每次在页面中呈现一个表时,先读主表内容,然后通过主表ID找到明细表中的相关数据,再通过明细表中的属性ID读回各列的名称,最后通过行与列将属性表中的Value字段准确填入正确位置。感觉有点罗嗦。新手,没什么实际经验,暂时想不出更好的方法。所以跑这儿来求助
csdnTimePeriod 2013-06-20
  • 打赏
  • 举报
回复
楼主的思路是把表格建成可以动态添加属性的表,用属性表存储所有的属性,旧的属性也留在属性表里吗?
csdnTimePeriod 2013-06-20
  • 打赏
  • 举报
回复
楼主的思路是把表格建成可以动态添加属性的表,用属性表存储所有的属性,旧的属性也留在属性表里吗?

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧