Id或[TableName] Id作为主键/实体标识符

时间:2009-05-14 15:05:22

标签: sql sql-server database-design orm naming-conventions

是否首选使用“Id”作为主键的列名或“[TableName] Id”作为命名约定?

  

表:帐户
  主键:Id

- 与 -

  

表:帐户
  主键:AccountId

在我看到的实现中似乎分裂了大约50%/ 50%。每种方法有哪些优缺点?

随访:

在我的数据库中使用一个约定,在代码中使用另一个约定是否有意义?或者我应该保持一致吗?在大多数ORM中,这怎么会最好?

7 个答案:

答案 0 :(得分:14)

为清晰起见,

TableNameID

  1. 提高JOIN可读性
  2. 当多个FK“ID”列(PK与FK匹配)
  3. 时,清晰度
  4. ID是保留关键字

答案 1 :(得分:8)

我使用ID。如何使用帐户ID作为外键设置用户表?您是否将该列命名为AccountAccountID或AccountID?

但最重要的部分是在我看来,无论你选择哪种方式都要保持一致。

编辑:我认为在阅读我的评论时,我的论点的逻辑是关闭的,因为显然你不会调用字段AccountAccountID。但乍一看使用[TableName] ID作为主键,[TableName] ID作为外键以及感觉对我来说很奇怪。看起来你对两件应遵循同一套标准的事情使用两种不同的规则。另外我认为Account.ID和User.AccountID在可读性和语义上更正确。

答案 2 :(得分:3)

避免使用ID,状态,描述等常用词作为列名。

使用WarehouseID,WarehouseStatus,WarehouseDescription之类的名称,这些将使您在编写查询,搜索代码,阅读旧代码等时更轻松。

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

我发现显式命名(TableId)更好。首先,所有外键都有这样的自然名称([RelatedTable] Id)。而且我总是最终返回带有两种Id的联接查询,我将被迫对它们进行正确的别名,以便客户端可以区分AccountId和ClientId。使用显式键名也简化了我的数据访问/ orm层逻辑,因为它不必处理歧义,例如。帐户类型密钥始终为“AccountId”,在某些查询中不是“Id”,在其他查询中为“AccountId”。我的2c。

答案 5 :(得分:0)

我同意你的看法。这是一个分裂。虽然Id本身并不是很具描述性。通常我不使用Id,因为在处理sql注入的可能风险时使用AccountId会更加安全。

答案 6 :(得分:0)

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

表中的主键总是被称为“ID”,使用splittet键我用行标识信息调用列“ID”,否则不会调用“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`)
);