代码之家  ›  专栏  ›  技术社区  ›  Jeff Meatball Yang

数据仓库多维数据集中应用了哪些数据结构和算法?

  •  2
  • Jeff Meatball Yang  · 技术社区  · 15 年前

    我了解多维数据集是用于聚合和“切片”大量数据的优化数据结构。我只是不知道它们是如何实现的。

    我可以想象很多这种技术都是专有的,但是是否有任何资源可以用来开始实现我自己的多维数据集技术?

    集理论和大量的数学可能会涉及(欢迎作为建议!)但我主要对实现感兴趣:数据结构和查询算法。

    谢谢!

    3 回复  |  直到 15 年前
        1
  •  2
  •   Michael Entin    15 年前

    有一本好书描述了SSAS实现的许多内部细节,包括存储和查询机制细节:

    http://www.amazon.com/Microsoft-Server-Analysis-Services-Unleashed/dp/0672330016

        2
  •  1
  •   Cade Roux    15 年前

    在星型模式数据库中,事实通常是以最好的粒度获取和存储的。

    那么让我们以图10中的SalesFact示例为例 http://www.ciobriefings.com/Publications/WhitePapers/DesigningtheStarSchemaDatabase/tabid/101/Default.aspx

    现在,谷物是产品,时间(在一天的粒度),存储。

    假设您希望按月汇总,预聚合(这个特定示例不太可能需要预聚合,但是如果按客户详细说明了销售情况,则按分钟进行预聚合可能是必要的)。

    然后,您每月都会有一个SalesfactMonthly(或者在现有事实表中添加一个谷物歧视,因为维度是相同的-有时在聚合中,您实际上可能会像丢失谷物一样丢失维度,例如,如果您只需要按商店而不是按产品)。

    ProductID
    TimeID (only linking to DayOfMonth = 1)
    StoredID
    SalesDollars
    

    你可以这样做:

    INSERT INTO SalesFactMonthly (ProductID, TimeID, StoreID, SalesDollars)
    SELECT sf.ProductID
        ,(SELECT TimeID FROM TimeDimension WHERE Year = td.Year AND Month = td.Month AND DayOfMonth = 1) -- One way to find the single month dimension row
        ,sf.StoreID
        ,SUM(sf.SalesDollars)
    FROM SalesFact AS sf
    INNER JOIN TimeDimension AS td
        ON td.TimeID = sf.TimeID
    GROUP BY td.Year, td.Month
    

    在立方体中发生的事情基本上是将细粒度星体和预聚集在一起——但每个实现都是专有的——有时甚至可能在立方体中没有最好的粒度数据,因此无法对其进行报告。但是,您可能希望分割数据的每一种方法都需要存储在该粒度上,否则您就无法以这种方式生成分析。

        3
  •  0
  •   Gilbert Le Blanc    15 年前

    通常,数据仓库使用关系数据库,但这些表不像操作关系数据库那样规范化。

    数据仓库是面向主题的。数据仓库主题表通常具有以下特征:

    • 许多指标。

    • 除了查找表外,没有联接。

    • 重复的数据,主题表是 高度非规范化。

    • 包含派生和聚合信息。

    数据仓库中的数据库表按星型模式排列。星型模式基本上是一个带有查找表数组的主题表。查找表的键是主题表中的外键。如果绘制主题表的实体关系图,则查找表将围绕主题表,如星点。

    至于查询,这取决于主题表和行数。通常,查询需要很长时间(几分钟,有时几小时)。

    下面是一篇一般性的文章: Developing a Data Warehouse Architecture

    以下是星型模式设计的高级概述: Designing the Star Schema Database