是的,有一个更好的策略。它被称为尺寸建模或星型模式。
您存储一张表,名为事实表,其中包含Campaign,Medium和Supermarket的列。
对于这些属性中的每一个,事实表中的列都是尺寸表的外键。每个Campaigns,Mediums和Supermarkets的一个维度表。
你的情况,以避免数百万行的,你可以第四列添加到事实表,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 Banner Ad和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更多关于三维建模。
容易在五大最佳答案#2我曾经有过!非常感谢:-) – 2014-09-04 22:32:32
不仅是一个很好的答案,但非常好。我想补充一点,在很多情况下,客户端应用程序嵌入在显示的名称控制整数ID(或某种UUID的一个公共API)。因此,不需要连接...只需对id(s)上的WHERE子句进行过滤。甚至更快。 – NaturalData 2014-09-06 04:17:50
@NaturalData,是的,这是一个很好的优化,我正给加入,因为它说明了维度表的作用非常好。 – 2014-09-06 07:46:23