为分析数据库项目的测量数据设计规范 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
添加了一个唯一约束,因此您可以直接指定值,而不必同时检查 ProductId
和 SpecCd
到 return结果。
ProductTest
存在,因此您可以为 ProductTestCriteria
提供完整性并确保测试仅限于它们可以测量的那些产品。如果所有产品都接受所有测试,则可以将其删除,并且 Test
可以直接关联到 ProductMeasurement
和 ProductTestCriteria
。
如果您想将“产品 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
)
您可以删除 ProductId
和 SpecCd
的过滤器并将其滚动到视图中 - 用户稍后可以指定他们想要的产品和规格。
如果您想要截至给定日期的结果,查询很容易修改为此或合并到 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>
)
我需要关于以下主题的建议:
我正在 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
添加了一个唯一约束,因此您可以直接指定值,而不必同时检查 ProductId
和 SpecCd
到 return结果。
ProductTest
存在,因此您可以为 ProductTestCriteria
提供完整性并确保测试仅限于它们可以测量的那些产品。如果所有产品都接受所有测试,则可以将其删除,并且 Test
可以直接关联到 ProductMeasurement
和 ProductTestCriteria
。
如果您想将“产品 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
)
您可以删除 ProductId
和 SpecCd
的过滤器并将其滚动到视图中 - 用户稍后可以指定他们想要的产品和规格。
如果您想要截至给定日期的结果,查询很容易修改为此或合并到 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>
)