因为我确信很多人有不同的标准,所以我把这篇文章做成了一个社区维基。
我的问题是,表别名的好的命名方案是什么?我一直在使用表名中每个单词的第一个字母,但它变得非常难以阅读。这是一个简单的例子。
FROM incidents i
FROM cause_attack ca
FROM obscure_table ot
谢谢你。
别名的全部意义在于缩短名称,因此您不需要冗长。
它只需要在给定查询中是唯一的,因此不需要命名它们的方案。
编辑:此外,您使用的别名高度依赖于表命名方案。如果您的所有表都有一个由 5 部分组成的名称,其中前 4 个在查询中是通用的,那么将这些部分保留在别名中是很愚蠢的。
表名本身应该已经可读。因此,如果您想要一个可读的名称,请不要使用别名。
这意味着别名的目的与其他任何事情一样,都是为了避免您可怜的手指重新输入长名称。在这种情况下,简短的名称效果很好,特别是因为它们必须紧挨着全名声明。
这里唯一的例外是,如果您不止一次地加入一个表,在这种情况下,您需要一些东西来确定您需要的表的哪个实例,或者如果您正在为子查询设置别名。
通常我会尝试遵循表的命名结构。
我尝试使用说话的表格名称,例如'RelObjectProperty'
,并始终如一地为它们起别名(对于此示例)'rop'
:
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
此首字母缩略词方案对于具有严格无冲突表名的数据库很有帮助,但不能始终保证这一点。
可能有一个 table 'RelObjectPresentation'
,在这种情况下,我很可能会破坏该方案并'rop'
用于第一个和'ropr'
后者。即使在这种情况下,我也会保持一致,至少在任何地方都'ropr'
使用别名,而不仅仅是在我需要区分的查询中。'rop'
我通常和你做类似的事情,除了我只使用第一个字母,大写,直到我有多个以相同名称开头的表,或者同一个表的多个引用,然后我添加一个后缀来区分两者..任何让读者清楚的东西。如果我在子查询中使用与外部查询相同的表(比如 Employee 表),我可以使用前缀 i 或 o 来区分,如
-- 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 时,我可以在内部将别名读取为“Inner Employee”或“Outer Employee”
在数据仓库场景中,我通常使用第一个字符,但前缀为fact_
、dim_
或cdim_
,以区分事实、维度或一致的维度表。我也会做lkup_
查找(所以LOOKUP_TRANSACTION_TYPE
会变成lkup_TT
)。
查找技术也适用于 OLTP 类型的数据库。
通常,我在查询中没有大量的表,其中缩写词很难理解,而且表别名之间通常没有任何冲突(因为通常已经有一些分组,例如SYSTEM_SUBSYSTEM_ENTITY_TYPE
),因此,实际上,表名始终具有相同的别名。
与 A、B、C 或 T1、T2、T3 技术相比,这是一个很好的优势,因为它是可遵循的并且有助于避免剪切和粘贴错误。
虽然我不是 Oracle 人(实际上,这个问题应该适用于几乎所有 RDBMS),但我对“您被迫遵循的最奇怪的编码标准规则是什么”的回答似乎在这里适用(编辑以使其在这篇文章的上下文)...
对我们来说,这都是关于表名的。我们从一个使用这个标准的客户那里得到这个想法,在我们都适应它之后,我们喜欢它。表名相当冗长,但由于它们都有唯一的助记前缀,我们总是有一组标准化的别名:只需使用前缀即可。一旦我们脱离了这个客户,我们就保留了新系统的命名方案,并且从那以后它一直非常成功。
方案如下:每个表都以大写字母命名,单词之间有下划线。每个表都有一个前缀(通常为 1 - 6 个字符),通常是主表名称的首字母缩写词或缩写。表的每个字段也都带有相同的前缀。在复杂查询中,前缀也用作别名。所以,假设你有一个简单的模式,人们可以拥有猫或狗。它看起来像这样:
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
同样,在构建连接时,前缀是为了提醒“推荐”(和强制!)表别名。前缀使大多数连接查询更容易编写,因为您必须在字段之前显式引用表是非常罕见的,因为即使相关的字段名称也有前缀,因此已经有点名称范围。
一个巧妙的副作用是,最终,您的开发人员可能能够通过前缀来开始引用对话中的表。可以肯定的是,后天的品味……但这对我们有用。