【问题标题】:Best method for storing data in mysql?在mysql中存储数据的最佳方法?
【发布时间】:2009-06-17 23:49:15
【问题描述】:

我有一个非常基本的问题,关于在我的数据库中存储数据的首选方式是什么。

我有一个名为“users”的表,每个用户都有一个用户名和 user_id。现在,我想制作一个名为“cmets”的表格,供用户评论新闻。

是在 cmets 中有一个名为“username”的列并存储登录用户名,还是有一个名为“user_id”的列。如果我使用 user_id 我将不得不让我的 sql 语句有另一个 select 语句。 “(从用户中选择用户名,其中 users.id = cmets.user_id)作为用户名”。似乎只存储用户名性能会更好。

我认为我阅读是为了避免数据库中出现重复数据。

哪个更好?

谢谢

【问题讨论】:

    标签: mysql performance


    【解决方案1】:

    通常,您使用 ID 字段将表链接在一起。原因是(在您的情况下)您可能允许该人更改其用户名,但您不想尝试更新位于...的所有位置。

    因此,将 user_id 放入您的 cmets 表中,并在连接中提取用户名,如您所示。

    【讨论】:

    • 是的,完全正确。也许一件事:我总是为我的所有表使用名称“id”,如果它是“主”id,外键以“id_”开头,然后是伪造键的表的名称.因此我的查询看起来像:>。重点是什么 ?不了解您的数据库的人很容易猜出外键的语法,而且(更重要的是)从长远来看,您的数据库更容易维护。
    【解决方案2】:

    如果 user_id 是主键,那么你应该使用 user_id 而不是 username,如果你想使用 username 而不是 user_id,那么为什么你首先要有一个 user_id?

    【讨论】:

      【解决方案3】:

      如果有可能创建足够大的数据库,请将 user_id 存储在 cmets 表中。更少的开销。还要考虑这样可以更轻松地修改用户名。

      【讨论】:

      • 澄清一下,我认为您的意思是如果他们使用用户名,那么他们会遇到较慢的 JOIN,对吧?
      【解决方案4】:

      数据应该存储在(至少)third normalized form,因此您应该使用 user_id 作为 users 表中的主键,并作为 cmets 表中的外键并使用它来获取详细信息:

      SELECT comments.*, users.username  
      FROM comments, users
      WHERE users.user_id = comments.user_id;
      

      如果您是根据文章获取 cmets,您可以这样做:

      SELECT comments.*, users.username  
      FROM comments, users
      WHERE users.user_id = comments.user_id  
      AND comments.article_id = '$current_article_id';
      

      【讨论】:

      • 您根本不需要第二个查询中的文章表。
      【解决方案5】:

      存储用户 ID(整数)将意味着以后更快的 JOIN。除非您打算让人们手动挖掘数据库,否则真的没有理由使用用户名

      【讨论】:

        【解决方案6】:

        我很确定将用户 ID 存储在 cmets 表中就足够了。如果要从 cmets 表返回行,只需使用 JOIN 语句。

        干杯

        【讨论】:

          【解决方案7】:

          哪个是唯一标识符? user_id,我敢打赌,否则你的系统中不能有两个“John Smith”。

          如果数量很重要,从长远来看,匹配用户名字段的文本将比链接到查询中的用户表更昂贵。

          【讨论】:

            【解决方案8】:

            与字母数字 id 相比,数字值的加入和索引成本更低。使用数字来唯一标识一行。另一个好处是,如果需要更改用户 ID,则 PK 不需要更改。最后一个好处是,这是大多数现代 Web 框架(如 django 和 rails)的设计。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-08-15
              • 1970-01-01
              • 2012-03-07
              • 2012-07-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-01-25
              相关资源
              最近更新 更多