建议更好的关系DB模式

时间:2010-08-02 05:46:03

标签: mysql database-design relational-database

我在这里设计一个为轮询和用户建模的关系数据库模式。每 类别可以有一个或多个问题。每个用户都可以参加 每个类别只有一次,并且可以一次轮询(或不) 每个问题。每项民意调查均为是,否或弃权(无投票)。

我用四个表设计了我的模式:

 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

我试图担心使用上述查询与用户之间的交叉连接,问题是否会失去我的表现?

如果第二个架构更好,您可以为我的结果建议选项吗?

2 个答案:

答案 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'
相关问题