可能重复:
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
字段中。答案 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)将计算它们的不同出现次数,而不是记录数。