【问题标题】:Data separated by commas inside a field vs new table [duplicate]字段内用逗号分隔的数据与新表[重复]
【发布时间】:2012-10-26 22:49:04
【问题描述】:

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

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

例如:

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

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

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

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

【问题讨论】:

    标签: sql database database-design


    【解决方案1】:

    你考虑过使用

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

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

    【讨论】:

    • FWIW, + 不是 SQL 中的标准字符串连接运算符。仅在 Microsoft 中。
    • 在没有平台的情况下,它实际上只是一个插图。但感谢您的澄清。
    【解决方案2】:

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

    非常简单的设计。这将是一个有两列的表,都是外键。一个到 article 表,另一个到 user 表。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • @john,Larry- NOOB 需要学习 1NF 以及为什么它对你有好处。在这种情况下,一个概念值得一千个技巧和窍门。正如 Date 所说,“理论是实用的”。
      猜你喜欢
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 2011-11-14
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多