关于oracle:可读的SQL别名

Readable SQL aliases

由于我确定许多人使用不同的标准,因此我将此帖子设为社区Wiki。

我的问题是,表别名的良好命名方案是什么? 我一直在使用表名称中每个单词的第一个字母,但是它变得越来越难以理解。 这是一个简单的例子。

1
2
3
FROM incidents i
FROM cause_attack ca
FROM obscure_table ot

谢谢。


表名称本身应该已经可读。因此,如果您想要一个易读的名称,请不要使用别名。

这意味着别名的目的是与其他任何事情一样,可以使您的可怜手指免于重新键入长名称。在这种情况下,简短名称可以很好地工作,尤其是必须在全名旁边声明它们时。

唯一的例外是,如果您要多次连接一个表,在这种情况下,您将需要一些东西来标识所需的表实例,或者您要为子查询添加别名。


别名的全部目的是缩短名称,因此您无需冗长。

它只需要在给定查询中是唯一的,因此不需要命名它们的方案。

编辑:此外,您将使用的别名在很大程度上取决于表命名方案。如果您所有的表都具有5个部分的名称,而前4个部分在查询中是通用的,那么将这些部分保留在别名中是很愚蠢的。


通常,我尝试遵循表的命名结构。

我尝试使用口语表名称,例如'RelObjectProperty',并一致地对其进行别名,例如(对于本示例)'rop'

1
2
3
4
5
6
7
8
9
10
SELECT
  p.Name    PropertyName,
  o.Name    ObjectName,
  rop.Value PropertyValue
FROM
  Property p
  INNER JOIN RelObjectProperty rop ON rop.PropertyId = p.Id
  INNER JOIN Object              o ON rop.ObjectId   = o.Id
WHERE
  o.Id = 10

该首字母缩写方案对于具有严格无冲突表名的数据库很有用,但是不能总是保证这一点。

可能有一个表'RelObjectPresentation',在这种情况下,我很可能会破坏该方案,并对第一个使用'rop',对于后一个使用'ropr'。即使在这种情况下,我也会保持一致,并且至少在各处都使用'ropr'别名,而不仅仅是在需要与'rop'区别的查询中。


我通常会像您一样做,除了我只使用大写字母的首字母,直到我有多个以相同名称开头的表或对同一表的多个引用,然后再添加一个后缀以区别两者。任何使读者明白的东西。如果在子查询(例如Employee表)中使用与外部查询相同的表,则可以使用前缀i或o来区分,例如

1
2
3
4
5
-- Find Highest paid Emplyees in Each Division .....
SELECT * FROM Employee oE -- For outer Employee table
WHERE Salary = (SELECT MAX(Salary)
                FROM Employee iE
                WHERE DivisionId = oE.DivisionId)

这样,当我读取SQL时,可以在内部读取别名为"内部员工"或"外部员工"


在数据仓库场景中,我通常使用第一个字符,但使用fact_dim_cdim_作为前缀,以区分事实表,维表或一致的维表。我还将对lkup_进行查找(因此LOOKUP_TRANSACTION_TYPE将变为lkup_TT)。

查找技术也将在OLTP类型的数据库中工作。

通常,查询中没有大量的表,因此很难遵循缩写,而且表别名之间通常没有任何冲突(因为通常已经有一些分组,例如SYSTEM_SUBSYSTEM_ENTITY_TYPE),因此,效果是,表名称始终具有相同的别名。

与A,B,C或T1,T2,T3技术相比,这是一个很好的优势,因为它是可遵循的,并且有助于避免剪切和粘贴错误。


尽管我不是Oracle专家(实际上,这个问题几乎适用于所有RDBMS),但我对"您被迫遵循的最奇怪的编码标准规则是什么"的回答似乎在这里适用得很好(在这篇文章的背景)...

对于我们来说,这全都与表名有关。我们从使用此标准的客户那里得到了这个想法,在我们全部适应之后,我们就喜欢它了。表名非常冗长,但是由于所有表名都具有唯一的助记符前缀,因此我们始终具有一组标准化的别名:只需使用前缀即可。从这个客户中脱离出来之后,我们就为新系统保留了命名方案,从那时起它一直非常成功。

方案如下:每个表都用大写字母命名,单词之间用下划线表示。每个表都有一个前缀(通常为1-6个字符),通常是主表名称的首字母缩写或缩写。该表的每个字段都以相同的前缀为前缀。在复杂的查询中,前缀也用作别名。因此,假设您有一个简单的架构,人们可以拥有猫或狗。看起来像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PER_PERSON
    PER_ID
    PER_NameFirst
    PER_NameLast
    ...
CAT_CAT
    CAT_ID
    CAT_Name
    CAT_Breed
    ...
DOG_DOG
    DOG_ID
    DOG_Name
    DOG_Breed
    ...
PERCD_PERSON_CAT_DOG (FOR the JOIN DATA)
    PERCD_ID
    PERCD_PER_ID
    PERCD_CAT_ID
    PERCD_DOG_ID

同样,在建立联接时,这些前缀还会提醒您"推荐"(和强制执行!)表别名。前缀使大多数联接查询更易于编写,因为很少需要在字段之前显式引用表,因为即使相关的字段名称都已加上前缀,因此已经在名称范围内了。

巧妙的副作用是,最终,您的开发人员可能仅能使用前缀来引用会话表。可以肯定,这是一种后天获得的味道……但这对我们有用。