代码之家  ›  专栏  ›  技术社区  ›  Even Mien

ID或[表名]ID作为主键/实体标识符

  •  4
  • Even Mien  · 技术社区  · 16 年前

    首选使用“id”作为主键的列名还是使用“[tablename]id”作为命名约定?

    表:帐户
    主键:ID

    ——与——

    表:帐户
    主键:accountID

    在我所看到的实现中,它似乎被分割了大约50%/50%。每种方法的优缺点是什么?

    跟进:

    在我的数据库中使用一种约定,在代码中的实体上使用另一种约定是否有意义?还是应该保持一致?在大多数窗体中,这将如何工作得最好?

    7 回复  |  直到 15 年前
        1
  •  14
  •   gbn    16 年前

    为了清晰起见,表名ID

    1. 提高连接可读性
    2. 当多个fk“id”列(pk与fk匹配)时,就表示清晰。
    3. ID是保留关键字
        2
  •  7
  •   Dave L    16 年前

    我使用ID。您如何将帐户ID设置为外键的用户表?你会把那个栏目命名为accountaccountid还是accountid?

    但最重要的是在我看来,无论你选择哪种方式,都要始终如一。

    编辑 :我认为在阅读我的评论时,我的论点逻辑是错误的,因为显然你永远不会调用字段accountaccountid。但乍一看,使用[tablename]id作为主键,使用[tablename]id作为外键 感觉 我觉得很奇怪。似乎你对两件事情使用了两种不同的规则,它们应该遵循相同的一套标准。另外,我认为account.id和user.account id在语义上更为可读和正确。

        3
  •  3
  •   KM.    16 年前

    避免使用诸如id、status、description之类的常用词作为列名。

    使用仓库ID、仓库状态、仓库描述等名称,这些名称将使您在编写查询、搜索代码、读取旧代码等时的生活更加轻松。

        4
  •  2
  •   Fabio Vinicius Binder    16 年前

    第一种方法更可能是OOP命名约定。

    第二种方法的优点是避免了联接查询中的列名不明确。尽管您可以使用别名,但有时这是不可能的,就像在某些ORM框架中一样(EntitySpaces出现在脑海中)。

        5
  •  2
  •   Remus Rusanu    16 年前

    我发现显式命名(tableid)更好。对于start,所有外键都有一个这样的自然名称([relatedtable]id)。而且,我总是返回带有两种类型ID的连接查询,在这两种类型的ID中,我必须正确地对它们进行别名,以便客户机能够区分accountID和clientID。使用显式键名还简化了我的数据访问/ORM层逻辑,因为它不必处理歧义,例如,帐户类型键在某些查询中始终是“account id”,而不是“id”,在其他查询中则是“account id”。我的2C。

        6
  •  0
  •   Kevin Vaughan    16 年前

    我一直使用一个方案,发现它非常有用。

    表中的主键总是称为“id”,使用splittet键,我用行标识信息调用列,否则不调用“id”列。

    所有外键都使用它们所引用的表的名称。

    CREATE TABLE `Person`  
    (
      `ID` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
      `FirstName` VARCHAR(255)  NOT NULL,
      `LastName` VARCHAR(255)  NOT NULL,
      PRIMARY KEY (`ID`)
    );
    
    CREATE TABLE `Tutorial`
    (
      `ID` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
      `Name` VARCHAR(255) NOT NULL,
      PRIMARY KEY (`ID`)
    );
    
    CREATE TABLE `Class`
    (
      `Person` INTEGER UNSIGNED NOT NULL,
      `Tutorial` INTEGER UNSIGNED NOT NULL
      PRIMARY KEY (`Person`, `Tutorial`)
    );
    
        7
  •  0
  •   Eric    16 年前

    我同意你的看法。这是一个分裂。不过,ID本身并不是很有描述性。通常我不使用ID,因为在处理可能的SQL注入风险时,使用accountID非常安全。