“累积快照”事实表中的“测量类型尺寸”


8

我有一个累积的快照事实表,该表跟踪终端中容器进入和退出

容器可以以3种不同的方式进入和退出,因此我想创建一个特定的尺寸表,其中列出了这3种可能的方式(火车,轮船或卡车)。

然后我读了这篇文章,基本上说这种技术是错误的,但我不明白为什么。

第一篇文章:

有时,当事实表的一长串事实稀疏地填充在任何单独的行中时,它很想创建一个度量类型维度,以将事实表行折叠为由度量类型维度标识的单个通用事实。我们通常不建议这种方法。尽管它删除了所有空的事实列,但将事实表的大小乘以每行中已占用列的平均数,这使列内计算更加困难。当潜在事实的数量极高(数百个)时,此技术是可以接受的,但对于任何给定的事实表行,只有极少数适用。

我了解,如果为事务事实表实现了“ 度量类型维 ”,则可能会产生其他文章所述的问题,但是如果用于累积快照事实,我看不到任何不利之处。

第二篇文章:( 实现“度量类型维”的一些缺点)

  1. [...]如果我们使用“度量类型维”,我们将失去这种分析能力。如果一项措施与其他措施不兼容,我们将无法将其相加。
  2. [...]我们的SQL运行以生成报告所需的传递次数越多,报告就越慢。
  3. [...]在BI工具上,如果不放置度量类型过滤器,则可能会使用户冒着“垃圾信息”的危险。从可用性的角度来看,这种设计是垃圾。

对Mark Storey-Smith的回答

非常好的方法,我永远也不会想到。

另一件事:将集装箱带入码头的车辆的每次进出都有唯一的ID,该ID向我提供其他信息,例如:车辆的预计到达,实际到达,如果是码头的船只,如果是卡车,收费站以及许多其他信息...

这是3个不同的事实表,它们必须以某种方式链接到容器事实表。

我以为航行的ID是degenerate dimension,因此它将直接进入容器事实表。因此,我的疑问是:我应该在容器事实表中添加6个不同的字段(vessel_voyage_in_key,vessel_voyage_out_key,train_voyage_in_key,train_voyage_out_key,truck_voyage_in_key,truck_voyage_out_key)还是仅动态链接到各个表的其他2个字段(voyage_in,voyage_out)?

希望我的疑问很清楚,谢谢。

Answers:


3

我相信指南是指一个宽泛的事实表,其中大多数度量值都是空的:

CREATE TABLE dbo.SparseFact
(
    Dim1Key     INT NOT NULL
    , Dim2Key   INT NOT NULL
    , Dim3Key   INT NOT NULL
    , Dim4Key   INT NOT NULL
    , Dim5Key   INT NOT NULL
    , Value1    INT NULL
    , Value2    INT NULL
    , Value3    INT NULL
    , Value4    INT NULL
    , Value5    INT NULL
    , Value6    INT NULL
    , Value7    INT NULL
    , Value8    INT NULL
    ..
    , Value101  INT NULL
    , Value102  INT NULL
    , Value103  INT NULL
);

建议有些人会看到所有的空值,然后决定这样做:

CREATE TABLE dbo.DontDoThisFact
(
    Dim1Key             INT NOT NULL
    , Dim2Key           INT NOT NULL
    , Dim3Key           INT NOT NULL
    , Dim4Key           INT NOT NULL
    , Dim5Key           INT NOT NULL
    , MeasureTypeKey    INT NOT NULL
    , Value             INT NOT NULL
);

不好。

在您的情况下,我想我会看这样的事情,这与您所引用的文章中描述的情况非常不同。

CREATE TABLE dbo.InventoryFact
(
    ContainerKey        INT NOT NULL
    , TransportTypeKey  TINYINT NOT NULL
    , EntryDateTime     DATETIME NULL
    , ExitDateTime      DATETIME NULL
);

CREATE TABLE dbo.TransportType
(
    TransportTypeKey    TINYINT IDENTITY(1,1) NOT NULL
    , EntryTransport    CHAR(10) NOT NULL
    , ExitTransport     CHAR(10) NOT NULL
);

INSERT
    dbo.TransportType
SELECT
    EntryTransport
    , ExitTransport
FROM
    (
    SELECT EntryTransport = 'Train'
    UNION
    SELECT EntryTransport = 'Truck'
    UNION
    SELECT EntryTransport = 'Vessel'
    UNION
    SELECT EntryTransport = 'N/A'
    UNION
    SELECT EntryTransport = 'Unknown'
    ) en
CROSS JOIN
    (
    SELECT ExitTransport = 'Train'
    UNION
    SELECT ExitTransport = 'Truck'
    UNION
    SELECT ExitTransport = 'Vessel'
    UNION
    SELECT ExitTransport = 'N/A'
    UNION
    SELECT ExitTransport = 'Unknown'
    ) ex;

对于其他问题...

我想补充ExpectedEntryDateExpectedExitDateContainer/InventoryFact。不太确定的是,如果没有所有数据元素的可见性,我可能会将其EntryVoyageIdExitVoyageId其他任何退化的数据项(卡车,火车等的标识符)一起放在一个单独的垃圾维度中并排成一行。

我想补充的3种新的尺寸VesselVoyageTruckVoyageTrainVoyage与6个航程键(呼入/呼出)这一个事实(这是6分新的密钥,而不是6个附加行)。然后,您可以放置的选项Dock,并Tollbooth在适当的航程维度。如果你一直在这些方面通用数据(VesselFlagTruckCapacity)和垃圾尺寸的具体(VesselNameVesselMMSI)他们不会在规模爆炸。


嗨,马克,谢谢您的回答。这使我再次怀疑我不适合此处的评论。我已经更新了我的问题..请检查一下吗?非常感谢,我已经检查了您的答案,这是一个很好的答案!
Mattia Nocerino
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.