精华内容
下载资源
问答
  • 数据库模型设计案例

    2020-01-10 11:28:43
    https://www.cnblogs.com/studyzy/archive/2010/01/11/1643976.html
    展开全文
  • 经典实战案例---电信行业CDP之元模型数据中台设计案例
  • 数学建模模型案例解析大全105个如下所示: DVD在线租赁方案的优化模型 Word排版下载地址 world排版技巧数模论文必备 艾滋病疗法的评价及疗效预测 奥运会场馆的人员疏散模型 奥运会临时超市网点的优化设计 ...
  • 机器学习-预测之BP神经网络模型原理及实战

    万次阅读 多人点赞 2019-03-17 15:14:39
    BP神经网络模型

    BP神经网络模型

    简介

    BP网络(Back-Propagation Network)是1986年被提出的,是一种按误差逆向传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一,用于函数逼近、模型识别分类、数据压缩和时间序列预测等。
    来源网络
    BP网络又称为反向传播神经网络,它是一种有监督的学习算法,具有很强的自适应、自学习、非线性映射能力,能较好地解决数据少、信息贫、不确定性问题,且不受非线性模型的限制。一个典型的BP网络应该包括三层:输入层、隐含层和输出层。(关于神经网络的基础术语等知识可以查看我之前的博客)各层之间全连接,同层之间无连接。隐含层可以有很多层,对于一般的神经网络而言,单层的隐含层已经足够了。上图是一个典型的BP神经网络结构图。

    学习过程

    正向传播

    输入信号从输入层经过各个隐含层向输出层传播从,在输出层得到实际的响应值,若实际值与期望值误差较大,就会转入误差反向传播阶段。

    反向传播

    按照梯度下降的方法从输出层经过各个隐含层并逐层不断地调整各神经元的连接权值和阈值,反复迭代,直到网络输出的误差减少到可以接受的程度,或者进行到预先设定的学习次数。

    BP神经网络通过有指导的学习方式进行训练和学习。标准的BP算法采用误差函数按梯度下降的方法学习,使网络的设计输出值和期望输出值之间的均方误差最小。BP神经网络的传输函数通常采用sigmoid函数,而输出层则采用线性传输函数。

    原理

    输入输出层的设计

    • 输入层
      • 输入层各神经元负责接收来自外界的输入信息,并传递给中间层各神经元,它的节点数为输入变量的个数。
    • 输出层
      • 输出层向外界输出信息处理结果。它的节点个数为输出变量的个数。

    隐含层设计

    • 内部信息处理层,负责信息变换,根据信息变换能力的需求,中间层可以设计为单隐层或多隐层结构;最后一个隐含层传递信息到输出层各神经元,经过进一步处理后,完成一次学习的正向传播处理过程。
    • 有关研究表明,一个隐含层的神经网络,只要隐节点足够多,就可以以任意精度逼近一个非线性函数。因此,通常采用含有一个隐层的三层多输入单输出的BP神经网络建立预测模型。
    • 在网络设计过程中,隐层神经元数的确定十分重要。隐层神经元数目过多,会加大网络计算量并容易产生过度拟合问题;神经元数目过少,则会影响网络性能,达不到预期效果。网络中隐层神经元的数目与实际问题的复杂程度、输入和输出层的神经元数及对期望误差的设定有着直接的关系。目前,对于隐层的神经元数目的确定没有明确的公式,只有一些基于经验的公式,神经元的个数最终需要根据经验和多次试验确定。
      L = n + m + a L= \sqrt {n+m} + a L=n+m +a
      其中,n为输入层神经元个数,m为输出层神经元个数,a为1到10之间的常数。

    BP算法改进

    虽然BP神经网络具有高度非线性和较强的泛化能力,但也存在收敛速度慢、迭代步数多、易陷入局部极小和全局搜索能力差等缺点。可以采用增加动量项、自适应调节学习率、引入陡度因子等方法进行改进。

    • 增加动量项
      • 加速算法收敛
      • w i j = w i j − η 1 × δ i j × x i + α ∆ w i j w_{ij} = w_{ij} - \eta_1 \times \delta_{ij}\times x_i + \alpha ∆w_{ij} wij=wijη1×δij×xi+αwij
      • 其中,动量因子 α \alpha α一般为0.1~0.8。
    • 自适应调节率
    • 引入陡度因子

    实战

    案例使用神经网络预测公路运量。

    过程

    • 划分训练集和验证集
    • 建立模型,设定模型参数
    • 对模型进行训练并可视化损失函数变化
    • 模型验证并使用(观察预测值和真实值对比)

      可以看到,效果还是很显著的。
    import numpy as np
    import matplotlib.pyplot as plt
    
    
    def logsig(x):
        """
        定义激活函数
        :param x:
        :return:
        """
        return 1/(1+np.exp(-x))
    
    
    def get_Data():
        """
        读入数据,转为归一化矩阵
        :return:
        """
        # 读入数据
        # 人数(单位:万人)
        population = [20.55, 22.44, 25.37, 27.13, 29.45, 30.10, 30.96, 34.06, 36.42, 38.09, 39.13, 39.99, 41.93, 44.59,
                      47.30, 52.89, 55.73, 56.76, 59.17, 60.63]
        # 机动车数(单位:万辆)
        vehicle = [0.6, 0.75, 0.85, 0.9, 1.05, 1.35, 1.45, 1.6, 1.7, 1.85, 2.15, 2.2, 2.25, 2.35, 2.5, 2.6, 2.7, 2.85, 2.95,
                   3.1]
        # 公路面积(单位:万平方公里)
        roadarea = [0.09, 0.11, 0.11, 0.14, 0.20, 0.23, 0.23, 0.32, 0.32, 0.34, 0.36, 0.36, 0.38, 0.49, 0.56, 0.59, 0.59,
                    0.67, 0.69, 0.79]
        # 公路客运量(单位:万人)
        passengertraffic = [5126, 6217, 7730, 9145, 10460, 11387, 12353, 15750, 18304, 19836, 21024, 19490, 20433, 22598,
                            25107, 33442, 36836, 40548, 42927, 43462]
        # 公路货运量(单位:万吨)
        freighttraffic = [1237, 1379, 1385, 1399, 1663, 1714, 1834, 4322, 8132, 8936, 11099, 11203, 10524, 11115, 13320,
                          16762, 18673, 20724, 20803, 21804]
    
        # 将数据转换成矩阵,并使用最大最小归一数据
        # 输入数据
        samplein = np.mat([population, vehicle, roadarea])  # 3*20
        # 得到最大最小值,方便归一
        sampleinminmax = np.array([samplein.min(axis=1).T.tolist()[0], samplein.max(axis=1).T.tolist()[0]]).transpose()
        # 输出数据
        sampleout = np.mat([passengertraffic, freighttraffic])  # 2*20
        # 得到最大最小值,方便归一
        sampleoutminmax = np.array([sampleout.min(axis=1).T.tolist()[0], sampleout.max(axis=1).T.tolist()[0]]).transpose()
        sampleinnorm = (2 * (np.array(samplein.T) - sampleinminmax.transpose()[0]) / (
                    sampleinminmax.transpose()[1] - sampleinminmax.transpose()[0]) - 1).transpose()
        sampleoutnorm = (2 * (np.array(sampleout.T).astype(float) - sampleoutminmax.transpose()[0]) / (
                    sampleoutminmax.transpose()[1] - sampleoutminmax.transpose()[0]) - 1).transpose()
    
        # 给输入样本添加噪声
        noise = 0.03 * np.random.rand(sampleoutnorm.shape[0], sampleoutnorm.shape[1])
        sampleoutnorm += noise
        return samplein, sampleout, sampleinminmax, sampleoutminmax, sampleinnorm, sampleoutnorm
    
    
    def model_create():
        """
        建立模型并训练
        :return:
        """
        maxepochs = 60000
        learnrate = 0.035
        errorfinal = 0.65 * 10 ** (-3)
        samnum = 20
        indim = 3
        outdim = 2
        hiddenunitnum = 8
        w1 = 0.5 * np.random.rand(hiddenunitnum, indim) - 0.1
        b1 = 0.5 * np.random.rand(hiddenunitnum, 1) - 0.1
        w2 = 0.5 * np.random.rand(outdim, hiddenunitnum) - 0.1
        b2 = 0.5 * np.random.rand(outdim, 1) - 0.1
    
        errhistory = []
        # 开始训练模型
        samplein, sampleout, sampleinminmax, sampleoutminmax, sampleinnorm, sampleoutnorm = get_Data()
        for i in range(maxepochs):
            hiddenout = logsig((np.dot(w1, sampleinnorm).transpose() + b1.transpose())).transpose()
            networkout = (np.dot(w2, hiddenout).transpose() + b2.transpose()).transpose()
            err = sampleoutnorm - networkout
            sse = sum(sum(err ** 2))
            errhistory.append(sse)
            if sse < errorfinal:
                break
            delta2 = err
            delta1 = np.dot(w2.transpose(), delta2) * hiddenout * (1 - hiddenout)
            dw2 = np.dot(delta2, hiddenout.transpose())
            db2 = np.dot(delta2, np.ones((samnum, 1)))
            dw1 = np.dot(delta1, sampleinnorm.transpose())
            db1 = np.dot(delta1, np.ones((samnum, 1)))
            w2 += learnrate * dw2
            b2 += learnrate * db2
            w1 += learnrate * dw1
            b1 += learnrate * db1
    
        # 绘制误差曲线图
        errhistory10 = np.log10(errhistory)
        minerr = min(errhistory10)
        plt.plot(errhistory10)
        plt.plot(range(0, i + 1000, 1000), [minerr] * len(range(0, i + 1000, 1000)))
        ax = plt.gca()
        ax.set_yticks([-2, -1, 0, 1, 2, minerr])
        ax.set_yticklabels([u'$10^{-2}$', u'$10^{-1}$', u'$10^{1}$', u'$10^{2}$', str(('%.4f' % np.power(10, minerr)))])
        ax.set_xlabel('iteration')
        ax.set_ylabel('error')
        ax.set_title('Error Histroy')
        plt.savefig('errorhistory.png', dpi=700)
        plt.close()
    
        # 实现仿真输出和实际输出对比图
        hiddenout = logsig((np.dot(w1, sampleinnorm).transpose() + b1.transpose())).transpose()
        networkout = (np.dot(w2, hiddenout).transpose() + b2.transpose()).transpose()
        diff = sampleoutminmax[:, 1] - sampleoutminmax[:, 0]
        networkout2 = (networkout + 1) / 2
        networkout2[0] = networkout2[0] * diff[0] + sampleoutminmax[0][0]
        networkout2[1] = networkout2[1] * diff[1] + sampleoutminmax[1][0]
    
        sampleout = np.array(sampleout)
    
        fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(12, 10))
        line1, = axes[0].plot(networkout2[0], 'k', marker=u'$\circ$')
        line2, = axes[0].plot(sampleout[0], 'r', markeredgecolor='b', marker=u'$\star$', markersize=9)
    
        axes[0].legend((line1, line2), ('simulation output', 'real output'), loc='upper left')
    
        yticks = [0, 20000, 40000, 60000]
        ytickslabel = [u'$0$', u'$2$', u'$4$', u'$6$']
        axes[0].set_yticks(yticks)
        axes[0].set_yticklabels(ytickslabel)
        axes[0].set_ylabel(u'passenger traffic$(10^4)$')
    
        xticks = range(0, 20, 2)
        xtickslabel = range(1990, 2010, 2)
        axes[0].set_xticks(xticks)
        axes[0].set_xticklabels(xtickslabel)
        axes[0].set_xlabel(u'year')
        axes[0].set_title('Passenger Traffic Simulation')
    
        line3, = axes[1].plot(networkout2[1], 'k', marker=u'$\circ$')
        line4, = axes[1].plot(sampleout[1], 'r', markeredgecolor='b', marker=u'$\star$', markersize=9)
        axes[1].legend((line3, line4), ('simulation output', 'real output'), loc='upper left')
        yticks = [0, 10000, 20000, 30000]
        ytickslabel = [u'$0$', u'$1$', u'$2$', u'$3$']
        axes[1].set_yticks(yticks)
        axes[1].set_yticklabels(ytickslabel)
        axes[1].set_ylabel(u'freight traffic$(10^4)$')
    
        xticks = range(0, 20, 2)
        xtickslabel = range(1990, 2010, 2)
        axes[1].set_xticks(xticks)
        axes[1].set_xticklabels(xtickslabel)
        axes[1].set_xlabel(u'year')
        axes[1].set_title('Freight Traffic Simulation')
    
        fig.savefig('simulation.png', dpi=500, bbox_inches='tight')
        plt.show()
    
    
    if __name__ == '__main__':
        model_create()
    

    补充说明

    参考书《Python3数据分析与机器学习实战》,具体数据集和代码可以查看我的GitHub,欢迎star或者fork。

    展开全文
  • Unity快速入门系列课程(第1部)

    千人学习 2019-05-08 15:49:57
    A:《游戏UI界面框架设计系列视频课程》 https://edu.csdn.net/course/detail/27142 B:《Unity客户端框架设计PureMVC篇视频课程(上)》 https://edu.csdn.net/course/detail/27172 C:《Unity客户端框架设计PureMVC...
  • 软件测试2小时入门

    万人学习 2018-10-10 16:14:16
    主要内容分为5个部分: 1 软件测试概述,了解测试是什么、测试的对象、原则、流程、方法、模型;  2.常用的黑盒测试用例设计方法及示例演示;  3 常用白盒测试用例设计方法及示例演示;  4.自动化...
  • 随书光盘提供了本书所有案例的视频演示教程(超过11个小时)、案例模型及练习题的源文件,以帮助读者获得更详尽、更专业、更系统的训练。  本书适合大、中专院校相关专业的学生及各类CAD/CAM/CAE培训学校的学员阅读...
  • 从零开始学习机器学习视频教程

    万人学习 2017-12-04 22:38:30
    整体课程设计 课程的所有内容都经过讲师的精心挑选。同时,在层次划分上,循序渐进,难易兼顾。让学员们更容易的入门。课程中既包含核心的基础知识,也有高级的进阶操作,做到了“老少皆宜”。 课程分为基础篇,...
  • 数据仓库之模型设计

    千次阅读 2020-03-22 21:01:22
    数据仓库(模型设计) 一、数据仓库与数据库的区别 1、数据仓库是集成的,数据库为单一的业务提供服务。 2、BI结构:数据整合层、数据服务层、应用分析层、信息展现层 3、数据层库结构 ODS(临时存储层),一般...

                            数据仓库(模型设计)

    一、数据仓库与数据库的区别

    1、数据仓库是集成的,数据库为单一的业务提供服务。

    2、BI结构:数据整合层、数据服务层、应用分析层、信息展现层

    3、数据层库结构

            ODS(临时存储层),一般都是贴源设计、业务数据库是什么,ODS层就是什么

    PDW/DW(数据仓库层),将年月日,拆分成年、月、日字段,一般采用Int类型;通过ODS层到DW层的etl脚本对数据进行数据清洗、进行设计。分部门根据业务需求进行设计。如果没有业务需求,就根据源系统的表结构和自己建模经验去处理。

    DM(数据集市层),维度建模,星形模型,雪花模型。需要什么数据就去拉取什么数据。

    APP(应用层),报表展现,需要的数据,与DM层处于同一级别。

    4、ODS层分为增量更新或者全量更新;PDW层一致的、准确的、干净的数据,一般遵循数据库三范式设计。

     

    二、数据仓库的特点

    1、数据仓库是面向主题的,比如商品主题,订单主题。(领导关注那些方面)
    传统数据库面向应用,提供什么功能。数据仓库面向分析,提供那些主题的分析。
    从规模来讲依次是,数据仓库、数据集市、数据报表。
    2、数据仓库是集成的,数据源是分散的,来自不同的应用。数据仓库中的综合数据,不能从源数据中直接得到,一般会经过etl过程(数据抽取、数据转换、数据加载)。数据抽取一般会定时的进行抽取,避免对业务系统造成影响,一般叫做T-1抽取、T+1抽取。目前企业对数据的实时性要求越来越高,比如实时监控一个实时的活动效果,并根据效果进行不同策略的营销手段,保持活动的效果。
    3、数据仓库是不更新的,数据仓库反应的是一段相当长的时间内的数据内容,主要的操作集中在数据查询上。 一般数据结果计算出来之后,特别是明细数据,会存放在关系数据库中,因为主流的报表工具都支持数据库。
    对数据库的查询,最基本的操作是创建索引,比如300万的数据根据手机号查询需要十几秒,创建btree索引之后,需要几十毫秒。
    4、数据仓库中的数据是随着时间而变化的。

    三、数据仓库的模型设计

    A. 数据建模方法论

    数据仓库模型设计遵循“自顶向下、逐步求精”的设计原则。

    模型设计分为三个阶段(四):

    1,业务模型

        主要是从业务需求角度去分析问题

    2,概念模型

    对业务的范围和使用,从高度上进行抽象概括,也就是划分主题域。

    一般划分为8个主题域:

    客户、服务、服务使用、账务、结算、资源、客服、营销

    为什么要划分主题域?

    划分主题域,是根据业务的应用和需要来划分的,是用来达到数据与业务紧耦合的目的。

    3,逻辑模型

    对概念模型中的主题进行细化,定义实体与实体之间的关系,和实体的属性。

    即定义具体表的作用,表与表的约束,表的字段。形成ER图。

    这些实体的设计都是基于业务规则,可以说,这一阶段主要面对的是业务。也就是“业务驱动建模

    4,物理模型

    依照逻辑模型,在数据库中进行建表、索引等。数据仓库,为了满足高性能的需求,可以增加冗余、隐藏表之间的约束等反第三范式操作

    这一阶段,主要针对的是数据库、硬件、性能。

    范式

    第一范式:数据库表的字段都是单一属性,不可再分。

    第二范式:数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖。

    (部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况)。即要求所有属性都依赖于主键。

    第三范式:数据库表中不存在非关键字段对任一候选关键字段的传递函数依赖

    范式是向下兼容的。

    例如:

    学生ID

    学生名称

    学生部门

    课程ID

    课程名称

    成绩

    60100

    张三

    教育学院,心理系,1班

    English_1

    英语1

    80

    1)违反第一范式。因为:学生部门可以分解为:学院,系,班级

    2)违反第二范式。因为:关键字段是学生ID和课程ID, 但存在“课程ID”决定课程名称和课程学分。

    3)违反第三范式。因为:关键字段是学生ID,但存在可能名称和学分依赖“课程ID”。

    星型模型和雪花模型

    首先,他们都是由一个事实表和一组维度表组成。

    星型模型,也被称为维度建模

    区别在于:

    星型模型:维度表直接跟事实表连接,图型像星星。

    如区县和地市做为同一维度都在地市表中。

    *维度预处理,维度会预先进行分类,排序等预处理。

    雪花模型:一些维度表不是直接与事实表连接,而是通过维度表中转,图形像雪花。

    例如:

    图1:星型模型

    图2 雪花模型

    从性能来看,星型模型查询性能好。

    为了提高性能,可以允许违反第三范式,适当的冗余、隐藏表之间的约束。

    维度建模

    将商业维度融合到数据模型中,由此得名维度建模。

    或者说,为了分析方便(商业应用要求),将同一维度的不同层次的维度(如地市ID,区县ID)都融合到事实表中(如用户宽表)。

    维度模型也是星型模型。

    它 强调的是先对维度进行预处理,将多个维度集合到一个事实表,形成一个宽表,如上面的用户统一视图。包含了20多个维度。这样可以组合各维度,形成灵活的报表查询。

    B. 分层设计原则

    电信行业的数据仓库都采用了分层设计原则。

    总的来说,分三层:接口层、中间汇总层和应用层。

    应用层

    数据集市

    地市数据集市、数据挖掘

    应用层

    KPI报表、cagnos、主题分析、指标库

    中间层

    深度汇总层

    信息聚合:用户统一视图、3G用户统一视图、固话用户统一视图

    业务拓展:用户行为、增值业务、集团业务、国际业务

    轻度汇总层

    清单汇总、用户属性聚合、费用汇总、集团客户汇总等

    接口层

    存储层

    接口备份、增量转全量、减少I/O(分常用数据和历史数据)

    接口层

    日接口、月接口、增量接口、全量接口

    特别强调的是:

    中间层是数据仓库最重要的一层。直接决定了数据仓库的性能。

    一般的做法是:

    1)数据汇总。将底层数据按维度进行小颗粒度汇总

    2)信息聚合。将多张表的信息聚合在一个表中。这样的好处,是避免使用表关联,提高查询性能。

    C. 主题域设计方法

    如果说分层设计,是横向的设计原则,那么主题分域是纵向的处理方法。

    具体做法就是从业务上,高度的抽象和归纳,将数据划分为不同的主题域。

    分域后的好处:业务紧耦合、便于数据拓展、便于使用。

    域是要具有明显的表命名规则,如:

    用户信息域—— user

    通信行为—— call

    数据业务—— gprs

    账务 —— bill

    客户服务—— serv

    xx经分 系统的数据架构图:

             

    展开全文
  • 数据仓库多维数据模型设计

    万次阅读 多人点赞 2017-11-09 18:14:59
    建设数据模型既然是整个数据仓库建设中一个非常重要的关键部分,那么,怎么建设我们的数据仓库模型就是我们需要解决的一个问题。这里我们将要详细介绍如何创建适合自己的数据模型。 数据仓库建模方法 大千世界,...

    建设数据模型既然是整个数据仓库建设中一个非常重要的关键部分,那么,怎么建设我们的数据仓库模型就是我们需要解决的一个问题。这里我们将要详细介绍如何创建适合自己的数据模型。


    数据仓库建模方法

    大千世界,表面看五彩缤纷,实质上,万物都遵循其自有的法则。

    数据仓库的建模方法同样也有很多种,每一种建模方法其实代表了哲学上的一个观点,代表了一种归纳,概括世界的一种方法。

    目前业界较为流行的数据仓库的建模方法非常多,这里主要介绍范式建模法,维度建模法,实体建模法等几种方法,每种方法其实从本质上讲就是从不同的角度看我们业务中的问题,不管从技术层面还是业务层面,其实代表的是哲学上的一种世界观。

    我们下面给大家详细介绍一下这些建模方法。


    范式建模法(Third Normal Form,3NF)

    范式建模法其实是我们在构建数据模型常用的一个方法,该方法的主要由 Inmon 所提倡,主要解决关系型数据库得数据存储,利用的一种技术层面上的方法。
    目前,我们在关系型数据库中的建模方法,大部分采用的是三范式建模法。
    范式是数据库逻辑模型设计的基本理论,一个关系模型可以从第一范式到第五范式进行无损分解,这个过程也可称为规范化。
    在数据仓库的模型设计中目前一般采用第三范式,它有着严格的数学定义。从其表达的含义来看,一个符合第三范式的关系必须具有以下三个条件 :
    每个属性值唯一,不具有多义性 ;
    每个非主属性必须完全依赖于整个主键,而非主键的一部分 ;
    每个非主属性不能依赖于其他关系中的属性,因为这样的话,这种属性应该归到其他关系中去。
    由于范式是基于整个关系型数据库的理论基础之上发展而来的,因此,本人在这里不多做介绍,有兴趣的读者可以通过阅读相应的材料来获得这方面的知识。
    根据 Inmon 的观点,数据仓库模型得建设方法和业务系统的企业数据模型类似。在业务系统中,企业数据模型决定了数据的来源,而企业数据模型也分为两个层次,即主题域模型和逻辑模型。同样,主题域模型可以看成是业务模型的概念模型,而逻辑模型则是域模型在关系型数据库上的实例。

    从业务数据模型转向数据仓库模型时,同样也需要有数据仓库的域模型,即概念模型,同时也存在域模型的逻辑模型。
    这里,业务模型中的数据模型和数据仓库的模型稍微有一些不同。主要区别在于:
    数据仓库的域模型应该包含企业数据模型的域模型之间的关系,以及各主题域定义。
    数据仓库的域模型的概念应该比业务系统的主题域模型范围更加广。
    在数据仓库的逻辑模型需要从业务系统的数据模型中的逻辑模型中抽象实体,实体的属性,实体的子类,以及实体的关系等。
    以笔者的观点来看,Inmon 的范式建模法的最大优点就是从关系型数据库的角度出发,结合了业务系统的数据模型,能够比较方便的实现数据仓库的建模。
    但其缺点也是明显的,由于建模方法限定在关系型数据库之上,在某些时候反而限制了整个数据仓库模型的灵活性,性能等,特别是考虑到数据仓库的底层数据向数据集市的数据进行汇总时,需要进行一定的变通才能满足相应的需求。


    维度建模法

    维度建模法,Kimball 最先提出这一概念。其最简单的描述就是,按照事实表,维表来构建数据仓库,数据集市。

    事实表是用来记录具体事件的,包含了每个事件的具体要素,以及具体发生的事情;维表则是对事实表中事件的要素的描述信息。

    比如一个事件会包含时间、地点、人物、事件,事实表记录了整个事件的信息,但对时间、地点和人物等要素只记录了一些关键标记,比如事件的主角叫“Michael”,那么Michael到底“长什么样”,就需要到相应的维表里面去查询“Michael”的具体描述信息了。

    基于事实表和维表就可以构建出多种多维模型,包括星形模型、雪花模型和星座模型。

    维度建模法最被人广泛知晓的名字就是星型模式(Star-schema)。

    [1345621614_4017.JPG]

    上图的这个架构中是典型的星型架构。星型模式之所以广泛被使用,在于针对各个维作了大量的预处理,如按照维进行预先的统计、分类、排序等。
    通过这些预处理,能够极大的提升数据仓库的处理能力。
    特别是针对 3NF 的建模方法,星型模式在性能上占据明显的优势。
    同时,维度建模法的另外一个优点是,维度建模非常直观,紧紧围绕着业务模型,可以直观的反映出业务模型中的业务问题。
    不需要经过特别的抽象处理,即可以完成维度建模。这一点也是维度建模的优势。
    但是,维度建模法的缺点也是非常明显的,由于在构建星型模式之前需要进行大量的数据预处理,因此会导致大量的数据处理工作。
    而且,当业务发生变化,需要重新进行维度的定义时,往往需要重新进行维度数据的预处理。
    而在这些与处理过程中,往往会导致大量的数据冗余。
    另外一个维度建模法的缺点就是,如果只是依靠单纯的维度建模,不能保证数据来源的一致性和准确性,而且在数据仓库的底层,不是特别适用于维度建模的方法。
    因此以笔者的观点看,维度建模的领域主要适用与数据集市层,它的最大的作用其实是为了解决数据仓库建模中的性能问题。
    维度建模很难能够提供一个完整地描述真实业务实体之间的复杂关系的抽象方法。


    实体建模法

    实体建模法并不是数据仓库建模中常见的一个方法,它来源于哲学的一个流派。
    从哲学的意义上说,客观世界应该是可以细分的,客观世界应该可以分成由一个个实体,以及实体与实体之间的关系组成。
    那么我们在数据仓库的建模过程中完全可以引入这个抽象的方法,将整个业务也可以划分成一个个的实体,而每个实体之间的关系,以及针对这些关系的说明就是我们数据建模需要做的工作。
    虽然实体法粗看起来好像有一些抽象,其实理解起来很容易。
    即我们可以将任何一个业务过程划分成 3 个部分,实体,事件和说明。
    例如我们描述一个简单的事实:“小明开车去学校上学”。以这个业务事实为例,我们可以把“小明”,“学校”看成是一个实体,“上学”描述的是一个业务过程,我们在这里可以抽象为一个具体“事件”,而“开车去”则可以看成是事件“上学”的一个说明。
    从上面的举例我们可以了解,我们使用的抽象归纳方法其实很简单,任何业务可以看成 3 个部分:
    实体,主要指领域模型中特定的概念主体,指发生业务关系的对象。
    事件,主要指概念主体之间完成一次业务流程的过程,特指特定的业务过程。
    说明,主要是针对实体和事件的特殊说明。
    由于实体建模法,能够很轻松的实现业务模型的划分,因此,在业务建模阶段和领域概念建模阶段,实体建模法有着广泛的应用。从笔者的经验来看,再没有现成的行业模型的情况下,我们可以采用实体建模的方法,和客户一起理清整个业务的模型,进行领域概念模型的划分,抽象出具体的业务概念,结合客户的使用特点,完全可以创建出一个符合自己需要的数据仓库模型来。
    但是,实体建模法也有着自己先天的缺陷,由于实体说明法只是一种抽象客观世界的方法,因此,注定了该建模方法只能局限在业务建模和领域概念建模阶段。因此,到了逻辑建模阶段和物理建模阶段,则是范式建模和维度建模发挥长处的阶段。
    因此,笔者建议读者在创建自己的数据仓库模型的时候,可以参考使用上述的三种数据仓库得建模方法,在各个不同阶段采用不同的方法,从而能够保证整个数据仓库建模的质量。


    维度建模法数据模型的区别

    多维数据模型是最流行的数据仓库的数据模型,多维数据模型最典型的数据模式包括星型模式、雪花模式和事实星座模式,本文以实例方式展示三者的模式和区别。


    星型模式(star schema)

    星型模式的核心是一个大的中心表(事实表),一组小的附属表(维表)。星型模式示例如下所示:

    [903014-20160324180338683-1916113766.jpg]

    [200916184066377.jpg]

    可以看出,星形模式的维度建模由一个事实表和一组维表成,且具有以下特点:

    a. 维表只和事实表关联,维表之间没有关联;

    b. 每个维表的主码为单列,且该主码放置在事实表中,作为两边连接的外码;

    c. 以事实表为核心,维表围绕核心呈星形分布;


    雪花模式(snowflake schema)

    雪花模式是星型模式的扩展,其中某些维表被规范化,进一步分解到附加表(维表)中。雪花模式示例如下图所示:

    [903014-20160324180236104-1134926519.jpg]

    [200918380319666.jpg]

    从图中我们可以看到地址表被进一步细分出了城市(city)维。supplier_type表被进一步细分出来supplier维。

    星形模式中的维表相对雪花模式来说要大,而且不满足规范化设计。雪花模型相当于将星形模式的大维表拆分成小维表,满足了规范化设计。然而这种模式在实际应用中很少见,因为这样做会导致开发难度增大,而数据冗余问题在数据仓库里并不严重。


    事实星座模式(Fact Constellation)或星系模式(galaxy schema)

    数据仓库由多个主题构成,包含多个事实表,而维表是公共的,可以共享,这种模式可以看做星型模式的汇集,因而称作星系模式或者事实星座模式。本模式示例如下图所示:

    [903014-20160324175828948-2089267269.jpg]

    [200924338912918.jpg]

    如上图所示,事实星座模式包含两个事实表:sales和shipping,二者共享维表。

    事实星座模式是数据仓库最常使用的数据模式,尤其是企业级数据仓库(EDW)。

    前面介绍的两种维度建模方法都是多维表对应单事实表,但在很多时候维度空间内的事实表不止一个,而一个维表也可能被多个事实表用到。在业务发展后期,绝大部分维度建模都采用的是星座模式。

    这也是数据仓库区别于数据集市的一个典型的特征,从根本上而言,数据仓库数据模型的模式更多是为了避免冗余和数据复用,套用现成的模式,是设计数据仓库最合理的选择。


    三种模式对比

    归纳一下,星形模式/雪花模式/星座模式的关系如下图所示:

    [903014-20160324103125073-1838397443.jpg]


    实例

    在进行维度建模前,首先要了解用户需求。而笔者在数据库系列的第一篇就讲过,ER建模是当前收集和可视化需求的最佳技术。因此假定和某零售公司进行多次需求PK后,得到以下ER图:
    [903014-20160324160704776-1647702727.png]

    随后可利用建模工具将ER图直接映射到关系图:
    [903014-20160324160724151-2139740081.png]

    需求搜集完毕后,便可进行维度建模了。本例采用星形模型维度建模。但不论采取何种模式,维度建模的关键在于明确下面四个问题:

    1.哪些维度对主题分析有用?

    本例中,根据产品(PRODUCT)、顾客(CUSTOMER)、商店(STORE)、日期(DATE)对销售额进行分析是非常有帮助的;

    2.如何使用现有数据生成维表?

    a. 维度PRODUCT可由关系PRODUCT,关系VENDOR,关系CATEGORY连接得到;

    b. 维度CUSTOMER和关系CUSTOMER相同;

    c. 维度STORE可由关系STROE和关系REGION连接得到;

    d. 维度CALENDAR由关系SALESTRANSACTION中的TDate列分离得到;

    3.用什么指标来”度量”主题?

    本例的主题是销售,而销量和销售额这两个指标最能直观反映销售情况;

    4.如何使用现有数据生成事实表?

    销量和销售额信息可以由关系SALESTRANSACTION和关系SOLDVIA,关系PRODUCT连接得到;

    明确这四个问题后,便能轻松完成维度建模:

    [903014-20160324160936308-1545323262.png]

    细心的读者会发现三个问题:1. 维表不满足规范化设计(不满足3NF);2. 事实表也不满足规范化设计(1NF都不满足); 3. 维度建模中各维度的主码由***ID变成***Key;

    对于前两个问题,由于当前建模环境是数据仓库,而没有更新操作,所以不需要严格做规范化设计来消除冗余避免更新异常。

    因此虽然可以以雪花模型进行维度建模,如下所示:

    [903014-20160324162335339-887948324.png]

    但这样会加大查询人员负担:每次查询都涉及到太多表了。因此在实际应用中,雪花模型仅是一种理论上的模型。星座模型则出现在”维度建模数据仓库”中,本文后面将会讲到。

    对于第三个问题,***Key这样的字段被称为代理码(surrogate key),它是一个通过自动分配整数生成的主码,没有任何其他意义。使用它主要是为了能够处理”缓慢变化的维度”。


    经典星座模型

    前文已经讲过,有多个事实表的维度模型被称为星座模型。星座模型主要有以下两大作用:共享维度和设置细节/聚集事实表。下面分别对这两种情况进行分析:

    1. 共享维度

    以前文提到的零售公司为例,假如该公司质量监管部门希望用分析销售主题同样的方法分析劣质产品,那么此时不需要重新维度建模,只需往模型里加入一个新的劣质产品事实表。之后新的数据仓库维度建模结果如下:

    [903014-20160324163010683-2065536046.png]

    1. 细节/聚集事实表

    细节事实表(detailed fact tables)中每条记录表示单一事实,而聚集事实表(aggregated fact tables)中每条记录则聚合了多条事实。从表的字段上看,细节事实表通常有设置TID属性,而聚集事实表则无。

    两种事实表各有优缺点,细节事实表查询灵活但是响应速度相对慢,而聚集事实表虽然提高了查询速度,但使查询功能受到一定限制。一个常见的做法是使用星座模型同时设置两种事实表(可含多个聚集事实表)。这种设计方法中,聚集事实表使用和细节事实表细节事实表的维度。如下维度建模方法采用星座模型综合了细节事实表和两种聚集事实表:

    [903014-20160324163348964-833179105.png]

    展开全文
  • C# For Unity系列之入门篇

    万人学习 2017-03-26 14:00:01
    A:《游戏UI界面框架设计系列视频课程》 https://edu.csdn.net/course/detail/27142 B:《Unity客户端框架设计PureMVC篇视频课程(上)》 https://edu.csdn.net/course/detail/27172 C:《Unity客户端框架设计PureMVC...
  • 汽车租赁系统表设计案例需求分析00设计+物理模型设计设计) 案例 需求分析 业务流程分析 主要业务流程分析: 租赁公司购置新车; 租赁公司淘汰旧车; 用户租车; 用户换车; 用例分析 概念模型分析 ...
  • Python爬虫+数据清洗+数据可视化基础案例

    万次阅读 多人点赞 2019-12-04 22:56:52
    最近迷上了Python爬虫,我们的hadoop课程也正好涉及到了这个内容,所以就想结合课程内容(爬取京东手机评论...打开网站https://item.jd.com/100003060627.html#crumb-wrap检查 ...
  • 基于模型预测控制(MPC)的车道保持控制实现方法

    万次阅读 多人点赞 2019-04-10 19:05:44
    MATLAB 2018b中有一个关于车道保持的案例,本次设计模型控制算法部分与案例相同,但是车辆对象采用Carsim中的车辆模型。整个基于模型预测控制的车道保持系统simulink仿真框架如下所示 图 1 在实际的车辆保持...
  • 从基于案例推理和认知心理学的思想出发,提出包含问题情境、求解情境和解情境的设计情境概念,并建立基于案例的工业设计情境模型。该模型包含工业设计情境组织框架和情境推理模型。在此基础上以数控机床为对象,对该...
  • 数据仓库作为全行或全公司的数据中心和总线,汇集了全行各系统以及外部数据,通过良好的系统架构可以保证系统稳定性和...1、各数据分区的模型设计思路: 数据架构部分中提到了在数据仓库中主要分为以下区域,那...
  • 介绍 处理分组数据和复杂...在R中,有两种主要的方法来拟合多级模型,这些模型考虑了数据中的这种结构。这些教程将向用户展示如何使用lme4R中的包来拟合线性和非线性混合效果模型,以及如何使用rstan以完全适...
  • 关系数据库模型设计

    千次阅读 2020-05-19 17:13:17
    本文从现实世界-概念世界(信息世界)-机器世界(数据世界)逐级抽象,旨在以浅显易懂的语言描述关系数据库应该如何建模,最后用简单名了的描述给出关系模型设计范式的含义。
  • 《MATLAB神经网络30个案例分析》学习笔记

    万次阅读 多人点赞 2016-09-04 20:53:31
    《MATLAB神经网络30个案例分析》学习记录(待更新):1. 数据分类,分类——多个输出,向量表示 [1 0 0] [0 1 0] [0 0 1]这样2. 分线性系统建模,拟合参数,用一定量的输入输出数据训练神经网络即可3. 遗传算法...
  • 领域模型项目示例

    2019-04-05 01:16:20
    NULL 博文链接:https://ainn2006.iteye.com/blog/1522782
  • saas平台由于其本身“按需购买”的特性,在设计规划权限时,需要考虑统一配置权限如何规避企业没有购买的应用,以及如有部分应用存在数据权限不同的问题。现在,本文简单总结一下当前saas模式下权限的几种设计方式。...
  • javaScript学习笔记(一)js基础

    万次阅读 多人点赞 2018-09-21 10:07:18
    2、特点: 交互性(它可以做的就是信息的动态交互) 安全性(不允许直接访问本地硬盘) 跨平台性(只要是可以解析js的浏览器都可以执行,和平台无关) 3、和Java区别: 4、作用 avaScript 被用来改进设计、验证表单...
  • 基于MATLAB的智能交通信号灯控制系统的实现

    万次阅读 多人点赞 2019-04-06 18:43:22
    实时配时模型设计 的理论知识,这里就不再 赘述了,通过上方给出的文献,也可以在知网上搜寻其他文献,来了解下理论内容。接下来,主要将智能交通信号灯控制系统的核心部分(即实时配时算法),用MATLAB工具进行设计...
  • 【课程设计】 课程内容基于最新的Keras版本(你也可以使用 TensorFlow 2 的 tf.keras 模块),其中有大量独家解读、案例,以及不少讲师一线实战多年的方法论和深度思考。同时,在层次划分上,难易兼顾,循序渐进。...
  • PHP动态网页设计与制作案例教程

    热门讨论 2012-12-12 10:53:30
    本书展示一个完整网站设计和实现过程,详细地介绍动态网页设计和制作的技术和相关理论,全书共分为8章,主要内容包括:动态网站设计概述、动态网站编程环境、网站主页设计与PHP基础、网站计数器设计与PHP文件访问...
  • 领域模型设计(20190407)

    千次阅读 2019-04-07 15:50:41
    业务模型的设计无定式,领域模型设计也不是适应任何业务,对于复杂业务逻辑可考虑使用。 领域模型实践心得 领域模型与传统业务分层区别 使用Spring框架的项目,业务模型通常是: Bean-Service-Dao 其...
  • OptiSystem 仿真软件模型案例 1 / 43 目 录 1 光发送机Optical Transmitters 设计 1.1 光发送机简介 1.2 光发送机设计模型案例铌酸锂LiNbO 型Mach-Zehnder 调制器的啁啾Chirp 3 分析 2 光接收机Optical Receivers ...
  • 建立实体-关系模型案例

    千次阅读 2019-04-25 15:10:06
    一、标识实体 ...  到这里,也就完成了实体-R模型建立的全过程,有时,对于比较复杂的实体-关系模型,一张图可能显得太过局促,可以建立全局、局部实体-关系模型图,以便于查看和分析。 转自:百度百科, ...
  • HBase rowkey设计案例

    千次阅读 2018-01-22 22:44:14
    hbase所谓的三维有序存储的三维是指:rowkey(行主键),column key(columnFamily+qualifier),timestamp(时间戳)三...所以 rowkey的设计是至关重要的,关系到你应用层的查询效率。 rowkey是以字典顺序排序的,存...
  • OptiSystem仿真模型案例

    2012-04-21 14:42:37
    OptiSystem仿真模型案例,有五个实例。适合初级学习者学习

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 125,914
精华内容 50,365
关键字:

表模型设计案例网站