2

我正在构建一个分析应用程序,我们在其中跟踪公司营销活动的转化。转换是如果他们去超市购买产品。如果公司是 Heinz,他们可能会针对不同的产品投放广告系列,因此广告系列可能是:

  • 焗豆
  • 蕃茄汤
  • 番茄酱

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

  • 网站
  • 脸书专页
  • Flash 横幅广告
  • 移动应用广告

如果有人购买产品,它是通过超市购买的,例如:

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

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

  • 烤豆。
  • 来自 Facebook 页面的烤豆。
  • 适用于超市沃尔玛,但适用于所有广告系列和媒体。
  • 适用于从 Facebook 页面制作的沃尔玛,但适用于所有广告系列。
  • 用于通过 Flash 横幅广告制作的番茄酱和用于 Safeway。

为了加快分析速度,我们避免处理原始数据(数百万条记录),而是存储每天存储的数据的聚合版本。所以对于 9 月 12 日,我可以存储我们有 12 次烘焙豆转化,6 次转化(所有产品)是通过网站进行的,沃尔玛有 8 次转化,这些可以放在 3 个单独的表中(称为广告系列,媒体和超市)。但是,如果我需要知道通过 Facebook 页面和沃尔玛进行的番茄酱的转换,那么存储在单独的表格中显然是行不通的。

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

4

2 回答 2

3

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

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

对于这些属性中的每一个,事实表中的列是维度表的外键。广告系列、媒介和超市各有一个维度表。

在您的情况下,为了避免数百万行,您可以在事实表中添加第四列,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';
    

查看Ralph Kimball的书籍,了解有关维度建模的更多信息。

于 2014-09-04T16:44:44.570 回答
2

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

把你的精力放在调整而不是设计新的数据结构上,当使用这些分析的人需要一些稍微不同的格式的数据时,你会很感激,这会使你精心策划的设计过时。

于 2014-09-04T16:52:01.650 回答