关于sql:数据由字段内的逗号与新表分隔

Data separated by commas inside a field vs new table

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Is storing a comma separated list in a database column really that bad?

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

例如:

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

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

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

  • 使用字段article_id和创建另一个表article_views
    user_id
  • article表的views字段内保存由逗号分隔的user_id

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

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

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


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

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


你考虑过使用吗?

1
SELECT COUNT(DISTINCT USER + IP) AS UniqueViews FROM Views GROUP BY ArticleID

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