适用于多种数据排列的数据模型设计(RDBMS)

时间:2014-09-04 16:33:20

标签: database database-design data-modeling rdbms dimensional-modeling

我正在构建Google Analytics应用程序,我们会跟踪公司营销广告系列的转化情况。转换是指他们去超市购买产品。如果公司是亨氏,他们可能会为不同的产品投放广告系列,因此广告系列可能是:

  • 烤豆
  • 番茄汤
  • 番茄酱

这些是在线广告系列,因此可以使用不同的媒介,例如:

  • 网站
  • Facebook页面
  • Flash横幅广告
  • 移动应用广告

如果有人购买产品,可以通过超市购买,例如:

  • 沃尔玛
  • 阿斯达
  • 西夫韦
  • 罗格

我们正在跟踪所有这些转化。分析应用程序需要显示上述任意组合的转换数据。例如,我可能需要显示转​​换...

  • for Baked Beans。
  • 来自Facebook页面的烤豆。
  • 适用于超市沃尔玛,适用于所有广告系列&介质。
  • 为沃尔玛制作的Facebook页面,但适用于所有广告系列。
  • 通过Flash横幅广告和Safeway制作番茄酱。

为了快速进行分析,我们避免处理原始数据(数百万条记录),而是存储每天存储的数据的聚合版本。因此,对于9月12日的说法,我可以存储我们有12次转换为Baked Beans,6次转换(所有产品)都是通过网站制作的,而Walmart有8次转换,这些可以分为3个单独的表格(称为Campaigns,媒体和超市)。但是,如果我需要知道通过Facebook页面和沃尔玛制作番茄酱的转换,那么存储在单独的表格中显然不会起作用。

我正努力想出一个可以支持上述内容的数据模型。我使用的是标准的Relational数据库(MySQL)。也许有一个更好的策略来处理这个问题。

2 个答案:

答案 0 :(得分:3)

是的,有更好的策略。它被称为维度建模或星型模式。

您存储一个名为 Fact Table 的表,其中包含Campaign,Medium和Supermarket的列。

对于这些属性中的每一个,Fact Table中的列是维度表的外键。每个广告系列,广告系列,媒体和超市。

在您的情况下,为避免数百万行,您可以向事实表conversions添加第四列。获得转换时增加计数(而不是添加另一行)。

这是一个示例表:

CREATE TABLE FactTable (
  campaign_id INT,
  medium_id INT,
  supermarket_id INT,
  conversions INT,
  PRIMARY KEY (campaign_id, medium_id, supermarket_id),
  FOREIGN KEY (campaign_id) REFERENCES Campaigns(campaign_id),
  FOREIGN KEY (medium_id) REFERENCES Mediums(medium_id),
  FOREIGN KEY (supermarket_id) REFERENCES Supermarkets(supermarket_id)
);

然后您可以查询所有转化:

  • 焗豆。

    SELECT SUM(conversions) FROM FactTable
    JOIN Campaigns USING (campaign_id) 
    WHERE campaign = 'Baked Beans';
    
  • 来自Facebook页面的烤豆。

    SELECT SUM(conversions) FROM FactTable
    JOIN Campaigns USING (campaign_id) 
    JOIN Mediums USING (medium_id)
    WHERE campaign = 'Baked Beans' AND medium = 'Facebook';
    
  • 适用于超市沃尔玛,但适用于所有广告系列&介质。

    SELECT SUM(conversions) FROM FactTable
    JOIN Supermarkets USING (supermarket_id)
    WHERE supermarket = 'Walmart';
    
  • 为沃尔玛制作的Facebook页面,但适用于所有广告系列。

    SELECT SUM(conversions) FROM FactTable
    JOIN Mediums USING (medium_id)
    JOIN Supermarkets USING (supermarket_id)
    WHERE medium = 'Facebook' AND supermarket = 'Walmart';
    
  • 通过Flash横幅广告和Safeway制作番茄酱。

    SELECT SUM(conversions) FROM FactTable
    JOIN Campaigns USING (campaign_id)
    JOIN Mediums USING (medium_id)
    JOIN Supermarkets USING (supermarket_id)
    WHERE campaign = 'Ketchup' AND medium = 'Flash Banner Ad' AND supermarket = 'Safeway';
    

有关尺寸建模的更多信息,请查看books by Ralph Kimball

答案 1 :(得分:2)

我认为通过尝试操纵您的数据结构以避免处理原始数据,您正在增加复杂性并降低灵活性,而实际收益却很小。通过适当的索引和适当调整的查询,查询数百万条记录应该花费很少的时间。我在多个字段中查询了有5亿条记录的表格,并在20毫秒内得到了结果。

将您的精力投入到调优而不是设计新的数据结构中,当您使用这些分析的人需要一些稍微不同的格式来使您精心策划的设计过时时,您会感激不尽。