外键命名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 table
, column 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名称 。