实验二、数据立方体与联机分析处理
学院 计算机科学与软件学院 班级姓名学号
• 实验目的:
(1)熟悉 VC++编程工具和基本数据立方体构建、联机分析处理算法。
(2)建立一致的高质量的关系型数据库。
(3)在建立的数据库基础上建立基本数据立方体。
• 实验原理
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)仔细研究和审查数据,找出应当包含在你分析中的属性或维去掉不需要 的数据。
1、经过数据预处理后的数值已经补充了缺失值,并统一了格式。
2、读取预处理数据的商品ID、日期、计算出销售额。
2)选择合适的存储结构,实现数据的存储访问,并实现相应的功能。
3、主要程序代码
1、读入文件数据
while(!infile.eof())
{
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; sal_size++;
}
2、计算,进行简单的OLAP操作
int m[4]={10010,10020,10030,10088};
for(int i=0;i
{
char q=sal[i].date[6];
char p = sal[i].date[7];
int t=sal[i].id /100;
for(j=0;j
{
if(m[j]==t)
{jj=j;break;}
}
if(q=='1')
{
switch(p)
{
case '3':total[0][j]+=sal[i].num*sal[i].price;break;
case '4':total[1][j]+=sal[i].num*sal[i].price;break; case '5':total[2][j]+=sal[i].num*sal[i].price;break; case '6':total[3][j]+=sal[i].num*sal[i].price;break; case '7':total[4][j]+=sal[i].num*sal[i].price;break; case '8':total[5][j]+=sal[i].num*sal[i].price;break; case '9':total[6][j]+=sal[i].num*sal[i].price;break; }
}
else {}
}
3、输出结果,写入到文件
if (outfile)
{
cout
int j = 20030413;
for (int i=0;i
{
outfile
total[i][0]
cout
total[i][0]
j++;
}
}
• 实验结果: