Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 表中的列前缀_Mysql_Sql_Database_Database Schema_Prefix - Fatal编程技术网

Mysql 表中的列前缀

Mysql 表中的列前缀,mysql,sql,database,database-schema,prefix,Mysql,Sql,Database,Database Schema,Prefix,首先我需要指出我读过,但这不是同一个问题 很久以前,和我一起工作的人告诉我,在我参加的项目中,所有列都需要有唯一的前缀 例如,对于用户表,我使用前缀u\u,因此所有列都命名为u\u id,u\u name等等。与所有其他表格相同,例如产品的前缀将为p 这样做的原因是更容易进行SQL联接——如果要联接两个或多个表,则所有列都将具有唯一的名称。老实说,到目前为止我已经使用过这个建议,但事实上我不知道你们中的许多人是否使用过它,或者它是否真的很有用 你对此有什么看法?您是否使用这种列命名,或者您认为这

首先我需要指出我读过,但这不是同一个问题

很久以前,和我一起工作的人告诉我,在我参加的项目中,所有列都需要有唯一的前缀

例如,对于
用户
表,我使用前缀
u\u
,因此所有列都命名为
u\u id
u\u name
等等。与所有其他表格相同,例如
产品
的前缀将为
p

这样做的原因是更容易进行SQL联接——如果要联接两个或多个表,则所有列都将具有唯一的名称。老实说,到目前为止我已经使用过这个建议,但事实上我不知道你们中的许多人是否使用过它,或者它是否真的很有用

你对此有什么看法?您是否使用这种列命名,或者您认为这完全是不必要的和浪费时间的?(显示数据时,如果不使用function或foreach删除前缀,则需要使用前缀)

编辑

以防万一,还有更多的解释

假设我们有字段id为的users表,字段id为的name和address表

如果使用此方法,如果我们希望获取所有字段,则可以执行以下操作:

SELECT * 
FROM users u 
LEFT JOIN address a on u.u_id = a.a_user_id
如果我们不对列使用前缀,我们应该使用:

SELECT u.id AS `u_id`, 
  u.name AS `u_name`, 
  a.id AS `a_id`, 
  a.name AS `a_name`, 
  a.user_id 
FROM users u 
LEFT JOIN address a on u.id = a.user_id
假设我们当然希望使用列作为名称,而不是数字索引0、1等等(例如在PHP中)

EDIT2

我似乎没有充分解释问题所在——在MySQL中,当然,在这两种情况下,一切都很好,这不是问题

然而,问题是当我想在编程语言中使用数据时,例如PHP。如果我使用:

<?php

$db = new mysqli('localhost','root','','test_prefix');

$result = $db->query("SELECT * FROM `user` u LEFT JOIN `address` a ON u.id = a.user_id ");
while ($data = $result->fetch_array()) {
    var_dump($data);        
}

我认为这很愚蠢。实际上,即使在没有歧义的情况下,也会在所有查询中的所有列前面加上它们的表名(或“标识符”)

如果你比较:

SELECT t1_col1, t2_col1
FROM t1, t2;
。。。与:

SELECT t1.col1, t2.col1
FROM t1, t2;
SELECT col3, col4
FROM t3, t4; -- assuming col3 exists only in t3, and col4 only in t4
。。。那么,这项建议似乎是明智的

现在比较一下:

SELECT t3_col3, t4_col4 FROM t3, t4;
。。。与:

SELECT t1.col1, t2.col1
FROM t1, t2;
SELECT col3, col4
FROM t3, t4; -- assuming col3 exists only in t3, and col4 only in t4
现在好处在哪里

人们仍然可以认为,一个或两个字母的前缀比长表名更可取:

SELECT t1_col1, t2_col1
FROM very_long_table_name1, very_long_table_name2;
但既然你能做到,为什么还要麻烦加前缀呢

SELECT t1.col1, t2.col1
FROM very_long_table_name1 AS t1, very_long_table_name2 AS t2;


实际上,在某些情况下,前缀可能会派上用场(在我看来,派上用场并不意味着推荐)。例如,当结果集的多个列具有相同的名称时,一些驱动程序(我认为是旧的PHP)可能会混淆(因为它们返回的行是按列名索引的数组)。这个问题仍然可以通过在结果集中对列进行别名处理来解决。

我认为这是不必要的,但是以现有项目一致性的名义,您应该维护它或重构整个数据库

为什么这是不必要的?我们来看一下下面的查询,它演示了如何从数据库中获取所需内容

而且我认为它更具可读性,alliasing的作品也很好

在列名冲突的情况下,wich不能很好地处理某些驱动程序,您可以使用AS语句来获取特定字段,因为您可以两次连接同一个表wich在使用前缀时会给您带来完全相同的问题

SELECT 
  `m`.*, 
  `u1`.`username` AS `sender`, 
  `u2`.`username` AS `receiver`
FROM `messages` `m` 
INNER JOIN `users` `u1` ON `m`.`sender` = `u1`.`id`
INNER JOIN `users` `u2` ON `m`.`receiver` = `u2`.`id`

我甚至认为这是一种危险的做法,因为它会鼓励草率的编码

假设您有两个表:User和Usage

select u_type, us_name
from User
inner join Usage on u_id = us_id
哪个领域来自哪里?您需要查看表结构来确定它,在这些情况下进行假设是很有诱惑力的

select u.type,us.name
from User us
inner join Usage u on us.id = u.id

现在,您已经拥有了所有需要的信息。

我想主要的想法是避免名称冲突,因此,如果在加入表时需要id,我不需要将t1.id写为
t\u id
,t2.id写为
t2\u id
,但这就是为什么我问这个问题以了解您的意见+1从我这里可以看出,我避免在我的表中使用名为
id
的列的原因之一是为了避免这种混乱。@MarcinNabiałek我不确定我是否完全理解您的观点。您永远不必为列添加别名:您可以在t1.id=t2.id
上编写
SELECT t1.id,t2.id FROM t1 JOIN t2 ON t1.id=t2.id
(即,您可以在查询中的任何位置将这些列称为
t1.id
t2.id
)@RandomSeed抱歉,我似乎不够清楚。请看我问题中的Edit2,我明白了。这就是我在回答的第二部分中试图涵盖的内容。您可以通过以下列别名来解决此问题:
选择user.name作为user\u name,选择country.name作为country\u name
。虽然我不喜欢在表定义中为所有列名加前缀的想法,但在那些列名前加前缀可能是可以接受的,否则这些列名将与另一个表中的另一列具有相同的名称。我仍然喜欢在需要时使用别名列,但我们在这里进入了一个灰色区域。+1,在处理遗留代码时,一致性比良好实践更重要