物业数据仓库中服务工单关联多物业的事实表建模方案
解决方案:针对多物业关联工单的建模方式
根据你的需求,核心是要同时满足两个统计目标:一是实际总工单数的准确性(单个工单不管关联多少物业都只算1次),二是按物业维度统计关联工单的覆盖数(每个关联物业对应1次工单计数)。以下是两种可行的建模方案:
方案1:拆分双事实表
(1)核心工单事实表 ServiceTicket_Core_FACT
- 每条记录对应1个唯一工单(
ServiceTicketID为主键) - 存储工单的核心属性:创建时间、工单类型、状态、创建人等
- 度量值:
TotalTicketCount = 1(用于统计实际总工单数) - 仅关联单值维度(如工单类型、时间维度),不直接关联
Property维度
(2)工单-物业关联事实表 ServiceTicket_Property_Link_FACT
- 每条记录对应1个「工单-物业」关联对,即单个工单关联N个物业就生成N条记录(比如
ServiceTicketID=1对应3条记录,分别关联PropertyID=1/2/3) - 存储关联的核心标识:
ServiceTicketID、PropertyID - 度量值:
AssignedTicketCount = 1(用于按物业维度统计关联工单数量) - 关联
Property维度和ServiceTicket_Core_FACT(通过ServiceTicketID)
报表使用方式:
- 要统计每个物业的关联工单数量:查询
ServiceTicket_Property_Link_FACT,按PropertyID分组,对AssignedTicketCount求和,得到每个物业各1张的结果 - 要统计实际总工单数:查询
ServiceTicket_Core_FACT,对TotalTicketCount求和即可
方案2:单事实表+多行存储关联关系
如果不想拆分表,可以直接在ServiceTicket_FACT中存储「工单-物业」的多行关联:
- 单个工单关联N个物业时,生成N条记录,每条记录的
ServiceTicketID相同,但PropertyID不同 - 新增两个度量值:
UniqueTicketCount:仅在工单的第一条记录中设为1,其余关联记录设为0(用于统计实际总工单数)PropertyAssignedCount:每条记录都设为1(用于按物业统计关联次数)
- 关联所有需要的维度(包括
Property维度)
报表使用方式:
- 按物业统计关联工单数量:按
PropertyID分组,对PropertyAssignedCount求和 - 统计实际总工单数:对
UniqueTicketCount求和,或者对ServiceTicketID做COUNT(DISTINCT)
关键说明
- 你提到的桥接表方案本身没问题,但之前的问题是用错了统计方式:如果用桥接表关联单条工单的事实表,统计时应该统计「关联对的数量」而非「工单数量」,而上述方案直接把关联对作为事实记录,更直观满足报表需求
- 分配系数方案不适用你的场景,因为你需要的是整数计数而非比例分摊,所以直接存储关联对的事实记录是最贴合需求的方式
内容的提问来源于stack exchange,提问作者Joe S
相关产品推荐
相关产品推荐

