Database design 多事实模式建模的正确方法

Database design 多事实模式建模的正确方法,database-design,dimensional-modeling,star-schema,fact,scd,Database Design,Dimensional Modeling,Star Schema,Fact,Scd,背景 我正在设计一个数据库(使用星型模式) 有三个表可以建模:产品、测试和状态 该数据库将用于存储对产品进行的测试结果(大大简化)。可以有许多测试指向单个产品,但每个测试都是唯一的(它们不在产品之间共享)。此外,我还需要记录测试时产品的当前状态。让我们假设一个产品的状态描述了它的当前位置和所有者,它们经常变化。这很可能涉及到SCD 2级-跟踪状态变化的历史,并能够定位一个产品及其所有测试以及测试期间的状态 问题 我不完全确定如何模拟这个问题。将每个测试存储在事实表中似乎是显而易见的。该表将由数千

背景

我正在设计一个数据库(使用星型模式)

有三个表可以建模:产品、测试和状态

该数据库将用于存储对产品进行的测试结果(大大简化)。可以有许多测试指向单个产品,但每个测试都是唯一的(它们不在产品之间共享)。此外,我还需要记录测试时产品的当前状态。让我们假设一个产品的状态描述了它的当前位置和所有者,它们经常变化。这很可能涉及到SCD 2级-跟踪状态变化的历史,并能够定位一个产品及其所有测试以及测试期间的状态

问题

我不完全确定如何模拟这个问题。将每个测试存储在事实表中似乎是显而易见的。该表将由数千个事务组成。另一方面,也会有数百种(以及以后的数千种)产品,所以我可能应该将它们保存在第二个事实表中。然后,也会有成千上万的状态变化,所以为了记录他们的整个历史,我需要把他们保存在一个。。。事实表呢?我被告知事实表通常用于存储多行数据,但另一方面,在这个模型中DIM在哪里


我也不知道如何对这些表之间的关系建模。产品-状态是1:*关系。产品-测试也是1:*级。最后,states-tests也是一个1:*。然后我会将产品链接到状态,然后将状态链接到测试(产品1事实表包含您希望报告的度量值,即您可以计数、求和、平均值等的数字。它们还包含保存属性的维度外键,您希望根据这些属性对度量值进行切片和骰子分割。 您需要决定要跟踪的度量值及其粒度-如果所有度量值都具有相同的粒度,则可能有一个事实表,否则可能需要多个事实表


对于维度,听起来您可能有产品(可能是SCD2,因为您需要随着时间跟踪产品状态)、测试(假设测试有属性)以及您需要的任何其他维度,如日期或时间,了解事实和维度之间的差异至关重要。事实包含事件的可测量方面。维度包含事件的描述可能性。维度包含记录,即使n事件从未发生过(某些例外情况适用)。我最喜欢的例子是在下第一道菜(事件)之前,新餐厅的菜单(维度)

然而,另一个关键的理解是,事件也可以用作事件描述方面的维度。这些维度通常被称为退化维度,用于关联事件或子事件的不同方面。最常见的示例是用于将所有购买的项目绑定在一起的发票IDn发票。ID是描述性的,不可测量,但在发票事件发生之前不存在,并且在事件之外没有任何用途

识别维度和事实的一个好方法是在设计模型时询问模型的问题

  • 产品是否通过了所有测试
  • 在一个产品上运行了多少个测试
  • 新产品需要哪些测试
  • 是否已在产品上运行所有必需的测试
  • 一个产品的测试执行了多少次
  • 测试123在所有产品中的通过/失败率是多少
在回答问题时,确定要过滤或分组的内容(维度属性)以及回答问题所需的度量(事实),如执行次数

根据您有限的描述,我可以看到产品、测试和状态都是维度。然后我会看到TestExecution事件,需要产品和测试维度,并创建TestExecution ID,用作新创建的DimProductTestExecution的密钥。事实ProductTestExecution将指向DimProductTestExecution、Product、,测试和状态维度,以及日期和时间维度,可能还有一些用户维度(谁执行了测试?谁批准了测试结果,等等)