mysql - 表中的列前缀

标签 mysql sql database database-schema prefix

首先我需要指出我阅读了Database columns type prefix但这不是同一个问题。

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

例如对于 users 表,我使用前缀 u_ 所以所有列都被命名为 u_idu_name 等等在。与所有其他表相同,例如对于 products 它将是 p_ 前缀。

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

您对此有何看法?您是否使用这样的列命名,或者您认为这完全没有必要并且浪费时间? (显示数据时,如果不使用函数或 foreach 删除它们,则需要使用前缀)

编辑

以防万一更多的解释

假设我们有包含字段 id、name 的用户表和包含字段 id、name、user_id 的地址表

如果使用此方法,如果我们想要获取所有字段,我们可以这样做:

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);        
}

我得到:

array(8) { [0]=> string(1) "1" ["id"]=> string(1) "1" 1=> string(5) "Frank" ["name"]=> string(3) "USA" [2]=> string(1) "1" [3]=> string(3) "USA" [4]=> string(1) "1" ["user_id"]=> string(1) "1" } array(8) { [0]=> string(1) "2" ["id"]=> string(1) "2" 1=> string(4) "John" ["name"]=> string(6) "Canada" [2]=> string(1) "2" [3]=> string(6) "Canada" [4]=> string(1) "2" ["user_id"]=> string(1) "2" }

而在 PhpMyAdmin 中该查询的结果如下所示:

PhpMyAdmin result

在 PHP 中获取所有数据,但我可以使用数字索引访问数据:$data[0]$data[1],这不是很方便。我不能使用用户名,因为在 $data['name'] 中只有地址名,id 中也一样。如果我使用两者中的任何一个:列的别名或列的前缀,我将能够使用字符串索引来访问数据,例如 $data['user_name'] 来访问用户名和 $ data['address_name'] 访问地址名称。

最佳答案

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

如果比较:

SELECT t1_col1, t2_col1
FROM t1, t2;

...与:

SELECT t1.col1, t2.col1
FROM t1, t2;

...那么该建议可能显得合理。

现在比较:

SELECT t3_col3, t4_col4 FROM t3, t4;

...与:

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)可能会在结果集中的多个列具有相同名称时感到困惑(因为它们将行作为按列名索引的数组返回)。该问题仍然可以通过为结果集中的列设置别名来解决。

关于mysql - 表中的列前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24958378/

相关文章:

java - 如何使用预定义的sqlite数据库

database - 查询 Postgresql 管理员权限

c# - 使用 C# 从 SQL Server 数据库显示 PDF

php - Laravel Eloquent从belongsToMany()查询中排除特定结果

mysql - 选择...in (column1),其中column1 为 '1,4,7'

MySQL 仅选择 1 个具有 AS 别名的字段

sql - #SQL Server中的表数据完整性如何?

mysql - AWS MYSQL (mysqli_real_connect() : (HY000/2002)) : cannot allocate memory for the buffer pool

php - 更改显示条目期间数据表卡住

php - CakePHP 1.3 - where 子句中的未知列