不建议将平板设计用于数据集市,但这并非不可能。
作为一个对这本书非常严格的人(这在实践中表现得最好),我不得不建议你在单独的表格中创建时间维度。甚至将日期作为 time_dimension_table 中的主键,并且作为 join 也不是太糟糕的解决方案。
选项 1 - 最简单和最糟糕的选项
在模式 mondarian.xml 中定义维度:
<Dimension type="TimeDimension" visible="true" highCardinality="false" name="DateDimension">
<Hierarchy visible="true" hasAll="true" primaryKey="event_date">
<Table name="f_android_active_user_data" schema="public">
</Table>
<Level name="DateLevel" visible="true" column="event_date" type="String" uniqueMembers="false" levelType="TimeDays" hideMemberIf="Never">
</Level>
</Hierarchy>
</Dimension>
然后,在您的多维数据集中定义维度用法:
<DimensionUsage source="DateDimension" name="DateDimension" visible="true" foreignKey="event_date" highCardinality="false">
</DimensionUsage>
选项 2 - 创建 DateDimension 表并仍然使用自然键进行连接
按照本教程创建 DateDimension。确保涵盖事实表 (f_android_active_user_data) 中的第一个显示日期。在这种情况下,定义维度会有所改变:
请注意,您可以按月、季度、年等进行过滤和分组
<Dimension type="TimeDimension" visible="true" highCardinality="false" name="DateDimension">
<Hierarchy visible="true" hasAll="true" primaryKey="dt">
<Table name="calendar_table" schema="public">
</Table>
<Level name="YearLevel" visible="true" column="y" type="Numeric" uniqueMembers="false" levelType="TimeYears" hideMemberIf="Never">
</Level>
<Level name="MonthLevel" visible="true" column="m" type="Numeric" uniqueMembers="false" levelType="TimeMonths" hideMemberIf="Never">
</Level>
<Level name="DateLevel" visible="true" column="dt" type="String" uniqueMembers="false" levelType="TimeDays" hideMemberIf="Never">
</Level>
</Hierarchy>
</Dimension>
选项 3 - Kimball 会感到自豪
使用选项 2 中链接的教程,但将 PK INTEGER PRIMARY KEY 添加为 AUTO INCREMENT。立即运行此查询:
ALTER table f_android_active_user_data ADD column DATE_FK INTEGER DEFAULT NULL
UPDATE f_android_active_user_data
SET DATE_FK = calendar_table.PK
FROM calendar_table
WHERE f_android_active_user_data.event_date = calendar_table.dt
现在,只剩下设置触发器了:最好是在 INSERT TRIGER 之后:
UPDATE f_android_active_user_data
SET DATE_FK = calendar_table.PK
FROM calendar_table
WHERE f_android_active_user_data.event_date = calendar_table.dt AND DATE_FK = NULL