Readable SQL aliases
由于我确定许多人使用不同的标准,因此我将此帖子设为社区Wiki。
我的问题是,表别名的良好命名方案是什么? 我一直在使用表名称中每个单词的第一个字母,但是它变得越来越难以理解。 这是一个简单的例子。
1 2 3 | FROM incidents i FROM cause_attack ca FROM obscure_table ot |
谢谢。
表名称本身应该已经可读。因此,如果您想要一个易读的名称,请不要使用别名。
这意味着别名的目的是与其他任何事情一样,可以使您的可怜手指免于重新键入长名称。在这种情况下,简短名称可以很好地工作,尤其是必须在全名旁边声明它们时。
唯一的例外是,如果您要多次连接一个表,在这种情况下,您将需要一些东西来标识所需的表实例,或者您要为子查询添加别名。
别名的全部目的是缩短名称,因此您无需冗长。
它只需要在给定查询中是唯一的,因此不需要命名它们的方案。
编辑:此外,您将使用的别名在很大程度上取决于表命名方案。如果您所有的表都具有5个部分的名称,而前4个部分在查询中是通用的,那么将这些部分保留在别名中是很愚蠢的。
通常,我尝试遵循表的命名结构。
我尝试使用口语表名称,例如
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 |
该首字母缩写方案对于具有严格无冲突表名的数据库很有用,但是不能总是保证这一点。
可能有一个表
我通常会像您一样做,除了我只使用大写字母的首字母,直到我有多个以相同名称开头的表或对同一表的多个引用,然后再添加一个后缀以区别两者。任何使读者明白的东西。如果在子查询(例如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时,可以在内部读取别名为"内部员工"或"外部员工"
在数据仓库场景中,我通常使用第一个字符,但使用
查找技术也将在OLTP类型的数据库中工作。
通常,查询中没有大量的表,因此很难遵循缩写,而且表别名之间通常没有任何冲突(因为通常已经有一些分组,例如
与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 |
同样,在建立联接时,这些前缀还会提醒您"推荐"(和强制执行!)表别名。前缀使大多数联接查询更易于编写,因为很少需要在字段之前显式引用表,因为即使相关的字段名称都已加上前缀,因此已经在名称范围内了。
巧妙的副作用是,最终,您的开发人员可能仅能使用前缀来引用会话表。可以肯定,这是一种后天获得的味道……但这对我们有用。