在 MySQL 中创建 "DWH like" 星型架构

Creating a "DWH like" Star Schema in MySQL

我对数据库还很陌生,SQL 总的来说,我有一个非常重要的任务,但我不知道如何解决。

鉴于我有一家公司(公司 A)和三个不同的子公司(子 A、子 B、子 C)。三个子公司生产相同的产品,可分为三个产品类别:

我的任务是创建一个星级方案,使我能够获得以下信息:产品类别 B 中每个产品的子 A 和子 B 的总收入。

所需的结果格式是 table,包含三列 "Subsidiary Name"、"Product Name" 和 "Revenue"。

到目前为止,我一直在尝试创建以下事实 Table、维度和键。 维度的主键连接到我的事实的外键 Table.

所以我的问题是:

目前,我正在使用使用 XAMPP 创建的本地 MySQL 服务器,并使用 IntelliJ IDEA Ultimate 2016 连接到此服务器。上面的图表也是使用此软件创建的。

希望有人能够并且愿意帮助我。

此外,请原谅任何错误(或者请告诉我我做错了什么),因为我是 SQL 的新手,尤其是 Whosebug 的新手。

亲切的问候

编辑:

我使用了不同的工具来创建和可视化我的 table。另外,正如 fenix 提到的,我添加了几个不同的维度,例如 Time/Date Table。但是,为了解决我的任务,我想我只需要两个维度 dimCompany(代表不同的子公司)和 dimProduct。

  • 您正走在正确的轨道上。应如何构建数据集市的学校示例。真实示例可能包含 companyID、productID 和 salesID 的本机键。请添加 PK_sales 或 PK_fact(无论您喜欢什么)。没有日期或时间戳的事件(一次销售)很少发生,但如果这只是一些概念证明,也许你可以没有它。
  • 你有资料还是想编资料?
    1. 您可以使用 RANDBETWEEN 函数在 excel 中创建一些示例数据。
    2. 许多 MySQL 客户端工具可以选择从 excel、csv 或 txt 文件导入数据。
    3. 或者您可以使用一些免费的数据集成工具,例如 Pentaho Kettle and Talend Open Studio。如果此时太多,请避免此步骤。但是,它将让您深入了解什么是 DI 工具以及如何填充 DWH(在现实生活中的示例中)。
  • 会是这样的:

SELECT dp.ProductName,sum(fs.revenue) as total_revenue FROM fact_sales fs JOIN dim_product dp ON fs.FK_Product = dp.PK_Product JOIN dim_company dc ON fs.FK_Company = dc.PK_Company WHERE dp.Product_Type = 'Product Category B' AND dc.CompanyName IN ('Sub A','Sub B') GROUP BY dp.PK_Product;

不幸的是,一些数据集市结构不佳,因此它不包含参照完整性(反模式),因此您必须使用 LEFT JOIN 而不是 INNER JOIN。请注意 INNER JOINJOIN 相同。关于 JOIN 的一点你可以想象 here.

编辑:

关于您的评论,很难在不让这个答案过于宽泛的情况下取得良好的平衡,因为这个 QA 网站应该为特定的问题和答案提供服务。

由于DWH仍然是一个数据库,它继承了大部分数据库原理。其中之一是 table 键。主键是 唯一的行标识符 ,当数据库设计允许时(在 DWH 世界中它总是应该是)键是整数(正好是大整数)。有关详细信息,请参阅 this

目的?您可以拥有两个名称相同但州不同的公司,因此您需要一些键来区分它们。

为什么它应该是整数?这是一个更技术性的问题,一个 的答案是关于查询优化的。 CPU 将匹配两个整数(4 或 8 个字节)比字符串(VARCHAR 在数据库世界中)快得多,具有 100 多个字节(或者您指定的)。

为什么有人使用 VARCHAR 作为主键?好吧,有时候,尽可能地本土化是一种好方法。因此,VARCHAR 产品的主键可以是产品品牌和柜台(来自供应商)的组合,如果您是转售商,ERP 可以提供 Microsoft Office 2016 键,例如MCR-OFF-123。在 DWH 中,建议存储本机键(无论是 int 还是 varchar)并分配代理主键。

Sub A has the key '1', Sub B has the key '2

引用您的评论。

是的,你是对的。