为分析数据库项目的测量数据设计规范 table 的策略

Strategy to design specification table for measurements data for analytical database project

我需要关于以下主题的建议:

我正在 SQL 服务器中开发 DW/BI 解决方案,并在 Power BI 中发布报告。

我的问题的主要部分从这里开始:我有一个很大的 table,它收集多个属性的产品测量数据。产品可以是多种类型,可以在这个table中通过项目编号来识别,可以多次测量,可以通过测量日期来识别。通常,我们指的是最新日期。如果这让事情变得复杂,我可以只过滤最新日期的数据。这是密集行 table(数百万)。属性数约200。

我想在一个维度 table 中最有可能包含这些属性的规范,并且可能有数十个这样的规范。意图是用户应 select 在报告中的任何一个规格名称,他希望看到每个具有属性 passing/failing 的产品以及如果所有规格属性都通过的产品通过。

我目前有这个测量 table 和一个带有测试名称的暗淡 table,如果需要,我可以添加一个 table 作为规范。规范可以定义少数或所有具有 lower/upper 规范限制的测试名称:

样本测量table:

测试名称的样本暗淡 table:

我可以为规范添加一个 table,用户将 select 中的任何一个:

例如使用 select ID_spec = 1 然后测量 table 可能看起来像:

某些规范可能包含所有属性和一些属性。

请提出设计规范 table 的策略,以便对如此大的尺寸 table 有效。如果需要任何进一步的详细信息,请告诉我。

稍后,我将不得不进一步计算合格产品的百分比,如果它们已经在规范中进行了所有需要的测试 selected。

对于大表,最好的办法是选择正确的键。这意味着转储“Id”列(只不过是行标识符)并将其替换为:

  • 保证唯一性
  • 促进搜索

这通常意味着复合键,这很好。

这也意味着抛弃整个“fact/dimension”的心态,只关注关系。这个也可以。

根据您的描述,这是您的仓库数据模型的初稿。如果您不熟悉 IDEF1X 图,请 read this.

我已经向 SpecCd 添加了一个唯一约束,因此您可以直接指定值,而不必同时检查 ProductIdSpecCd 到 return结果。

ProductTest 存在,因此您可以为 ProductTestCriteria 提供完整性并确保测试仅限于它们可以测量的那些产品。如果所有产品都接受所有测试,则可以将其删除,并且 Test 可以直接关联到 ProductMeasurementProductTestCriteria

如果您想将“产品 A”的最新测试纳入“规格 S”,您的查询将如下所示:

SELECT
  Measurement.ProductId
 ,Measurement.TestCd
 ,Measurement.TestDt
 ,Criteria.SpecCd
 ,Measurement.Value
 ,CASE
    WHEN Measurement.Value BETWEEN Criteria.LowerValue AND Criteria.UpperValue THEN 'Pass'
    ELSE 'Fail'
  END AS Result
FROM
  ProductMeasurement Measurement
INNER JOIN
  ProductTestCriteria Criteria
    ON Critera.ProductId = Measurement.ProductId
         AND Criteria.TestCd = Measurement.TestCd
WHERE
  Measurement.ProductId = 'A'
    AND Criteria.SpecCd = 'S'
    AND Measurement.TestDt =
      (
        SELECT
          MAX(TestDt)
        FROM
          ProductMeasurement
        WHERE
          ProductId = Measurement.ProductId
      )

您可以删除 ProductIdSpecCd 的过滤器并将其滚动到视图中 - 用户稍后可以指定他们想要的产品和规格。

如果您想要截至给定日期的结果,查询很容易修改为此或合并到 TVF 中:

SELECT
  Measurement.ProductId
 ,Measurement.TestCd
 ,Measurement.TestDt
 ,Criteria.SpecCd
 ,Measurement.Value
 ,CASE
    WHEN Measurement.Value BETWEEN Criteria.LowerValue AND Criteria.UpperValue THEN 'Pass'
    ELSE 'Fail'
  END AS Result
FROM
  ProductMeasurement Measurement
INNER JOIN
  ProductTestCriteria Criteria
    ON Critera.ProductId = Measurement.ProductId
         AND Criteria.TestCd = Measurement.TestCd
WHERE
  Measurement.ProductId = 'A'
    AND Criteria.SpecCd = 'S'
    AND Measurement.TestDt =
      (
        SELECT
          MAX(TestDt)
        FROM
          ProductMeasurement
        WHERE
          ProductId = Measurement.ProductId
            AND TestDt <= <Your Date>
      )