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,在处理遗留代码时,一致性比良好实践更重要