mysql - 在 MySQL 中创建一个 "DWH like"星型模式

标签 mysql database data-warehouse star-schema

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

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

  • 产品类别 A
  • 产品类别 B
  • 产品类别 C

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

结果需要的格式是一个包含“子公司名称”、“产品名称”和“收入”三列的表格。

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

Structure Approach

所以我的问题是:

  • 我是在正确的轨道上还是这种方法完全错误?

  • 我实际上如何用示例数据“填充”我的表,以便能够编写回答上述给定问题的查询?

  • 这样的查询会是什么样子?

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

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

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

亲切的问候

编辑:

我使用了不同的工具来创建和可视化我的表格。此外,正如 fenix 所提到的,我添加了几个不同的维度,例如时间/日期表。但是,为了解决我的任务,我想我只需要两个维度 dimCompany(代表不同的子公司)和 dimProduct。 enter image description here

最佳答案

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

SELECT dp.ProductName,sum(fs.revenue) 作为 total_revenue FROM fact_sales fs 加入 dim_product dp ON fs.FK_Product = dp.PK_Product 加入 dim_company dc ON fs.FK_Company = dc.PK_Company WHERE dp.Product_Type = '产品类别 B' AND dc.CompanyName IN ('Sub A','Sub B') GROUP BY dp.PK_Product;

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

编辑:

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

由于DWH还是一个数据库,所以它继承了大部分数据库的原理。其中之一是表键。主键是唯一的行标识符,当数据库设计允许(在 DWH 世界中它总是应该是)时,键是整数(正好是大整数)。参见 this了解更多信息。

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

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

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

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

引用您的评论。

是的,你是对的。

关于mysql - 在 MySQL 中创建一个 "DWH like"星型模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42494115/

相关文章:

java - 如何使我的查询选择更快地超过 200 万条记录

mysql - 数据库设计两种具有不同交货时间的产品

ruby-on-rails - 规范不同的数据库

python - 如何使用 django-south 恢复删除的表?

database - 什么技术可以帮助我快速搜索、过滤和分组广泛数据集中的任何列?

azure-sql-database - 当我组合来自 SQL 的数据和 Azure Blob 存储中的非关系数据时,如何在 Azure SQL DW 中使用 transact-SQL 确保更快的响应时间?

database-design - PostgreSQL 9 中的日历表

MySQL FK 是否减少了插入/更新操作?

mysql - 包含带有 auto_increment 的索引、键和注释的语句

php - 如何仅导出 Wordpress 帖子、评论、页面和媒体文件?