我正在构建一个分析应用程序,我们可以在其中跟踪公司营销事件的转化情况。转化是指他们去超市购买产品。如果公司是 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/