1

好吧,说我有 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);
4

5 回答 5

3

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

这为您(如您所知)提供了许多优势,因此,与其将用户信息(已存储在其自己的表中)复制到其他表(在本例中为日志),不如joins在需要有关 a 的更多信息时这样做用户。

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

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

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

于 2012-09-05T22:31:06.510 回答
1

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

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

于 2012-09-05T22:31:30.377 回答
0

最好保留两张桌子。

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

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

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

于 2012-09-05T22:33:19.023 回答
0

最好加入这些表:

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

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

于 2012-09-05T22:31:53.613 回答
0

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

我认为您应该阅读JOINinmysql以了解如何在一个查询中组合两个表并获得结果。更多阅读JOIN 链接

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

于 2012-09-05T22:32:02.473 回答