0

描述:

我正在建立一个评级系统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两次。我应该在桌子上找出 aJOIN还是结构好?

4

3 回答 3

2

我认为这种方法没有任何问题。被存储两次的用户 id 并不是特别相关,因为一个与评级条目有关,而另一个与文章所有者有关。

这种方式的好处是您可以通过使 article_id 和 user_id 唯一并使用 replace into 来管理评分来防止为每个用户记录多个分数。

这取决于这个评级系统是否需要智能以防止游戏等,有很多事情需要详细说明。用户群有多大等等。

我敢打赌,对于任何普通人来说,即使是相对大规模的系统,这种设置也不会有害。

...半无关的:

仅供参考,根据此分数的重要性和游戏方面,您可以使用 STDDEV() 来获取平均因素,以考虑分数列上的标准偏差......

SELECT STDDEV(`score`) FROM `rating` WHERE `article_id` = {article_id}

假设你关心的是人们是否联合起来写一篇特定的文章,以便在没有正当理由的情况下将其击落或赞扬它,那么这将排除异常值。

于 2012-10-19T20:34:24.927 回答
2

这取决于。我假设这些文章对个人用户来说是独一无二的?在这种情况下,我可以将 user_id 保留在您的评级表中,然后将您的查询更改为:

SELECT ... WHERE article_id = 10

或者

SELECT ... WHERE user_id = 1

取决于您要提取的信息。

您不是“存储 user_id 两次”,而是使用 user_id 将文章链接到与另一个表中的用户关联的唯一数据。您正在采取正确的方法,除了在您的查询中。

于 2012-10-19T20:34:29.510 回答
0

你不应该,由于第三范式,你需要保持独立性。

“第三范式 (3NF) 是用于数据库规范化的范式。3NF 最初由 EF Codd 在 1971 年定义。[1] Codd 的定义指出,当且仅当以下两个条件都成立时,表才处于 3NF 中:

  • 关系 R (table) 是第二范式 (2NF)
  • R 的每个非主属性都非传递地依赖(即直接依赖)R 的每个超键。”

来源: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

于 2012-10-19T20:31:42.080 回答