创建" DWH,如" MySQL中的星型模式

时间:2017-02-27 19:25:57

标签: mysql database data-warehouse star-schema

我对数据库和SQL很新,并且有一项非常重要的任务,我不知道如何解决。

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

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

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

结果所需的格式是一个包含三列的表格"子公司名称","产品名称"和"收入"。

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

Structure Approach

所以我的问题是:

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

  • 我将如何实际填充"我的表与示例数据能够编写一个回答上述给定问题的查询?

  • 这样的查询怎么样?

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

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

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

亲切的问候

编辑:

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

1 个答案:

答案 0 :(得分:1)

  • 你正好在轨道上。应该如何构建数据集市的学校示例。真实示例可能包含companyID,productID和salesID的本机密钥。请添加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) 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仍然是一个数据库,它继承了大多数数据库原则。其中一个是表键。主键是唯一行标识符,当数据库设计允许时(在DWH世界中它始终应该是),键是整数(大整数)。有关详细信息,请参阅this

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

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

为什么有人使用VARCHAR作为主键?好吧,有时候,尽可能保持原生是好方法。因此,VARCHAR产品的主键可以是产品品牌和计数器(来自供应商)的组合,如果您是转售商,ERP可以提供 Microsoft Office 2016 键,如 MCR-OFF-123 。在DWH中,建议存储本机密钥(无论是什么,int或varchar)并分配代理主键。

  

Sub A的键为'1',Sub B的键为'2

引用您的评论。

是的,你是对的。