实验二、数据立方体与联机分析处理构建

  • 实验目的:

(1)熟悉 VC++编程工具和基本数据立方体构建、联机分析处理算法。

(2)建立一致的高质量的关系型数据库。

(3)在建立的数据库基础上建立基本数据立方体。

(5)写出实验报告。

二、 实验原理:

1、关系型数据库

关系数据库,是创建在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。关系模型由关系数据结构、关系操作集合、关

系完整性约束三部分组成。

2、数据立方体

一种多维数据模型,允许以多维对数据建模和观察。它由维和事实定义。

维是一个单位想要的透视或实体。每个维可以有一个与人相关联的表,称为维表,它进一步描述维,如 item 维的维表包含属性 Name、time、type等。

事实:多维数据模型围绕诸如销售这样的主题组织,主题用事实表示,事实是数值度量的。

3、OLAP 操作

上卷:沿着一个维的概念分层向上攀升或通过维归约在数据立方体上进行聚集。

下钻:上卷的逆操作,可能过沿维的概念分层向下或引入附加的维来实现。

切片:在给定的数据立方体的一个维上进行选择,导致一个子立方体。就是数据立方体的某一层数据。

切换:在两个或多个维上选择,定义子立方体。就是数据立方体某一层

数据中的某一块。

4、数据仓库的设计

选取待建模的商务处理:都有哪些商务过程,如订单、发票、发货、库存、记账管理、销售或一般分类账。

选取商务处理的粒度:对于商务处理,该粒度是基本的,在事实表中是数据的原子级,如单个事务、一天的快照等。

选取用于每个事实表记录的维:典型的维是时间、商品、顾客、供应商、仓库、事务类型和状态。

选取将安放在每个事实表记录中的度量:典型的度量是可加的数值量,如 dollars_sold 和 units_sold。

三、 实验内容:

1、实验内容

1)用 VC++编程工具编写程序,建立关系型数据存储结构,建立数据立方体,

并在实验报告中写出主要的过程和采用的方法。

建立的数据立方体的维度为 3,分别是商品大类、商店编号和时间。

具体要求:1、建立三个存储表格(txt 文件)分别存储 1019、1020、1021

的数据;

2、每个 txt 文件横向为商品大类(商品 ID 前五位)10010 油、

10020 面制品、10030 米和粉、10088 粮油类赠品;

3、每个 txt 纵向为日期 13-19 这一个星期表中存储的值为总销

售额。

2)进行简单的 OLAP 数据查询

具体要求:能查出 2020 商店 10010 油类商品 13 日总的销售额;

能计算出 2020 商店 10030 米和粉总的销售额;

能查询指定商店指定种类商品的销售额;(附加题)

2、实验步骤

1)仔细研究和审查数据,找出应当包含在你分析中的属性或维去掉不需要

的数据。

2)经过数据预处理后的数值已经补充了缺失值,并统一了格式。

3)读取预处理数据的商品 ID、日期、计算出销售额。

4)选择合适的存储结构,实现数据的存储访问,并实现相应的功能。

3、程序框图

  1. 关键代码

#include<iostream>

#include<string>

#include<fstream>

#include<algorithm>

using namespace std;

class Sales_n//1.定义访问类  

{ public:

  string serial;  

    int market;  

    char date[10];  

    int sn;

    int id;

  float num;  

    float price;

};

int main()

{

    char name1[3][50]={"1019n.txt","1020n.txt","1021n.txt"},name2[3][50]={"1019cube3.txt","1020cube3.txt","1021cube3.txt"};    

    float total[3][10][5]={0};//建立的数据立方体的维度为3,分别是商品大类、商店编号和时间

    for(int i=0;i<3;i++)

    {

        ofstream outfile;

        outfile.open(name2[i],ios::out);

        if(!outfile)

        {

            std::cout<<"open eror!"<<endl;

            exit(1);

        }

        ifstream infile;

        infile.open(name1[i],ios::in);//依次打开文件

        if(!infile)

        {

            std::cout<<"error open!"<<endl;

            exit(1);

        }

        Sales_n sal[10000];

        int sal_size=0;

        int j=0;

        while(!infile.eof())//3.读取文件

        {

            infile >>sal[sal_size].serial>>sal[sal_size].market>>sal[sal_size].date>>sal[sal_size].sn>>sal[sal_size].id>>sal[sal_size].num>>sal[sal_size].price;

    switch (sal[sal_size].id/100)

            {

                case 10010:j=0;break;

                case 10020:j=1;break;

                case 10030:j=2;break;

                case 10088:j=3;break;

                default:continue;

            }

            char p=sal[sal_size].date[7];

            switch(p)

            {//每个txt纵向为日期13-19这一个星期表中存储的值为总销售额

                case '3':total[i][0][j]+=sal[sal_size].num*sal[sal_size].price;break;

                case'4':total[i][1][j]+=sal[sal_size].num*sal[sal_size].price;break;

                case '5':total[i][2][j]+=sal[sal_size].num*sal[sal_size].price;break;

                case'6':total[i][3][j]+=sal[sal_size].num*sal[sal_size].price;break;

                case '7':total[i][4][j]+=sal[sal_size].num*sal[sal_size].price;break;

                case '8':total[i][5][j]+=sal[sal_size].num*sal[sal_size].price;break;

                case '9':total[i][6][j]+=sal[sal_size].num*sal[sal_size].price;break;

            }  

            sal_size++;        

        }

        if (outfile)

        {

            std::cout<<"表格"<<i+1019<<endl;

            std::cout<<"销售日期"<<'\t'<<"10010油"<<'\t'<<"10020面制品"<<'\t'<<"10030米和粉"<<'\t'<<"10088粮油类赠品"<<endl;

            for (int j=0;j<7;++j)

            {

                outfile<<" "<<total[i][j][0]<<'\t'<<total[i][j][1]<<'\t'<<total[i][j][2]<<'\t'<<total[i][j][3]<<'\t'<<endl;

                std::cout<<j+13<<'\t'<<'\t'<<total[i][j][0]<<'\t'<<'\t'<<total[i][j][1]<<'\t'<<'\t'<<total[i][j][2]<<'\t'<<'\t'<<total[i][j][3]<<'\t'<<'\t'<<endl;   

            }

        }

        else

        {

            cerr<<"无法打开文件!"<<endl;

            exit(1);

        }

        outfile.close();//关闭文件

        infile.close();//关闭文件

    }

    for(int i=0;i<3;i++)//数据存储访问

    {

        ifstream infile;

        infile.open(name2[i],ios::in);//依次打开文件

        if(!infile)

        {

            std::cout<<"error open!"<<endl;

            exit(1);

        }

        for(int j=0;j<7;j++)

        {

            infile>>total[i][j][0]>>total[i][j][1]>>total[i][j][2]>>total[i][j][3];

        }

    }

cout<<"----------------------------------------------------------"<<endl;

cout<<"请选择店铺:1:1019店铺、2:1020店铺、3:1021店铺"<<endl;

cout<<"请选择商品类别:1:10010油、2:10020面制品、3:10030米和粉、4:10088粮油类赠品"<<endl;

cout<<"请选择日期:1:13日、2:14日、3:15日、4:16日、5:17日、6:18日、7:19日、8:总的"<<endl;

int select[3];

string shangping[4]={"10010油类商品","10020面制品类商品","10030米和粉类商品","10088粮油类赠品类商品"};

cin>>select[0]>>select[1]>>select[2];

if(select[2]==8)

{

float sum=0.0;

for(int i=0;i<7;i++)

sum+=total[select[0]-1][i][select[1]-1];

cout<<1018+select[0]<<"号商铺"<<shangping[select[1]-1]<<"总销售额为:"<<sum<<endl;

}

else

{

cout<<1018+select[0]<<"号商铺"<<shangping[select[1]-1]<<12+select[2]<<"日销售额为:"<<total[select[0]-1][select[2]-1][select[1]-1]<<endl;

} //能查出2020商店10010油类商品13日总的销售额;

//能计算出2020商店10030米和粉总的销售额;

//能查询出指定商店指定种类商品的销售额

system("PAUSE");

}

  • 实验结果:

1.实验数据

1)1019n.txt

2)1020n.txt:

3)1021n.txt:

2、处理结果

(存储1019n.txt数据的存储表格)

(存储1020n.txt数据的存储表格)

(存储1021n.txt数据的存储表格)

(查询1020号商铺10020面制品类商品18日销售额)

(查询1021号商铺10020面制品类商品13日销售额)

通过该程序,能搭建合适的存储结构,实现数据的存储访问,并实现相应的查询功能

3 、实验结论

数据立方体是多维模型的一种,其本身不只有物理立方体的三维,联机分析处理的主要特点,是直接仿照用户的多角度思考模式,预先为用户组建多维的数据模型,它从设计理念和真正实现上都与旧有的管理信息系统有着本质的区别。

  • 38
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值