数据由字段内的逗号与新表分隔

时间:2012-11-06 22:13:20

标签: sql database database-design

  

可能重复:
  Is storing a comma separated list in a database column really that bad?

这是我在尝试扩展数据库时经常遇到的问题。

例如:

我想跟踪有多少用户在我的网站上看到特定文章,因此在数据库中我向views表添加了article字段。现在,如果我想确保这些是唯一的视图,那么这显然是不够的。

所以,让我们说在我的设计中,我可以识别一个用户(或至少一台计算机),其中包含一个与IP或其他东西一起存储的号码。

然后,如果我想跟踪有多少唯一用户看到特定文章哪个是最好的方式?

  • 使用字段article_views创建另一个表article_id user_id
  • 将逗号分隔的user_id保存在views表的article字段中。

3 个答案:

答案 0 :(得分:5)

永远不要选择单独的逗号解决方案。这违反了数据库设计的每一个原则。改为创建一个单独的表。

在您的特定情况下,使用PRIMARY KEY创建表(article_id,user_id)。然后,数据库将禁止输入重复记录。根据您的SQL引擎,您还可以使用INSERT或IGNORE(或等效的)来避免抛出异常。

另一个解决方案要求您在触摸数据的所有应用程序中强制执行唯一性。

答案 1 :(得分:2)

请勿使用逗号分隔值。永远。创建一个单独的表,将所有这些ID链接到所查看的文章。

非常简单的设计。它将是一个包含两列的表,都是外键。一个到文章表,另一个到用户表。

答案 2 :(得分:0)

您是否考虑过使用

SELECT COUNT(DISTINCT User + IP) As UniqueViews FROM Views GROUP BY ArticleID

如果您的视图表包含针对用户和IP的重复记录(即每天每个cilck或其他10个),则COUTN(DISTINCT)将计算它们的不同出现次数,而不是记录数。