外键命名scheme

我刚开始第一次使用外键,我想知道是否有一个标准的命名scheme使用它们?

鉴于这些表格:

task (id, userid, title) note (id, taskid, userid, note); user (id, name) 

任务具有Notes的位置,任务由用户拥有,而用户创buildNotes。

如何在这种情况下命名三个外键? 或者, 它甚至不重要

更新 :这个问题是关于外键名称,而不是字段名称!

SQL Server中的标准约定是:

 FK_ForeignKeyTable_PrimaryKeyTable 

所以,例如,笔记和任务之间的关键是:

 FK_note_task 

任务和用户之间的关键是:

 FK_task_user 

这使您可以一目了然地查看关键字中包含哪些表,因此可以轻松查看哪个表(特定的第一个表)依赖于哪个表(第二个表名)。 在这种情况下,完整的密钥集是:

 FK_task_user FK_note_task FK_note_user 

所以你可以看到任务取决于用户,logging取决于任务和用户。

我使用两个下划线字符作为分隔符即

 fk__ForeignKeyTable__PrimaryKeyTable 

这是因为表名会偶尔包含下划线字符本身。 这遵循约束的命名约定,通常是因为数据元素的名称经常包含下划线字符,例如

 CREATE TABLE NaturalPersons ( ... person_death_date DATETIME, person_death_reason VARCHAR(30) CONSTRAINT person_death_reason__not_zero_length CHECK (DATALENGTH(person_death_reason) > 0), CONSTRAINT person_death_date__person_death_reason__interaction CHECK ((person_death_date IS NULL AND person_death_reason IS NULL) OR (person_death_date IS NOT NULL AND person_death_reason IS NOT NULL)) ... 

FK_TABLENAME_COLUMNNAME呢?

只要有可能, 都会尽力。

我通常只是离开我的PK命名ID,然后连接我的表名和键列名称在其他表中的FKs。 我从来不打扰骆驼套,因为有些数据库丢弃了大小写敏感的东西,只是简单地返回所有的大写或小写的名字。 无论如何,下面是我的表格版本:

 task (id, userid, title); note (id, taskid, userid, note); user (id, name); 

请注意,我也用单数命名我的表,因为一行表示我坚持的一个对象。 许多这些惯例是个人喜好。 我build议select一个惯例并且总是使用惯例比采用别人惯例更重要。

微软有关SQL Server的说明:

FOREIGN KEY约束不必仅链接到另一个表中的PRIMARY KEY约束; 它也可以被定义为引用另一个表中的UNIQUE约束的列。

所以,我将使用描述依赖关系的术语而不是传统的主/外关系术语。

依赖(子)表中的名称相似的列引用独立(父)表的PRIMARY KEY时,我省略了列名:

 FK_ChildTable_ParentTable 

引用其他列时,或者列名在两个表之间有所不同时,或者只是为了明确:

 FK_ChildTable_childColumn_ParentTable_parentColumn 

我通常的做法是

 FK_ColumnNameOfForeignKey_TableNameOfReference_ColumnNameOfReference 

或者换句话说

 FK_ChildColumnName_ParentTableName_ParentColumnName 

这样我就可以命名两个引用同一个表的外键,例如history_info tablecolumn actionBy and actionTo来自users_info表的column actionBy and actionTo

它会像

 FK_actionBy_usersInfo_name - For actionBy FK_actionTo_usersInfo_name - For actionTo 

注意:

我没有包含子表名,因为对我来说这似乎是常识,我在子表中,所以我可以轻易地假设子表的名字。 它的总体特征是26,与 Charles Burns在这里评论的oracle的30个字符的限制非常吻合

读者须知:由于30个字符的名称限制,下面列出的许多最佳实践在Oracle中不起作用。 表名或列名可能已经接近30个字符,因此将两者结合成一个名称的约定需要截断标准或其他技巧。 – Charles Burns

这可能是过度杀戮,但它适用于我。 特别是当我处理VLDB时,它可以帮助我很多。 我使用以下内容:

 CONSTRAINT [FK_ChildTableName_ChildColName_ParentTableName_PrimaryKeyColName] 

当然,如果由于某种原因你没有引用主键,你必须引用一个包含在唯一约束中的列,在这种情况下:

 CONSTRAINT [FK_ChildTableName_ChildColumnName_ParentTableName_ColumnInUniqueConstaintName] 

可以很久,是的。 它有助于保持信息清晰的报告,或让我快速跳跃,潜在问题是在产品警示期间100%的人会喜欢了解人们对这个命名约定的想法。

基于这里的回答和评论,包括FK表,FK字段和PK表(FK_FKTbl_FKCol_PKTbl)的命名约定应该避免FK约束名称冲突。

所以,对于这里给出的表格:

 fk_task_userid_user fk_note_userid_user 

所以,如果你添加一列来跟踪谁最后修改了任务或笔记…

 fk_task_modifiedby_user fk_note_modifiedby_user 

如果你没有经常引用你的FK,并使用MySQL(和InnoDB),那么你可以让MySQL为你命名FK。

稍后,您可以通过运行查询find所需的FK名称 。