您是否使用缩写表名作为表中每个字段的前缀?
例子:
Table: User
Fields:
user_id
user_name
user_password
或者你是否至少命名你的字段?
Fields:
id
name
password
如果您两者都使用过,那么从长远来看,您认为哪种格式对您的帮助最大?
编辑:这个问题似乎没有明确的答案,双方都提出了很好的观点。但是我将这个问题保持开放太久了,也许是时候将一个答案标记为已接受了。因此,我将投票率最高的标记为已接受。
您是否使用缩写表名作为表中每个字段的前缀?
例子:
Table: User
Fields:
user_id
user_name
user_password
或者你是否至少命名你的字段?
Fields:
id
name
password
如果您两者都使用过,那么从长远来看,您认为哪种格式对您的帮助最大?
编辑:这个问题似乎没有明确的答案,双方都提出了很好的观点。但是我将这个问题保持开放太久了,也许是时候将一个答案标记为已接受了。因此,我将投票率最高的标记为已接受。
不要那样做。这是多余的,从长远来看会导致挫败感。
唯一可以应用它的字段可能是id
,因为user_id
显然是用户的 id,它会简化 SQL 中的连接编写。但我什至不会那样做。
如果你这样做,你最终会编写如下查询:
SELECT user.user_name, user.user_password, user.user_firstname ...
代替
SELECT user.name, user.password, user.firstname
所以IMO你的问题的答案很清楚。
你不再需要这样做了,你真的不应该这样做。saua 指出的唯一例外可能是用于寻求连接清晰度的 ID 字段。
使用表名作为字段名前缀的概念来自旧系统的旧时代,当时整个数据库中的每个字段都需要是唯一的。
因此,除非您处理的是要求整个数据库中的每个字段都具有唯一名称的遗留系统;不要做。
我不会这样做的。如果您想要某个字段属于哪个表的信息,您可以随时将查询编写为
select user.id, user.name from user where ...
但是想象一下,您出于某种原因决定重命名您的一张表(可能从“用户”更改为“客户”)。您还必须重命名所有字段,以保持一致。
我的观点:你应该这样做没有充分的理由,不这样做有几个充分的理由。
将前缀放在列名上可能是一个好习惯。如果您正在处理一个正式的(并且可能是大型的)数据库并且您正在关注 ISO 11179(特别是数据元素名称的概念),那么最好将完整的三个(或四个)部分名称放入:对象 - 属性 - 表示术语。(第四个可选部分是限定符。)例如,“user_first_name”。这样,您的数据字典和数据库模式之间就会保持一致。由于已经评论过的原因,我不会对较小的数据库执行此操作,但在复杂的模式中,这会降低一些错误风险。
我们通常也不使用缩写表前缀,我也不建议这样做。
但是,我们会在一种情况下进行:保留字段。
e.g. OH_Reserve_Field_Alpha3 in table ORDER_HEADER
简短背景:我们的数据库有 250 多个表,我们将其中的大多数保留列用于将来的功能实现。可以想象,如果没有前缀,您最终将拥有 50 个 Reserve_Field_Alpha3,它们在整个代码中具有完全不同的含义但名称相同。现在已经很难了,但是没有前缀会更糟。
我建议坚持使用表别名,例如:
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
当我将字段“序数”添加到表中时,我喜欢添加前缀,这样我就不必在 JOINS 中为其他表中的序数字段设置别名。有时它对 JOINS 很方便……不确定我是否看到了其他好处。
MediaWiki(维基百科软件)使用该约定。下载源代码。它们将自己限制为两个字符的前缀。
我不推荐这种做法。对于大多数数据库来说,它不是必需的。
以这种方式(最少)命名字段是可以的,但对于主键和标题/名称。如果您始终将所有主键命名为 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
就个人而言,在“用户”表上,我的列只是“id”。
但是,指向该列的不同表上的任何外键列,我都会称该列为“user_id”。
所以你最终可能会得到这样的结果:
select *
from order
inner join user
on user.id=order.user_id
由于给出的所有原因,我认为这不是一个好主意。此外,您不会在类中的所有方法前面加上类名,对吗?那么为什么要对数据库对象这样做呢?
前缀变体只是需要更长的时间来编写,并且使读取具有许多字段的 sql 语句变得更加困难。
即使您从多个表中进行选择,这也只会给您带来不必为不明确的字段加上表名前缀的好处。但
SELECT user.name, image.name FROM user, image
与
SELECT user_name, image_name FROM user, image
查询中没有歧义字段的好处很快就会被每次使用列名时必须键入表名的开销所消耗。
这是一个很棒的练习:
amount
( transactions
, incomes
) 是什么意思——除非它们是xac_amount
and
inc_amount
。大多数查询工具不会将别名与字段名称一起输出。x
的别名
transaction
,另一位将使用
tran
,依此类推。其实前缀只是强制的表别名,所以你可以很容易地看到哪个字段属于哪个表。
如果您为每个表使用 UNIQUE PREFIX,则