数据库设计中动态列的设计方法
问题提出:
在进行数据库开发过程中,我们往往会碰到这种情形:
如在劳资计算中,对每个人有很多薪酬项目需要汇总计算出工资,如基本工资,计件工资,计时工资,奖金,补贴,代扣等等,但我们在建表的过程中既不能确定薪酬的名称,也不能确定到底有多少个项目,所以在建表的时候面临一个问题,建多少列?起什么名?
下面我以前做过的一个收费系统举例,简单说明一下对于这种情况的处理。
案例情况:
某单位收费系统,现确定收管辖区的暖气费、物业费、治安费、卫生费、收视费、过水热费、热水费、房租、水电费、摊位费、商铺租金十一个收费项目,但客户提出有可能增加垃圾清运费、绿化费等一些现在还未确定的费用以及将来可能要增加的收费项目。
实现目标:
根据案例情况,我们必须要考虑动态设计列,而不是在客户需增加列的时候去直接修改数据库表结构。
实现方法:
采用列映射为行的处理方法,将无意义但有规律的列名映射出无规律但有意义的行。
实现步骤(设计工具 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
相关文章
- mysql数据库中,查看当前支持的字符集有哪些?字符集默认的collation的名字?
- JavaScript日历控件开发 C# 读取 appconfig文件配置数据库连接字符串,和配置文件 List<T>.ForEach 调用异步方法的意外 ef 增加或者更新的习惯思维 asp.net core导入excel 一个二级联动
- Expression构建DataTable to Entity 映射委托 sqlserver 数据库里面金额类型为什么不建议用float,实例告诉你为什么不能。 sql server 多行数据合并成一列 C# 字符串大写转小写,小写转大写,数字保留,其他除外 从0开始用U盘制作启动盘装Windows10系统(联想R720笔记本)并永久激活方法 纯CSS打造淘宝导航菜单栏 C# Winform
- 使用mybatis操作mysql数据库SUM方法返回NULL解决
- Navicat 实现数据库迁移(tl)
- 接口测试常用技能:Jmeter操作数据库
- 聚焦开放数据:全球恐怖袭击事件数据库
- 大数据与机器学习:实践方法与行业案例.3.3 自动加载程序的数据库设计
- [转]oracle11g数据库导入导出方法教程
- [转]PL/SQLDeveloper导入导出Oracle数据库方法
- PostgreSQL 关闭session链接,删除数据库方法(转载)
- Lumen开发:lumen源码解读之初始化(2)——门面(Facades)与数据库(db)
- 数据库 SQL Server 到 MySQL 迁移方法总结
- 《PowerShell V3——SQL Server 2012数据库自动化运维权威指南》——1.6 导入SMO程序集
- 精通 Room Library:Android 中高效 SQLite 数据库指南
- cmd启动数据库时,出现 (无法启动此程序,因为计算机中丢失VCRUNTIME140_1.dll 尝试重新安装此程序以解决此问题 )解决方法。
- SQLServer 数据库主体在该数据库中拥有 架构,无法删除解决方法
- 安装VMware vCenter过程设置数据库方法
- 数据库出错提示Duplicate entry * for key *的解决方法
- mongodb数据库的备份和还原
- MySQL数据库远程连接开启方法
- 【数据库】JDBC下PrepareStatement测试类的添、删、改 和 查的方法
- How to Kill All Processes That Have Open Connection in a SQL Server Database[关闭数据库链接 最佳方法] -摘自网络
- 数据库水平拆分和垂直拆分区别
- 【数据库学习】——纠错:mysql Authentication plugin ‘caching_sha2_password‘ is not supported
- SQLServer 报错:用户、组或角色'XXX' 在当前数据库中已存在. 错误:15023解决方法
- docker-compose备份数据库命令,在crontab定时任务中不生效问题,解决方法