【问题标题】:Table field naming convention and SQL statements表字段命名约定和 SQL 语句
【发布时间】:2016-02-22 22:17:25
【问题描述】:

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

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

两个表中同时存在“id”和“name”。在 SQL 语句中,如果没有表名前缀,则两者会产生歧义。两种选择:

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

哪个更好?

【问题讨论】:

    标签: sql


    【解决方案1】:

    毫无疑问,请选择选项 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 所提到的,如果您学习如何使用 alias 作为表名,您的生活将会变得更加轻松。就像在查询中使用SomeTableNameThatsWayTooLong as long_table 一样简单,例如:

    SELECT LT.Id FROM SomeTableNameThatsWayTooLong AS LT
    

    【讨论】:

    • 所以在这种情况下,我不应该在两个表中都使用“student_ID”、“teach_ID”、“student_name”、“teacher_name”等字段名称,而应该只使用“id”和“name”。对吗?
    • 在哪个数据库中名为“student_id”的列会导致无效的SQL?
    • 我没说会导致无效的SQL。我说过只要你用表名来限定它,简单地使用“id”或“name”总是有效的。命名每一列 student_id、student_name、student_dorm、student_major 等会让你的开发者发疯,而且是不必要的。
    • 这确实是一个偏好问题@martin,但我可以告诉你,我在专业环境中看到过大约 25 个以上的数据库,而且我认为只有一次我看到每列都带有表名前缀.就像我之前提到的,唯一的例外是 id 列,但这只是为了连接的可读性。不过,我个人从来没有觉得阅读 student.id 或professor.id 很困难。
    • +1。我遵循在查询中限定 all 列引用的规则。 (我个人的偏好是使用短表别名,而不是完整的表名。)当它是表中的唯一键时,我也更喜欢使用列名id。列名student_id 将用作另一个表中的外键列的名称,它引用student 表中的id 列。
    【解决方案2】:

    对于非临时查询,您应该始终为每个字段添加表名或表别名的前缀,即使字段名没有歧义。如果有人向其中一个引入歧义的表添加新列,这可以防止查询在以后中断。

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

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

    【讨论】:

    • 是的,始终限定查询中的所有列引用。它可以防止将来有人在表中添加列时查询中断(引入不明确的列引用错误)。并且,它使以后的读者更容易破译 SQL……不合格的引用 foobar 列……是对 fee 表、fi 表或 @ 中的列的引用987654332@表? (你不敢让我去寻找表定义来找出所指的表。)但我个人的偏好是将列命名为id,它是主要(或唯一)键。
    【解决方案3】:

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

    您可以将alias 分配给查询中的表,该表比表名短。这使查询更具可读性。示例:

    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 更可取。

    【讨论】:

    • 就个人而言,我希望外键列按照 referenced_table_id 的模式命名。 例如,student_id,而不是 s_id。除此之外,这是我遵循的模式。
    • 好呼吁提及别名'。我们的 DBA 使用疯狂的长名称并在每列变得乏味之前输入 StudentClassListDetails。语法取决于数据库类型,但我认为大多数都像'StudentClassListDetails as scld'一样简单
    • @spencer7593 很好,明确的名称对于避免在包含大量相关表的大型数据库中产生混淆非常重要。
    • ... 并且在每个实体表中始终将 id 列作为主键或唯一键对开发人员来说是一个好处...它允许“按约定”编码,而不是制作该列名称是必须具有特殊代码的“异常”。当该模式不存在时,我正在查看显示 ON fee.student_id = fo.student_id... 的 SQL 是主键连接的外键吗?该主键在哪个表中?或者那是外键快捷方式加入的外键?或者,SQL 是错误的吗?我发现有id 列作为PK 使SQL 更容易破译,并使错误的SQL“看起来”错误。
    【解决方案4】:

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

    【讨论】:

    • 在现代代码优先应用程序中,Id(作为 GUID)是数据库中每个表的首选主键。有通用的好处,可读性的好处,并且没有现实世界的缺点。事件这个平台的表兄弟使用它:data.stackexchange.com/stackoverflow/query/new
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 2010-11-22
    相关资源
    最近更新 更多