3

可能重复:
在数据库列中存储逗号分隔列表真的那么糟糕吗?

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

例如:

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

因此,假设在我的设计中,我可以使用与 IP 或其他东西一起存储的单个数字来识别用户(或至少是一台计算机)。

那么,如果我想跟踪有多少独立用户看过一篇特定的文章,那么最好的方法是什么?

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

3 回答 3

7

永远,永远,永远选择逗号分隔的解决方案。它违反了数据库设计的每一条原则。而是创建一个单独的表。

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

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

于 2012-11-06T22:15:52.153 回答
2

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

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

于 2012-11-06T22:16:31.013 回答
0

您是否考虑过使用

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

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

于 2012-11-07T03:40:21.063 回答