我只是第一次开始使用外键,我想知道是否有用于它们的标准命名方案?
给定这些表:
task (id, userid, title)
note (id, taskid, userid, note);
user (id, name)
在“任务具有注释”的情况下,“任务”由用户拥有,而“用户”编写注释。
在这种情况下如何命名三个外键?或者,这甚至有关系吗?
更新:此问题是关于外键名称,而不是字段名称!
我只是第一次开始使用外键,我想知道是否有用于它们的标准命名方案?
给定这些表:
task (id, userid, title)
note (id, taskid, userid, note);
user (id, name)
在“任务具有注释”的情况下,“任务”由用户拥有,而“用户”编写注释。
在这种情况下如何命名三个外键?或者,这甚至有关系吗?
更新:此问题是关于外键名称,而不是字段名称!
Answers:
SQL Server中的标准约定为:
FK_ForeignKeyTable_PrimaryKeyTable
因此,例如,注释和任务之间的关键是:
FK_note_task
任务和用户之间的关键是:
FK_task_user
这使您可以“一目了然”查看键中包含哪些表,因此可以轻松查看特定表(第一个命名)依赖于哪些表(第二个命名)。在这种情况下,完整的密钥集将是:
FK_task_user
FK_note_task
FK_note_user
因此,您可以看到任务取决于用户,而注释取决于任务和用户。
message
表有一个from_user_id
,to_user_id
这两个都将成为fk_message_user
。在我看来,fk_tablename_columnname
出于这个原因,最好使用(在我的示例中为fk_message_from_user_id),然后尝试使您的列名在目标表中保持清晰(即to_user_id显然是在引用用户表)
我使用两个下划线字符作为分隔符,即
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
样
ķ EEP 我牛逼小号 imple 小号 tupid只要有可能。
FK_Animals_OwnerID
动物和所有者”表,在OwnerID列上定义
我通常只留下我的PK命名为id,然后在其他表中命名FK时串联我的表名和键列名。我从不费心地使用骆驼框,因为有些数据库放弃了区分大小写的方式,只是无论如何都返回所有大写或小写名称。无论如何,这是我的表格版本:
task (id, userid, title);
note (id, taskid, userid, note);
user (id, name);
请注意,我还将表命名为单数形式,因为一行代表了我要保留的对象之一。这些约定中有许多是个人喜好。我建议选择一个约定并始终使用它比采用别人的约定更重要。
这可能是多余的,但对我有用。特别是在处理VLDB时,这对我有很大帮助。我使用以下内容:
CONSTRAINT [FK_ChildTableName_ChildColName_ParentTableName_PrimaryKeyColName]
当然,如果由于某种原因未引用主键,则必须引用唯一约束中包含的列,在这种情况下:
CONSTRAINT [FK_ChildTableName_ChildColumnName_ParentTableName_ColumnInUniqueConstaintName]
能长吗,是的。它是否有助于使信息保持清晰以进行报告,还是让我快速了解了潜在问题是在产品警报期间100%希望了解人们对该命名约定的想法。
我通常的做法是
FK_ColumnNameOfForeignKey_TableNameOfReference_ColumnNameOfReference
或者换句话说
FK_ChildColumnName_ParentTableName_ParentColumnName
这样我可以命名引用同一个表像两个外键history_info table
与column actionBy and actionTo
从users_info
表
就像
FK_actionBy_usersInfo_name - For actionBy
FK_actionTo_usersInfo_name - For actionTo
注意:
我没有包括子表名称,因为对我来说这似乎是常识,因为我在子表中,因此我可以轻松地假定子表的名称。它的总字符为26,非常适合由查尔斯·伯恩斯在此处评论中所述的甲骨文的30个字符限制
读者注意事项:由于其30个字符的名称限制,下面列出的许多最佳实践在Oracle中不起作用。表名或列名可能已经接近30个字符,因此将两者结合成一个单一名称的约定要求使用截断标准或其他技巧。–查尔斯·伯恩斯
如果您不是经常使用FK并使用MySQL(和InnoDB),则可以让MySQL为您命名FK。
稍后,您可以通过运行查询找到所需的FK名称。
尝试使用大写的版本4 UUID,将第一个八位位组替换为FK和'_'(下划线),而不是'-'(破折号)。
例如
FK_4VPO_K4S2_A6M1_RQLEYLT1VQYV
FK_1786_45A6_A17C_F158C0FB343E
FK_45A5_4CFA_84B0_E18906927B53
基本原理如下