我应该创建一个 Factless 事实表还是非规范化我的表

Posted

技术标签:

【中文标题】我应该创建一个 Factless 事实表还是非规范化我的表【英文标题】:Should I create a Factless Fact Table or Denormalise my table 【发布时间】:2014-11-12 22:00:54 【问题描述】:

我正在从商店数据库创建一个数据仓库,我对我的维度和事实的设计有疑问。

在商店数据库中,存在一个表,用于 Person、Person_Address 和 Person_Address_Type。它们由另一个表名 Entity_Address_ID 链接,该名称通过主键链接三个表,以提供有关人员地址和地址类型的详细信息。

我的问题是,我应该为所有三个表创建一个维度,并创建一个无事实的事实表将它们链接在一起,还是应该对我的维度进行反规范化并向每个维度添加地址和地址类型的外键他们也有联系吗?

这里有一个非常快速的 UML 来说明当前数据库的外观

【问题讨论】:

这似乎更像是Database Administrators 或Software Engineering 的问题。 这是因为它的概念性质吗?我认为维度建模标签可能合适吗? 差不多。我不认为这是题外话。我只是怀疑您可能会在其他 SE 站点之一获得更好的答案。 感谢您的建议,我也把它放到 DBA SE 网站上,link 请不要在各种堆栈交换站点中交叉发帖。将来,您应该标记以移动问题。 【参考方案1】:

您应该使用一组地址属性(邮寄地址、帐单地址等)创建一个 Person 维度,即将所有这些数据非规范化并将其加载到单个表中。

【讨论】:

我能问一下为什么吗?这是最佳实践还是您的个人偏好?考虑到这个数据库实际上是 MSDN 示例数据库,我认为他们设计这样的数据库一定是有原因的? 是的,这是正确的,但如果我错了,请纠正我,但在维度建模中,事实表是 3NF,但暗淡是 2NF? 是的,但我所说的 3NF 模型只是指无维模型。我假设 Person 只是您仓库中众多维度之一。那是对的吗?仓库里还有其他维度和事实吗?还是您只需要问题中的四个表的维度模型? 你是对的,还有更多的维度和更多的事实。这恰好是 DW 中的第一个。 我不确定我是否理解你的问题。示例数据库以屏幕截图中描述的方式建模,因为规范化减少了冗余,并且它在 OLTP 系统中很重要。如果您想将相同的数据复制到数据仓库中,您不必担心冗余,性能变得至关重要,因此结构被非规范化或扁平化。这就是我建议使用单一维度的原因。

以上是关于我应该创建一个 Factless 事实表还是非规范化我的表的主要内容,如果未能解决你的问题,请参考以下文章

雪花数据加载最佳实践规范化还是非规范化?

我需要定义事实表或维度表吗?

如何避免星型模式中的复杂连接?

我可以有一个描述性属性很少的事实表吗

设计数据仓库/星型模式 - 选择事实

具有不同更新计划的事实表