您是否在表中使用缩写表名称前缀每个字段?
示例:
Table: User
Fields:
user_id
user_name
user_password
或者,您是否将字段命名为最低限度?
Fields:
id
name
password
如果您同时使用了这两种格式,那么从长远来看,您觉得哪种格式最有帮助?
编辑:这个问题似乎没有明确的答案,双方都提出了好的观点。但是我已经把问题保持了很长时间,也许是时候将一个答案标记为已被接受。因此,我被认为是被接受的最高票数。
答案 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 练习:
amount
的含义
(transactions
,incomes
) - 除非
他们是xac_amount
和
inc_amount
。大多数查询工具都有
不输出别名
字段名称。x
作为别名
transaction
,另一个人会使用
tran
等等。实际上,前缀只是强制表别名,因此您可以轻松查看哪个字段属于哪个表。
答案 13 :(得分:0)
如果您为每个表使用UNIQUE PREFIX,那么