Mysql 关于更好的关系数据库模式的建议

Mysql 关于更好的关系数据库模式的建议,mysql,database-design,relational-database,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, queId, userId, answer]
好还是坏

 users, [userId, IP]
 category, [catId, catTitle]
 question, [queId, queTitle]
 polls [pollId, catId, userId]
 pollAnswers [pollAndId, queId, pollId, answer]
我想知道哪一个更好,为什么

根据我的说法,因为我没有任何关于民意调查的额外信息,所以我直接交叉加入用户和答案问题

我还需要找出有多少用户因为a.)所有类别问题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
我正试图担心在用户和问题之间交叉连接使用上述查询是否会降低我的性能


如果第二个模式更好,你能为我的结果建议选项吗?

用户:重命名为用户,使所有实体都是单数(或将单数重命名为复数)

类别:OK

问题:您需要一个从问题到类别的外键

pollAnswers:重命名为pollAnswer,并使其成为一个包含三行的参考表:是、否、弃权

轮询:重命名为poll,并使其成为用户轮询问题的事务,并使用user、question和pollAnswer的外键

(选项:在插入时验证用户是否没有针对类别中问题的现有轮询,或者使用问题的外键将PollAnswers反规范化为类别,并对用户/问题设置唯一约束。我个人不喜欢此选项,因为如果更改问题类别,它会出现问题。)

然后,特定类别的查询可能如下所示:

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'

这并不能真正帮助您的模式,但我认为缩写字段名是可怕的。另外,为什么要在每个字段名前面加上表名?为什么用户(id、ip)、问题(id、正文)、投票(id、问题id、用户id、答案)?thxn建议删除缩写字段名。接下来我不明白你说“这对你的模式没有帮助”这意味着什么他们的意思是去掉前缀对你的模式没有帮助,但是它确实让它更可读。你应该用“不要”而不是“邓”。谢谢。。。我会记在心上的,只是另一个简短的评论,你遗漏了问题和类别之间的任何关系。因此,您需要将:catId添加到
问题
表中。稍后我将对您的select查询进行分析:D