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

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

我正在构建一个分析应用程序,我们可以在其中跟踪公司营销事件的转化情况。转化是指他们去超市购买产品。如果公司是 Heinz,他们可能会针对不同的产品开展营销事件,因此营销事件可能是:

  • 烤 bean
  • 番茄汤
  • 番茄酱

这些是在线事件,因此它们可以有不同的媒介,例如:

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

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

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

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

  • 用于烤 bean 。
  • 来自 Facebook 页面的烘焙 bean 。
  • 适用于沃尔玛超市,但也适用于所有营销事件和媒体。
  • 适用于通过 Facebook 页面制作的沃尔玛,但适用于所有营销事件。
  • 适用于通过 Flash 横幅广告制作的番茄酱和 Safeway。

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

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

最佳答案

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

您存储一个表,称为事实表,其中包含“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)
);

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

  • 用于烤 bean 。

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

    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有关维度建模的更多信息。

关于database - 适用于多种数据排列的数据模型设计 (RDBMS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25670701/

相关文章:

java - 在 spring 中使用 jdbctemplate 触发 Sequence.nextval 查询

MYSQL 如何按 ID 对条目进行分组并创建包含分组条目的列?

php - 从原始 mysql 文件创建 sql 文件

mySQL和一般数据库规范化问题

database - 表示约束的模型数据库

mysql - 数据库模型和计算余额,mysql

c++ - (C++) 序列化我的客户数据库的最佳方式?

mysql - 如何重新设计每行包含多个值的数据库

mysql - 如何改进这种无模式的数据库模式?

java - 如何在业务流程过程中捕获数据库中实体的状态?