好吧,假设我有一个用户表,它存储USER_NAME、USER_ID和USER_COLOR并正在为日志创建一个新表,该表将存储USER_NAME
查看页面时,我需要接收此数据我可以做两个查询,一个是日志,然后搜索USER_NAME=USER_NAME 的用户
或者我可以将USER_NAME、USER_ID和USER_COLOR全部存储在日志中那么我只需要一个查询就可以获得所有的数据。
什么更快或更好?
样本查询
$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);
当您使用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
另一点:想想如果在用户表中添加一个新字段(例如电子邮件),在复制用户信息时会发生什么。
最好是第三种范式。简单地说,这意味着每个非键列都应该依赖于键,整个键,除了键什么都不依赖,所以请帮助我编码:-)
有时有充分的理由恢复到较低的正常化级别,但这种情况很少见,您需要了解并缓解潜在的问题,例如每个用户ID最终会出现多个用户名,反之亦然。在这种情况下,我会说坚持多表版本。
最好加入这些表:
select users.*, logs.* from logs inner join users on logs.USER_NAME=users.USER_NAME
您将在一个查询中获得所有信息。
我认为您可以将其放在不同的表中,作为核心用户信息,如USER_NAME
、USER_ID
、USER_COLOR
,每个用户只有一个。另一方面,每个用户的日志可能很多。因此,如果您将所有内容都存储在日志表中,那么每当用户出现某些日志时,您的数据库将使用更多空间来存储USER_NAME
、USER_ID
、USER_COLOR
等附加信息。
我认为您应该阅读mysql
中的JOIN
,了解如何将两个表组合在一个查询中并获得结果。JOIN
链路上的更多读数
我不能在这里提出查询,因为它取决于什么样的数据以及你希望它如何从数据库中出来。
最好保留这两个表。
数据库设计和第一个普通表单规定您不应该多次拥有相同的数据。
所以,如果你把所有的数据都保存在第二个表中,你就是在做一个糟糕的设计实践。
有一个很好的例子http://en.wikipedia.org/wiki/First_normal_form