表字段命名约定和 SQL 语句



我有一个关于命名数据库中的表字段的实际问题。例如,我有两个表:

student (id int; name varchar(30))
teacher (id int, s_id int; name varchar(30))

两个表中同时有"id"和"name"。在 SQL 语句中,如果没有表名前缀,则两者将不明确。两个选项:

  1. 在 SQL 'where' 子句中使用表名作为字段的前缀
  2. 在表中使用带前缀的字段名称,以便在"where"子句中不使用前缀。

哪一个更好?

毫无疑问,选择选项 1。 这在任何类型的数据库中都是有效的sql,被认为是正确且最具可读性的格式。 将表名前缀为列是很好的习惯,在执行联接时非常必要。 我最常看到的唯一例外是在 id 列前面加上表名,但我仍然不会这样做。
如果你选择选项2,经验丰富的DBA可能会指着你嘲笑你。
有关进一步的证据,请参阅此处的#2:https://www.periscopedata.com/blog/better-sql-schema.html
而这里。 第1b条 - http://www.isbe.net/ILDS/pdf/SQL_server_standards.pdf

正如 TT 所提到的,如果您学习如何使用别名作为表名,您的生活会让您的生活更加轻松。 这就像在查询中使用SomeTableNameThatsWayTooLong as long_table一样简单,例如:

SELECT LT.Id FROM SomeTableNameThatsWayTooLong AS LT

对于非临时查询,应始终在每个字段前面加上表名或表别名,即使字段名称不明确也是如此。这可以防止查询在有人向其中一个引入歧义的表添加新列时中断。

因此,这将使"id"和"name"明确无误。但我仍然建议使用比"id"更具体的东西来命名主键。在您的示例中,我将使用 student_idteacher_id .这有助于防止联接中的错误。无论如何,当您遇到具有多个唯一键或多部分键的表时,您将需要更具体的名称。

这些事情值得考虑,但最终一致性可能是更重要的因素。我可以处理围绕id而不是student_id构建的表,但我目前正在使用使用以下所有内容的不一致模式:idsidsystemid和特定名称,如 taskid 。这是两全其美的最糟糕的。

我会使用别名而不是表名。

可以为查询中的表分配比表名短的别名。这使得查询更具可读性。例:

SELECT 
    t.name AS teacher_name,
    s.name AS student_name 
FROM 
    teacher AS t 
    INNER JOIN student AS s ON 
        s.id=t.s_id;

如果您不使用别名,您当然可以使用表名,这比选项 2 更可取。

如果它不是太长,我更喜欢在表格本身中加上前缀,例如teacher.teacher_id、student.student_name。 这样,您始终可以确定您正在谈论的名称或 id,即使您要为表名添加前缀。