是否首选使用“Id”作为主键的列名或“[TableName] Id”作为命名约定?
表:帐户
主键:Id
- 与 -
表:帐户
主键:AccountId
在我看到的实现中似乎分裂了大约50%/ 50%。每种方法有哪些优缺点?
随访:
在我的数据库中使用一个约定,在代码中使用另一个约定是否有意义?或者我应该保持一致吗?在大多数ORM中,这怎么会最好?
答案 0 :(得分:14)
TableNameID
答案 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`)
);