数据仓库表建模咨询:问卷回复关联多评论的设计方案是否合理?
问卷回复评论的数据仓库建模方案
你的核心思路方向是对的,但需要调整Comments表的定位——它不应该作为事实表,而是设计成与UserResponses事实表关联的维度附属表,具体分析和方案如下:
核心原则明确
数据仓库建模中,事实表和维度表的核心区别是:
- 事实表:存储可聚合的度量值(比如作答耗时、得分、作答次数等),以及关联各维度的外键
- 维度表:存储描述性属性信息(比如用户信息、问题内容、评论文本这类非度量的描述数据)
针对你的场景的建模方案
保留现有核心表结构
dim.Users:存储用户维度信息(用户ID、姓名、注册时间等)dim.Questions:存储问卷问题维度信息(问题ID、问题内容、所属问卷、题型等)fact.UserResponses:作为核心事实表,存储作答的度量数据,结构示例:fact.UserResponses ( ResponseID INT PRIMARY KEY, UserID INT FOREIGN KEY REFERENCES dim.Users(UserID), QuestionID INT FOREIGN KEY REFERENCES dim.Questions(QuestionID), ResponseValue VARCHAR(255), -- 用户作答内容(比如选项、填空文本) ResponseTime DATETIME, -- 作答时间 ResponseDuration INT -- 作答耗时(秒),可选度量 )
设计评论表作为附属维度表
创建dim.UserResponseComments(或命名为fact.UserResponseComments,更强调与事实的关联),专门存储回复的评论信息,结构示例:dim.UserResponseComments ( CommentID INT PRIMARY KEY, ResponseID INT FOREIGN KEY REFERENCES fact.UserResponses(ResponseID), CommentText TEXT, -- 评论内容 CommentCreatedAt DATETIME, -- 评论创建时间 CommentCreatorID INT FOREIGN KEY REFERENCES dim.Users(UserID) -- 评论创建者(如果允许非作答用户评论) )
为什么不把Comments作为事实表?
评论本身是依附于回复的描述性文本,没有可聚合的数值型度量(除非你需要统计评论数量,但这个可以通过关联计数得到)。如果强行将其设为事实表,会违背数据仓库的建模逻辑,后续做聚合分析时会增加不必要的复杂度。而作为附属维度表,既能满足存储需求,又能通过ResponseID与事实表灵活关联,方便后续的查询和分析(比如统计某类问题回复的评论数、查看特定回复的所有评论)
内容的提问来源于stack exchange,提问作者Cypher236
相关产品推荐
相关产品推荐

