在具有缩写表名的表中为每个字段名称加前缀是一个好习惯吗?

时间:2009-01-21 12:43:13

标签: database-design schema

您是否在表中使用缩写表名称前缀每个字段?

示例:

Table: User

Fields:
user_id
user_name
user_password

或者,您是否将字段命名为最低限度?

Fields:
id
name
password

如果您同时使用了这两种格式,那么从长远来看,您觉得哪种格式最有帮助?

编辑:这个问题似乎没有明确的答案,双方都提出了好的观点。但是我已经把问题保持了很长时间,也许是时候将一个答案标记为已被接受。因此,我被认为是被接受的最高票数。

14 个答案:

答案 0 :(得分:31)

不要那样做。这是多余的,从长远来看会导致挫败感。

可以应用此字段的唯一字段可能是id,因为user_id显然是用户的ID,它会简化在SQL中编写连接的过程。但我甚至不会这样做。

答案 1 :(得分:19)

如果你这样做,你将最终编写如下的查询:

SELECT user.user_name, user.user_password, user.user_firstname ...

而不是

SELECT user.name, user.password, user.firstname

所以IMO对你的问题的回答很清楚。

答案 2 :(得分:9)

你不再需要这样做了,你真的不应该这样做。 saua pointed out唯一的例外可能是寻找联接清晰度的ID字段。

当整个数据库中的每个字段都必须是唯一的时,带有表名称的字段名称前缀的概念来自旧系统的旧时代。

因此,除非您正在处理要求整个数据库中的每个字段都具有唯一名称的遗留系统;不要这样做。

答案 3 :(得分:7)

我不会这样做。如果您想要一个字段所属的表的信息,您始终可以将查询编写为

select user.id, user.name from user where ...

但是想象一下,无论出于何种原因,你决定重命名你的一张桌子(可能是从'用户'到'顾客')。您还必须重命名所有字段,以保持一致。

我的观点:没有充分的理由说明你应该这样做,并有几个很好的理由不去做。

答案 4 :(得分:4)

将前缀放在列名称上是一种很好的做法。如果您正在处理正式(可能是大型)数据库并且您正在关注ISO 11179(特别是数据元素名称的概念),那么最好将完整的三(或四)部分名称放入:对象 - 属性 - 表示术语。 (第四个可选部分是限定符。)例如,“user_first_name”。这样,您就可以在数据字典和数据库模式之间保持一致。出于已经评论的原因,我不会为较小的数据库执行此操作,但在复杂的模式中,这会降低一些错误风险。

答案 5 :(得分:3)

我们也不会正常使用缩写表格前缀,我也不会建议。

但是我们有一种情况:保留字段

 e.g. OH_Reserve_Field_Alpha3 in table ORDER_HEADER

简短背景:我们的数据库有250多个表,我们在其中大部分都保留了列,以便将来用于未来的功能实现。你可以想象,如果没有前缀,你最终会有50个Reserve_Field_Alpha3具有完全不同的含义,但在你的代码中同名。现在已经很难了,但没有前缀会更糟糕。

答案 6 :(得分:3)

我建议坚持使用表别名,例如:

SELECT 
    user.id,
    user.email, 
    user.firstname, 
    user.secondname,
    avatar.filename
FROM
    pain_in_the_butt_table_name user
LEFT JOIN
    table_with_the_avatars avatar
ON avatar.user_id = user.id

优点:

  • 维护一个易于理解的您选择的字段列表,以及您从中获取的表格

  • 避免输入长或难以理解的表名,并用简短易懂的名称替换它们(在创建表时应该这样做)

  • 执行可读的连接(您的示例应为:

LEFT JOIN table_with_the_avatars.user_id ON user.user_id = table_with_the_avatars.avatars_user_i

  • 创建更短的别名,在我的例子中,这意味着你而不是用户,而不是化身,缩短你的查询

答案 7 :(得分:2)

当我将字段“ordinal”添加到表格中时,我想添加一个前缀,这样我就不必在JOINS中添加其他表中的别名字段。 JOINS有时会很方便...不确定我是否已经看到了其他好处。

MediaWiki(Wikipiedia软件)使用该惯例。下载源代码。 它们将自己限制为两个字符的前缀。

我不推荐这种做法。对于大多数数据库来说,没有必要。

答案 8 :(得分:2)

就个人而言,在'用户'表格中,我的专栏只是'id'。

但是在指向该列的不同表上的任何外键列,我都会调用列'user_id'。

所以你最终会得到这样的东西:

select  *
from    order
        inner join user
            on user.id=order.user_id

答案 9 :(得分:1)

出于所有原因,我认为这不是一个好主意。此外,你没有为类中的所有方法添加类名前缀,是吗?那么为什么要对数据库对象呢?

答案 10 :(得分:1)

可以按字母(最低限度)命名字段,但是对于主键和字幕/名称。如果您始终将所有主键命名为ID,并将其命名为Name,则构造查询将退化为多余的别名:

select i.id as invoice_id

v.id as vendor_id, p.id as product_id, 
v.name as vendor, p.name as product, b.name as branch, c.name as parcel,

i.total_amount,
i.discount,
i.invoice_date

from invoice i
join product p on i.product_id = p.id
join vendor v on i.vendor_id = v.id
join branch b on i.branch_id = b.id
join parcel c on i.parcel_id = c.id

由于连接表并显示实体的标题/名称是常态而非例外,我将我的主键命名为完整形式,而标题/名称字段则与表名相同。

create table product
(
product_id uuid not null, -- primary key
product text not null,
bar_code text not null default '',
rfid_code text  not null default '',
current_qty int default 0
);

create table vendor
(
vendor_id uuid not null, -- primary key
vendor text not null,
is_active boolean not null default true
);

create table branch
(
branch_id uuid not null, -- primary key
branch text not null,
sub_branch_of_id uuid,
current_sales money not null default 0,        
);

create table user
(
user_id uuid not null, -- primary key
user text not null,
password text not null default ''
);

所以你的查询不会有多余的别名:

select i.invoice_id, p.product_id, v.vendor, p.product, b.branch, c.parcel,

i.total_amount,
i.discount,
i.invoice_date

from invoice i
join product p on o.product_code = p.product_code
join vendor v on o.vendor_code = v.vendor_code
join branch b on o.branch_code = b.branch_code
join parcel c on o.parcel_code = c.parcel_code

答案 11 :(得分:0)

前缀变量只需要更长的时间来编写,并且更难以读取包含许多字段的sql语句。

即使您从多个表中进行选择,这也只会给您带来不必使用表名前缀不明确的字段的好处。但

SELECT user.name, image.name FROM user, image

没什么不同
SELECT user_name, image_name FROM user, image

每次使用列名时必须输入表名的开销很快就会消除havong的好处。查询中没有含糊不清的字段。

答案 12 :(得分:0)

这是一个 awesome 练习:

  1. 你会看到每个领域的含义 至少在哪个领域。您 无法弄清amount的含义 (transactionsincomes) - 除非 他们是xac_amountinc_amount。大多数查询工具都有 不输出别名 字段名称。
  2. 您可以使用表别名 当然。但SQL不需要它们, 并且根据墨菲的定律,如果不是 必需的,不会被使用。有 没有标准,所以一个开发人员会 使用x作为别名 transaction,另一个人会使用 tran等等。
  3. 实际上,前缀只是强制表别名,因此您可以轻松查看哪个字段属于哪个表。

答案 13 :(得分:0)

如果您为每个表使用UNIQUE PREFIX,那么

  • 不需要为连接使用别名(自连接除外)
  • 数据库中的所有列在名称
  • 中应该是唯一的
  • 您可以轻松地从列名称本身(来自a 输出或选择查询)