数据库设计中动态列的设计方法

 

 

问题提出:
在进行数据库开发过程中,我们往往会碰到这种情形:
如在劳资计算中,对每个人有很多薪酬项目需要汇总计算出工资,如基本工资,计件工资,计时工资,奖金,补贴,代扣等等,但我们在建表的过程中既不能确定薪酬的名称,也不能确定到底有多少个项目,所以在建表的时候面临一个问题,建多少列?起什么名?
下面我以前做过的一个收费系统举例,简单说明一下对于这种情况的处理。
案例情况:
某单位收费系统,现确定收管辖区的暖气费、物业费、治安费、卫生费、收视费、过水热费、热水费、房租、水电费、摊位费、商铺租金十一个收费项目,但客户提出有可能增加垃圾清运费、绿化费等一些现在还未确定的费用以及将来可能要增加的收费项目。
实现目标:
根据案例情况,我们必须要考虑动态设计列,而不是在客户需增加列的时候去直接修改数据库表结构。
实现方法:
采用列映射为行的处理方法,将无意义但有规律的列名映射出无规律但有意义的行。
实现步骤(设计工具 PowerDesigner9.5 数据为MS SqlServer2000):
一、              确定项目最多几项
收费项目具体有多少项目,因为存在变数,我们不能确定,但最多不会超过多少项目,虽然我们仍然没办法确定,但这个是可以估计的。通过综合分析系统使用对象的实际情况以及系统的生命周期,像这种临时或将要增加的收费项目不会超过现有确定的项目的一半,所以在本系统估计最大收费项目会月16列。(注意:增加的收费项目不会超过现有确定的项目的一半,仅仅是指这个案例,具体问题具体分析)。
二、              建立项目信息表
建立一个用来存储项目(列)信息的表,表结构如下:

数据内容如下:

 

这样,我们就用这个项目信息表把每个项目对应的列名确定下来了,或者说,在别的表中相应的列名对应的收费项目就确定下来了。
我们在需要变更收费项目名称或增减收费项目时只需修改表中类别名称即可。
在这个表中还可以根据实际情况保存一些额外的信息,如增加计算公式列,对公式C13=C1+C5,行号为13的公式列可以保存C1+C5,这仅仅是一个简单的例子,可以跟据实际情况保存很多扩展信息。
一、              使用项目信息表
我们建立的项目信息表,主要是为了在所有使用这些收费项目的其它表中使用。比如我们我们另一个表代扣项目设置表(设置哪些收费项目由交费用户所在单位代扣),表结构如下:

数据表中数据表示次单位是否代扣此项目,如单位编码为001的单位,DK_C01为1表示001单位代扣暖气费,为0表示不代扣。 
其它别的比如收费信息表(存储收费用户个人收费信息),个人收费项目表(存储收费用户个人有哪些收费项目)等表中均可使用类似定义列,我们在做数据库操作的时候,可动态使用列名,如收费信息表中,存储费用信息的列为FY_C01…FY_C16,我们计算此用户总费用时可使用循环累加,列名由循环变里动态组合而成,如”FY_C”+循环变量处理形式表示。
方案优缺点:
优点:1、能够灵活的设置项目(具有共性的多个分类)的名称或表示形式,而不受数据库实际列的限制,而且能夠方便的进行修改。
2、在进行数据处理时能根据某种规律动态生成列名而读取或更新数据。
缺点:如不能正确估计项目最多有几项,会导致需修改多个表。
 
注:这篇文章是我以前做过一个项目中实际碰到实际问题,我只是最近闲下来做了个整理,其实是一个很简单的处理方式,不是写给高手看的,只是希望对碰到问题类似问题的朋友做一参考。
 
————————————————
版权声明:本文为CSDN博主「chaihuo」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chaihuo/article/details/1631680

posted @ 2020-02-26 11:45  DarJeely  阅读(1745)  评论(0编辑  收藏  举报