数据可视化第12篇:生成千万级数据之PowerDesigner配置并生成数据

    科技2026-02-18  11

    引言:

        工作中,遇到了造测试的需要,本想着自己写批量的insert就可以了。可是数据量太大了,用insert批量太麻烦了。

    事实表和维度表定义,及测试数据:

        (1)医疗收入事实表

    create table project_cost_fact

    (

      id int primary key auto_increment,

      cost_direction_code VARCHAR(20) comment '费用方向编码', 

      hospital_code VARCHAR(20) comment '医院定点编码', 

      level_code VARCHAR(20) comment '医院级别代码',

      time_code VARCHAR(10) comment '时间编码',

      income_type_code  VARCHAR(32) comment '收入类别编码:1、门诊收入 2、挂号收入 3、诊察收入 4、检查收入 5、化验收入 6、治疗收入 7、手术收入 8、卫生材料收入 9、西药收入 10、中草药收入 11、中成药收入 12、药事服务费收入 13、其他门诊收入 14、住院收入 15、床位收入 16、护理收入 17、其他住院收入',

      borrowing VARCHAR(32) comment '借贷方向',

      accrual  DOUBLE comment '发生额', 

      total  DOUBLE comment '合计'

    )

        (2)时间维度表

    CREATE TABLE time_type(

      code VARCHAR(20) comment '时间编码',

      year INT COMMENT '年度',

      year_name  VARCHAR(20) comment '年度名称',

      quarter INT COMMENT '季度',

      quarter_name  VARCHAR(20) comment '季度名称',

      month INT COMMENT '月份',

      month_name  VARCHAR(20) comment '月份名称',

      create_time VARCHAR(20) comment '创建时间')

    insert into time_type values('1','2017','2017年','1','第一季度','1','一月份','2020-04-24 06:50:53');

    insert into time_type values('2','2017','2017年','1','第一季度','2','二月份','2020-04-24 06:50:53');

    insert into time_type values('3','2017','2017年','1','第一季度','3','三月份','2020-04-24 06:50:53');

    insert into time_type values('4','2017','2017年','2','第二季度','4','四月份','2020-04-24 06:50:53');

    insert into time_type values('5','2017','2017年','2','第二季度','5','五月份','2020-04-24 06:50:53');

    insert into time_type values('6','2017','2017年','2','第二季度','6','六月份','2020-04-24 06:50:53');

    insert into time_type values('7','2017','2017年','3','第三季度','7','七月份','2020-04-24 06:50:53');

    insert into time_type values('8','2017','2017年','3','第三季度','8','八月份','2020-04-24 06:50:53');

    insert into time_type values('9','2017','2017年','3','第三季度','9','九月份','2020-04-24 06:50:53');

    insert into time_type values('10','2017','2017年','4','第四季度','10','十月份','2020-04-24 06:50:53');

    insert into time_type values('11','2017','2017年','4','第四季度','11','十一月份','2020-04-24 06:50:53');

    insert into time_type values('12','2017','2017年','4','第四季度','12','十二月份','2020-04-24 06:50:53');

    insert into time_type values('13','2018','2018年','1','第一季度','1','一月份','2020-04-24 06:50:53');

    insert into time_type values('14','2018','2018年','1','第一季度','2','二月份','2020-04-24 06:50:53');

    insert into time_type values('15','2018','2018年','1','第一季度','3','三月份','2020-04-24 06:50:53');

    insert into time_type values('16','2018','2018年','2','第二季度','4','四月份','2020-04-24 06:50:53');

    insert into time_type values('17','2018','2018年','2','第二季度','5','五月份','2020-04-24 06:50:53');

    insert into time_type values('18','2018','2018年','2','第二季度','6','六月份','2020-04-24 06:50:53');

    insert into time_type values('19','2018','2018年','3','第三季度','7','七月份','2020-04-24 06:50:53');

    insert into time_type values('20','2018','2018年','3','第三季度','8','八月份','2020-04-24 06:50:53');

    insert into time_type values('21','2018','2018年','3','第三季度','9','九月份','2020-04-24 06:50:53');

    insert into time_type values('22','2018','2018年','4','第四季度','10','十月份','2020-04-24 06:50:53');

    insert into time_type values('23','2018','2018年','4','第四季度','11','十一月份','2020-04-24 06:50:53');

    insert into time_type values('24','2018','2018年','4','第四季度','12','十二月份','2020-04-24 06:50:53');

    insert into time_type values('25','2019','2019年','1','第一季度','1','一月份','2020-04-24 06:50:53');

    insert into time_type values('26','2019','2019年','1','第一季度','2','二月份','2020-04-24 06:50:53');

    insert into time_type values('27','2019','2019年','1','第一季度','3','三月份','2020-04-24 06:50:53');

    insert into time_type values('28','2019','2019年','2','第二季度','4','四月份','2020-04-24 06:50:53');

    insert into time_type values('29','2019','2019年','2','第二季度','5','五月份','2020-04-24 06:50:53');

    insert into time_type values('30','2019','2019年','2','第二季度','6','六月份','2020-04-24 06:50:53');

    insert into time_type values('31','2019','2019年','3','第三季度','7','七月份','2020-04-24 06:50:53');

    insert into time_type values('32','2019','2019年','3','第三季度','8','八月份','2020-04-24 06:50:53');

    insert into time_type values('33','2019','2019年','3','第三季度','9','九月份','2020-04-24 06:50:53');

    insert into time_type values('34','2019','2019年','4','第四季度','10','十月份','2020-04-24 06:50:53');

    insert into time_type values('35','2019','2019年','4','第四季度','11','十一月份','2020-04-24 06:50:53');

    insert into time_type values('36','2019','2019年','4','第四季度','12','十二月份','2020-04-24 06:50:53');

        (3)医院维度表

    create table hospital(

    id int primary key auto_increment,

    hospital_code VARCHAR(20) comment '医院编码', 

    hospital_name VARCHAR(20) comment '医院名称' 

    )

    insert into hospital(hospital_code,hospital_name) values('6251088','徐水**医院');

    insert into hospital(hospital_code,hospital_name) values('6250007','徐水**医院');

    insert into hospital(hospital_code,hospital_name) values('6250009','保定**医院');

    insert into hospital(hospital_code,hospital_name) values('6251035','保定**医院');

    insert into hospital(hospital_code,hospital_name) values('6251001','保定**医院');

    insert into hospital(hospital_code,hospital_name) values('6251002','保定**医院');

    insert into hospital(hospital_code,hospital_name) values('6251004','保定**院');

    insert into hospital(hospital_code,hospital_name) values('6251888','徐**医院');

    insert into hospital(hospital_code,hospital_name) values('6251005','徐水**医院');

    insert into hospital(hospital_code,hospital_name) values('6258888','徐水**医院');  

        (4)医院级别维度

    CREATE TABLE hospital_level(

      level_code VARCHAR(20) comment '医院级别代码',

      level_name  VARCHAR(20) comment '医院级别名称',

      create_time VARCHAR(20) comment '创建时间'

      )

    insert into hospital_level values ('1','三级医院','2020-04-24 06:50:42');

    insert into hospital_level values ('2','二级医院','2020-04-24 06:50:42');

    insert into hospital_level values ('3','一级医院','2020-04-24 06:50:42');

    insert into hospital_level values ('4','一级以下(社区医疗)','2020-04-24 06:50:42');

        (5)科室维度表

    create table office_type(

      id int primary key auto_increment,

      office_code VARCHAR(32) comment '科室编码',

      office_name VARCHAR(32) comment '科室名称'

    )

    insert into office_type(office_code,office_name) value ('1','普外科');

    insert into office_type(office_code,office_name) value ('2','骨外科');

    insert into office_type(office_code,office_name) value ('3','心内科');

    insert into office_type(office_code,office_name) value ('4','口腔科');

    insert into office_type(office_code,office_name) value ('5','消化科');

    insert into office_type(office_code,office_name) value ('6','肾内科');

    insert into office_type(office_code,office_name) value ('7','眼科');

    insert into office_type(office_code,office_name) value ('8','免疫科');

    insert into office_type(office_code,office_name) value ('9','感染疾病科');

    insert into office_type(office_code,office_name) value ('10','急诊科');

    insert into office_type(office_code,office_name) value ('11','皮肤科');

    insert into office_type(office_code,office_name) value ('12','神经内科');

    insert into office_type(office_code,office_name) value ('13','新生儿内科');

    insert into office_type(office_code,office_name) value ('14','耳鼻喉科科');

    insert into office_type(office_code,office_name) value ('15','呼吸中心');

    insert into office_type(office_code,office_name) value ('16','血液肿瘤中心');

        (6)成本项目维度表

    create table project_type

    (

    id int primary key auto_increment,

     project_code VARCHAR(32) comment '成本项目编码',

     project_name VARCHAR(32) comment '成本项目名称'

    )

    insert into project_type(project_code,project_name) values('1','员经费');

    insert into project_type(project_code,project_name) values('2','卫生材料费');

    insert into project_type(project_code,project_name) values('3','药品费');

    insert into project_type(project_code,project_name) values('4','固定资产折旧');

    insert into project_type(project_code,project_name) values('5','无形资产摊销');

    insert into project_type(project_code,project_name) values('6','提取医疗风险基金');

    insert into project_type(project_code,project_name) values('7','其他费用');

    insert into project_type(project_code,project_name) values('8','合计');

    insert into project_type(project_code,project_name) values('9','科室收入');

    insert into project_type(project_code,project_name) values('10','收入-成本');

    insert into project_type(project_code,project_name) values('11','床日成本');

    insert into project_type(project_code,project_name) values('12','诊次成本');

        (7)收入类别维度表

    create table income_type(

    id int primary key auto_increment,

    income_type_code VARCHAR(32) comment '收入类别编码:1、门诊收入 2、挂号收入 3、诊察收入 4、检查收入 5、化验收入 6、治疗收入 7、手术收入 8、卫生材料收入 9、西药收入 10、中草药收入 11、中成药收入 12、药事服务费收入 13、其他门诊收入 14、住院收入 15、床位收入 16、护理收入 17、其他住院收入',

    income_type_name VARCHAR(32) comment '收入类别名称:1、门诊收入 2、挂号收入 3、诊察收入 4、检查收入 5、化验收入 6、治疗收入 7、手术收入 8、卫生材料收入 9、西药收入 10、中草药收入 11、中成药收入 12、药事服务费收入 13、其他门诊收入 14、住院收入 15、床位收入 16、护理收入 17、其他住院收入'

    )  

    insert into income_type (income_type_code,income_type_name) values('1','门诊收入');

    insert into income_type (income_type_code,income_type_name) values('2','挂号收入');

    insert into income_type (income_type_code,income_type_name) values('3','诊察收入');

    insert into income_type (income_type_code,income_type_name) values('4','检查收入');

    insert into income_type (income_type_code,income_type_name) values('5','化验收入');

    insert into income_type (income_type_code,income_type_name) values('6','治疗收入');

    insert into income_type (income_type_code,income_type_name) values('7','手术收入');

    insert into income_type (income_type_code,income_type_name) values('8','卫生材料收入');

    insert into income_type (income_type_code,income_type_name) values('9','西药收入');

    insert into income_type (income_type_code,income_type_name) values('10','中草药收入');

    insert into income_type (income_type_code,income_type_name) values('11','中成药收入');

    insert into income_type (income_type_code,income_type_name) values('12','药事服务费收入');

    insert into income_type (income_type_code,income_type_name) values('13','其他门诊收入 ');

    insert into income_type (income_type_code,income_type_name) values('14','住院收入');

    insert into income_type (income_type_code,income_type_name) values('15','床位收入');

    insert into income_type (income_type_code,income_type_name) values('16','护理收入');

    insert into income_type (income_type_code,income_type_name) values('17','其他住院收入');

        (8)费用方向维度表

    create table cost_direction_type(

    id int primary key auto_increment,

    cost_direction_code VARCHAR(20) comment '费用方向编码', 

    cost_direction_name VARCHAR(20) comment '费用方向名称' 

    )

    insert into cost_direction_type(cost_direction_code,cost_direction_name) values('1','医疗收入');

    insert into cost_direction_type(cost_direction_code,cost_direction_name) values('2','财政基本补助收入');

    insert into cost_direction_type(cost_direction_code,cost_direction_name) values('3','财政项目补助收入');

    insert into cost_direction_type(cost_direction_code,cost_direction_name) values('4','科教项目收入');

    insert into cost_direction_type(cost_direction_code,cost_direction_name) values('5','其他收入');

    insert into cost_direction_type(cost_direction_code,cost_direction_name) values('6','医疗业务成本');

    insert into cost_direction_type(cost_direction_code,cost_direction_name) values('7','财政项目补助支出');

    insert into cost_direction_type(cost_direction_code,cost_direction_name) values('8','科教项目支出');

    insert into cost_direction_type(cost_direction_code,cost_direction_name) values('9','管理费用');

        上面给出事实表和维度表的定义及数据,本文最开始,我也提到了找算批量insert,可以想想数据量太大了,太麻烦。通过psql编程也是可以实现的,我也懒得写存储过程。

    现在说说数据量大,怎么算的数据量?

    假设,你想给事实表要造10000条记录,应该差不多够了吧???

    总记录数=时间维度表记录数*医院维度表记录数*医院级别维度表记录数*科室维度记录数*成本项目维度记录数*收入类别维度表记录数*费用方向维度表记录数*

    总记录数=36*10*3*16*12*17*9=31726080

     

    PowerDesigner中好像有造测试数据的功能,而且操作方便,实现过程可复用,实现具体如下:

    1、逆向把库中的表引入

    2、指定要操作的用户,其它的用户不要操作,数据安全要注意

    3、指定了用户,再指定要操作用户中的  哪些表(此处我只造了1个表)

    4、导入的表结构如下:

    注意:

    id是主键可以自增加,不用管。

    根据自己的业务需要,给指定的列生成测试数据,此处我选取的是level_code字符串类型和accrual  DOUBLE类型,来演示。表中其它的列,默认会被随机填充上随机的字符串。

    5、双击引入的表结构

    6、找到Columns标签,这里面是表中所有的列,每1个列前面都有个序号,找到要操作的列,双击它前面的序号:此处我双周的是leve_code前面的序号3

    7、为level_code列,创建新的test data profile文件

    8、生成的数据类型指定:

    Automatic:代表着生成 数值类型数据,可以是有规则的递增序列和随机数

    List:代表生成的数据没有规则,可以把这些数据放在一个集合中,数据类型不限制,就像java中的List中保存的是Objct类型一样

        1)、Automatic

    新创建的test data profile已经应用到leve_code列上了

    2)、List

    数据没有规则 (除了数值类型,也可以指定一些字符串类型)

    如果数据有规则

    新创建的test data profile已经应用到accrual列上了

    可以看到,新创建的2个 test data profile

    9、触发运行生成测试数据

    到100%就生成好了

     

     

    Processed: 0.019, SQL: 9