Sql 数据集市设计-最佳实践-为什么不使用外键?

Sql 数据集市设计-最佳实践-为什么不使用外键?,sql,database,schema,Sql,Database,Schema,我正在从事一个项目,在这个项目中,一个较小的数据集市(可能有30个表)是从头开始实现的。现在,这位对这家超市有深入了解的同事将要做另一个项目,让我独自参与这个项目(得到他的一些支持) 我只是认为我会生成数据库图,因此当我修改ETL和进行一些连接等操作时,我不需要任何额外的帮助。但是,令我惊讶的是,这个行业的新手 我生成了这个图,并没有星型或雪花型模式,只有并没有主键和外键的普通表。因此,我的工作是尝试想象这些表是如何关联的,然后参考它,如果它是真的,然后重新制作我的脚本等等 当我问为什么会这样(

我正在从事一个项目,在这个项目中,一个较小的数据集市(可能有30个表)是从头开始实现的。现在,这位对这家超市有深入了解的同事将要做另一个项目,让我独自参与这个项目(得到他的一些支持)

我只是认为我会生成数据库图,因此当我修改ETL和进行一些连接等操作时,我不需要任何额外的帮助。但是,令我惊讶的是,这个行业的新手

我生成了这个图,并没有星型或雪花型模式,只有并没有主键和外键的普通表。因此,我的工作是尝试想象这些表是如何关联的,然后参考它,如果它是真的,然后重新制作我的脚本等等

当我问为什么会这样(表之间没有关系)时,我得到的答案是:“这是因为性能。”


像这样解决它是正常的吗?如果否,如何利用关系解决此问题并保持良好的性能?

外键是用于确保数据库中数据一致性的约束-它们的目的不是记录数据库的结构,而是通过控制允许对数据库进行的更改来强制执行数据一致性规则

在数据完整性是关键的实时数据库中,这一切都很好,但在数据集市中,不需要强制执行这些规则-我们知道数据是一致的,因为它是执行这些规则的实时数据库的副本/摘录

外键也有一些缺点:

  • 它们使数据集市提取过程复杂化(您需要确保按特定顺序提取数据)
  • 它们阻止部分导出(仅从数据库导出某些表)
  • 在对数据库进行更改时,它们还会导致运行时性能损失,因为在进行更改时,数据库服务器必须检查/验证每个约束
简言之,它们降低了性能,却没有提供任何真正的好处,那么为什么还要麻烦呢?只需确保您的数据集市在其他地方有适当的文档记录即可

您可能对以下问题感兴趣:


外键是用于确保数据库中数据一致性的约束-它们的目的不是记录数据库的结构,而是通过控制允许对数据库进行的更改来强制执行数据一致性规则

在数据完整性是关键的实时数据库中,这一切都很好,但在数据集市中,不需要强制执行这些规则-我们知道数据是一致的,因为它是执行这些规则的实时数据库的副本/摘录

外键也有一些缺点:

  • 它们使数据集市提取过程复杂化(您需要确保按特定顺序提取数据)
  • 它们阻止部分导出(仅从数据库导出某些表)
  • 在对数据库进行更改时,它们还会导致运行时性能损失,因为在进行更改时,数据库服务器必须检查/验证每个约束
简言之,它们降低了性能,却没有提供任何真正的好处,那么为什么还要麻烦呢?只需确保您的数据集市在其他地方有适当的文档记录即可

您可能对以下问题感兴趣:


贾斯汀为为什么DWH可以这样设计提供了一个很好的答案

您仍然可以通过检查已在表上设置的索引来派生表之间的关系-唯一索引通常表示该表上的主键,而外键通常需要非唯一(即重复)索引

此外,如果DWH是一个Kimball星形模式样式的数据库,那么应该清楚哪些表是维度,哪些表是事实表——前者通常包含有意义的描述,只有一个键字段,没有数字度量,而后者通常包含多个键字段(每个维度一个)和具有少量长字符字段的数值度量(通常无)

在真正的星型模式中,维度表不直接相互链接,只链接到事实表(但是,您可能有一个雪花模式)。通常,您应该能够根据维度表上键字段的名称,判断哪些维度链接到事实表上的键


然而,最重要的是:文档不是构建数据仓库时的可选步骤。询问开发人员文档在哪里;如果它不存在,那么开发者应该负责提供它。

贾斯汀已经给出了一个很好的答案,解释了为什么DWH可以这样设计

您仍然可以通过检查已在表上设置的索引来派生表之间的关系-唯一索引通常表示该表上的主键,而外键通常需要非唯一(即重复)索引

此外,如果DWH是一个Kimball星形模式样式的数据库,那么应该清楚哪些表是维度,哪些表是事实表——前者通常包含有意义的描述,只有一个键字段,没有数字度量,而后者通常包含多个键字段(每个维度一个)和具有少量长字符字段的数值度量(通常无)

在真正的星型模式中,维度表不直接相互链接,只链接到事实表(但是,您可能有一个雪花模式)。通常,您应该能够根据维度表上键字段的名称,判断哪些维度链接到事实表上的键

然而,最重要的是:文档不是构建数据仓库时的可选步骤。询问开发人员代码在哪里