说明:
我正在使用mysql/php
构建评级系统。我对如何设置数据库感到困惑。
以下是我的文章设置:
文章表:
id | user_id | title | body | date_posted
这是我的假设评级表:
评级表:
id | article_id | score | ? user_id ?
问题:
我不知道是否应将user_id
放在评级表中。我的计划是使用这样的查询:
SELECT ... WHERE user_id = 1 AND article_id = 10
但我知道它是冗余数据,因为它存储user_id
两次。我应该在桌子上找出JOIN
还是结构好?
答案 0 :(得分:2)
我认为这种方法没有任何问题。存储两次的用户ID不是特别相关,因为一个是关于评级条目而另一个是我认为与文章所有者有关。
这种方式的好处是,您可以通过使article_id和user_id唯一来防止为每个用户记录多个分数,并使用替换来管理评分。
有很多事情需要详细说明,具体取决于此评级系统是否需要智能化以防止游戏等。用户群有多大等等。
我打赌任何正常人,即使是一个规模较大的系统,这种设置也不会有害。
...半无关:
仅供参考,根据此分数的重要性和游戏方面,您可以使用STDDEV()获取分数列上标准偏差的平均值...
SELECT STDDEV(`score`) FROM `rating` WHERE `article_id` = {article_id}
这会影响异常值,因为你不在乎是否有人关注某个特定的文章是为了拍摄它还是在没有正当理由的情况下赞美它。
答案 1 :(得分:2)
这取决于。我假设文章对个人用户来说是独一无二的?在这种情况下,我可以在您的评级表中保留user_id,然后将您的查询更改为:
SELECT ... WHERE article_id = 10
或
SELECT ... WHERE user_id = 1
取决于您想要提取的信息。
您不是“存储user_id两次”,而是使用user_id将文章链接到与另一个表中的用户关联的唯一数据。除了查询之外,您采取了正确的方法。
答案 2 :(得分:0)
你不应该,由于第3种正常形式,你需要保持独立性。
“第三范式(3NF)是数据库规范化中使用的正常形式.3NF最初由EF Codd在1971年定义。[1] Codd的定义表明当一个表在3NF时,当且仅当以下两个都是条件成立:
来源:http://en.wikipedia.org/wiki/Third_normal_form
第一范式:http://en.wikipedia.org/wiki/First_normal_form
第二范式:http://en.wikipedia.org/wiki/Second_normal_form
你应该看看规范化和E / R模型,它会对你有很大的帮助。
维基百科中的规范化:http://en.wikipedia.org/wiki/Database_normalization