我有一个累积快照事实表,它跟踪终端中容器的进出。
容器可以以3种不同的方式进出,所以我想创建一个特定的维度表,列出这3种可能的方式(火车、船只或卡车)。
然后我读了这篇文章,它基本上说这种技术是错误的,但我不明白为什么。
有时,当事实表有一个在任何单个行中稀疏填充的事实列表时,很容易创建一个度量值类型维度,该维度将事实表行折叠为由度量值类型维度编辑的单个通用事实identifi。我们一般不建议这样做。尽管它删除了所有空的事实列,但它将事实表的大小乘以每一行中占用的列的平均数量,这使得列内计算变得更加困难。当潜在事实的数量是极端的(以数百个为单位)时,这种技术是可以接受的,但是对于任何给定的事实表行,只有不到几个可以适用。
我理解,如果为事务事实表实现了“度量值类型维度”,它可能会产生像另一篇文章所说的问题,但是如果用于累积快照事实,我看不到任何缺点。
第二篇文章:(实施“度量类型维度”的一些缺点)
很好的方法,我从来没有想过。
另一件事:携带集装箱进入码头的车辆的每一个出入口都有一个独特的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),还是只添加两个动态链接到各个航次表的字段(voyage_in、voyage_out)?
我希望我的怀疑是明确的,谢谢。
发布于 2016-10-12 17:47:48
我认为,指南所指的是一个广泛的事实表,其中大多数计量值为空:
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;关于其他问题..。
我会把ExpectedEntryDate,ExpectedExitDate添加到Container/InventoryFact中。不太确定,如果没有所有数据元素的可见性,我可能会将EntryVoyageId和ExitVoyageId放在一个单独的垃圾维度中,并与任何其他简并数据项(卡车、火车等的标识符)放在一起。
我将为VesselVoyage、TruckVoyage和TrainVoyage添加3个新维度,并为这个事实添加6个航行键(入站/出站)(这是6个新键,而不是6个额外行)。然后,您可以选择将Dock和Tollbooth放在适当的Voyage维度中。如果将通用数据保持在这些维度(VesselFlag、TruckCapacity)和垃圾维度(VesselName、VesselMMSI)中的特定数据中,它们的大小不会爆炸。
https://dba.stackexchange.com/questions/151547
复制相似问题