【问题标题】:MYSQL should i use 2 querys or add them to my new tableMYSQL 我应该使用 2 个查询还是将它们添加到我的新表中
【发布时间】:2012-09-06 07:34:59
【问题描述】:

好吧,我有 1 个用户表,它存储 USER_NAME、USER_ID 和 USER_COLOR 并且我为将存储 USER_NAME 的日志创建了一个新表

查看页面时,我需要接收此数据 我可以对日志进行 2 次查询,然后搜索 USER_NAME=USER_NAME

的用户

或者我可以将 USER_NAME、USER_ID 和 USER_COLOR 全部存储在日志中 那么我只需 1 次查询即可获取所有数据。

什么会更快或更好?

示例查询

$sql = "SELECT id, username, level, namecolor FROM users ORDER BY level DESC"; 
$query = mysql_query($sql) or die(mysql_error());
$count = mysql_num_rows($query);
while($row = mysql_fetch_object($query)) {
    $Member_id = htmlspecialchars($row->id);

【问题讨论】:

标签: php mysql


【解决方案1】:

当您使用 MySql 时,您的数据库是一个关系数据库。

这给你(你已经知道)很多好处,所以,不要将用户信息(已经存储在它自己的表中)复制到其他表(在这种情况下为日志),你最好这样做joins当需要有关用户的更多信息时。

让用户信息在自己的表中,所以在查询日志数据时可以这样做:

SELECT logs.log_id, logs.log_date, logs.user_name, users.user_color
FROM logs
LEFT JOIN users ON logs.user_name = users.user_name

另一点:想想复制用户信息时会发生什么,如果您向用户表(例如电子邮件)添加一个新字段。

【讨论】:

  • 你能在 php 中给我看这个吗?我会更新我的帖子来告诉你我是如何进行查询的
  • 您可以将您的 sql 查询(在您现在的问题中的 PHP 代码中)替换为我给您的第一个查询作为示例。它会立即起作用。您应该只替换您需要的字段。
  • 顺便说一下,我推荐你使用 PDO 来执行 SQL 连接和查询(但那是另一回事了)。
  • 你有一个很好的 PDO 指南,我读到它们都对 php 游戏不利。
【解决方案2】:

更好的是第三范式。简单来说,这意味着每个非键列都应该依赖于键、整个键,而且只有键,所以帮助我 Codd :-)

有时有充分的理由恢复到较低的规范化级别,但这种情况很少见,您需要了解并缓解潜在问题,例如最终每个用户 ID 有多个用户名,反之亦然。在这种情况下,我会说坚持使用多表版本。

【讨论】:

    【解决方案3】:

    最好加入这些表:

    select users.*, logs.* from logs inner join users on logs.USER_NAME=users.USER_NAME
    

    您将在一个查询中获得所有信息。

    【讨论】:

      【解决方案4】:

      我认为您可以将其作为核心用户信息放在不同的表中,例如 USER_NAMEUSER_IDUSER_COLOR 对于每个用户来说只有一个。另一方面,每个用户的日志可能很多。因此,如果您将所有内容存储在日志表中,您的数据库将使用更多空间来存储其他信息,例如 USER_NAMEUSER_IDUSER_COLOR 每次用户发生一些日志时。

      我认为您应该阅读mysql 中有关JOIN 的内容,以了解如何在一个查询中组合这两个表并获得结果。更多阅读JOINLink

      我不能在这里提出查询,因为这取决于数据的类型以及您希望它如何从数据库中取出。

      【讨论】:

        【解决方案5】:

        最好保留两张表。

        数据库设计和第一范式规定您不应该多次拥有相同的数据。

        因此,如果您将所有数据都保存在第二个表中,那么您就是在进行糟糕的设计实践。

        有一个很好的例子http://en.wikipedia.org/wiki/First_normal_form

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-21
          • 2013-06-01
          • 1970-01-01
          • 2017-09-21
          相关资源
          最近更新 更多