去规范化时要走多深

How deep to go when denormalising

我对 OLTP 数据库进行反规范化以在 DWH 中使用。 目前我正在对学习小组进行非规范化。

现在我知道您应该对您的 OLTP 中的 sh*t 进行非规范化,但在这个 dwh 部门中将是一个独立的维度。这也适用于大学。从 studygroup 添加一个指向 department 的键是否足够,或者尽可能地非规范化并将 department 的所有属性及其 M:1 相关表中的所有属性添加到维度 studygroup 是否更明智?即使部门和大学将自己维度?

换句话说:far/deep 你去规范化的时候怎么样?

维度模型背后的关键概念是:

  • 将你的事实 table 保存在 3NF(第三范式)中;
  • De-normalize 你的维度转换为 2NF(第二范式)

因此,理想情况下,模型中唯一应该具有的连接是事实 table 与相关维度之间的连接。

作为这一理念的一部分:

  • 避免 "snow flake" 设计,其中维度包含其他维度的键。在不违反 3NF/2NF 规则的情况下,总是可以提出一个允许与雪花具有相同功能的数据模型;
  • 切勿直接在 2 个不同的维度(即部门和研究组)之间进行任何直接连接。维度之间的所有关系都必须通过事实tables来解决;
  • 永远不要在 2 个单独的事实 table 之间有任何直接连接。事实 table 之间的任何关系都必须通过共享维度来解决。

最后,请考虑维度设计,除了优化查询数据之外,还有第二个重要目的:它是业务的语义模型(或它所代表的任何其他内容)。因此,在决定将数据元素组合成维度和事实时,请考虑它们 "logical affinity" - 它们应该对最终用户具有直观意义。如果您很难向 BI 分析师解释您的维度或事实的含义 table,很可能您犯了建模错误。

比如你的情况应该考虑大学、院系、学习小组等之间的逻辑关系,很可能University/Department形成一个自然的层次。如果是这样,它们应该属于同一个维度。另一方面,学习小组可能不会 - 让我们假设,可以跨多个大学 and/or 多个部门组建学习小组。这种 Many:Many 关系清楚地表明它们应该通过事实 table 来解决。另外,大学与院系之间的关系是stable(很少变化),而study groups的形成和解散非常频繁,因此应该单独建模。

一般来说,如果您看到维度元素之间的 1:1 或 1:M 关系,通常表明它们应该 de-normalized 到相同的 table(再次,只有当它们的组合合乎逻辑时)。如果关系是 M:M,它们很可能属于不同的 table(你可以强制它们进入相同的 table,但通常这样的 table 看起来像弗兰肯斯坦生物) .

您可以通过使您的问题更具体来获得更好的帮助 - 画出您的维度模型,post它,并要求 具体 issues/challenges有。对于一般概念,Kimball 和 Inmon 的书籍是您最好的朋友。