我在这里设计一个为轮询和用户建模的关系数据库模式。每 类别可以有一个或多个问题。每个用户都可以参加 每个类别只有一次,并且可以一次轮询(或不) 每个问题。每项民意调查均为是,否或弃权(无投票)。
我用四个表设计了我的模式:
users, [userId, IP]
category, [catId, catTitle]
question, [queId, queTitle]
polls [pollId, queId, userId, answer]
更好或
users, [userId, IP]
category, [catId, catTitle]
question, [queId, queTitle]
polls [pollId, catId, userId]
pollAnswers [pollAndId, queId, pollId, answer]
我想知道哪一个更好,为什么?
据我所知,因为我没有关于民意调查的任何额外信息,我直接交叉加入用户和问题与答案。
我还需要找到有多少用户弃权。)所有类别问题b。)特定类别c。)特定问题
我的观点是选择一个架构:
select U1.*, Q1.*, P2.*, C1.*
from
( users U1,
questions Q1 )
Left outer Join polls P2 on
Q1.queId = P2.queId AND U1.userId = P2.userId
Left Outer Join category C1 on
Q1.catId = C1.catId
我试图担心使用上述查询与用户之间的交叉连接,问题是否会失去我的表现?
如果第二个架构更好,您可以为我的结果建议选项吗?
答案 0 :(得分:0)
看一下类似的问题 database design for a survey 。
答案 1 :(得分:0)
用户:重命名为用户,以便所有实体都是单数(或将单数重命名为复数)
类别:好的
问题:您需要从问题到类别的外键
pollAnswers:重命名为pollAnswer,并使其成为一个包含三行的引用表:Yes,No,Abstain
民意调查:重命名为民意调查,并将此事件作为用户轮询问题的事务,使用外键访问user,question和pollAnswer。
(选项:在插入时验证用户对类别中的问题没有现有的民意调查,或者使用问题的外键对类别进行非规范化PollAnswers并对用户/问题设置唯一约束。我不&# 39; t个人喜欢这个选项,因为如果你改变一个问题的类别就会出现问题。)
然后对特定类别的查询可能如下所示:
select *
from category c
LEFT OUTER JOIN question q ON q.catID = c.catID
LEFT OUTER JOIN poll p ON p.queId = q.queId
LEFT OUTER JOIN user u ON u.userId = p.UserID
WHERE c.catID = 'blah blah'