唯一约束的命名约定

Posted

技术标签:

【中文标题】唯一约束的命名约定【英文标题】:Naming convention for unique constraint 【发布时间】:2011-06-17 17:00:02 【问题描述】:

命名约定很重要,主键和外键有常用且明显的约定(分别为PK_TableFK_Table_ReferencedTable)。索引的IX_Table_Column 命名也相当标准。

UNIQUE 约束呢?此约束是否有普遍接受的命名约定?我见过UK_TableName_ColumnUQ_TableName_Column,还有人推荐AX_TableName_Column——我不知道这是从哪里来的。

我通常使用UQ,但我不是特别喜欢它,而且我不喜欢为我使用它的选择辩护 UK 的拥护者。

我只是想看看是否就最流行的命名达成共识,或者对为什么一个比其他更有意义的一个很好的推理。

【问题讨论】:

@Mitch 有什么原因吗?我也这样做,但我总是问自己为什么没有人只使用UQ 代表什么? 你可以问关于 IX for IndeX 的同样问题......为什么不只是我? “UQ”只是“UNIQUE”的缩写。两个字母的原因,基本上是“PK”的先例。 就我个人而言,我最终将 UX_* 用于“Unique indeX”,以向“IndeX”的默认 IX 致敬。我特别不喜欢UK_,因为我来自英国。如果互联网喜欢,我可能会被 AK 说服。 @KirkBroadhurst 我从未见过这样的约定,但由于赞成票它必须是常见的并且很好地服务于目的。但是有一个名为 FK_03 的外键不是很有帮助,将其命名为FK_TargetTable_SourceTable 不是更好吗?能否请您详细说明。 【参考方案1】:

我对索引和约束的命名约定:

Index/Constraint Type Naming Convention
Primary key <table-name>_PK
Unique index/constraint <table-name>_AKxx
Non-Unique index <table-name>_IXxx
Check constraint <table-name>_CKxx
Default constraint <table-name>_DFxx
Foreign key constraint <table-name>_FKxx

其中xx 是一个 2 位序列号,对于每个表的每个约束类型,从 01 开始。主键没有序列号,因为只能有一个。 2 个字符的 alpha 后缀含义是:

Suffix Meaning
PK Primary Key
AK Alternate Key
FK Foreign Key
IX IndeX
CK ChecK
DF DeFault

我通常希望按控制对象而不是按对象类型对元数据/系统目录数据进行分组。

【讨论】:

AK:备用键也是 SQL Server 数据工具 2012 的设计表面所称的。 @AlexKeySmith:感谢您解释为什么微软为此使用 AK! 没问题@T.J.Crowder :-) @TJCrowder,在实体关系/数据库建模领域,它是一个 alternate 键,因为与主键一样,包含备用键的列集必须是唯一的,从而为行/元组提供 [alternate] 身份。 @NicholasCarey:不,我明白了——我一看到亚历克斯的评论,灯就亮了。 :-)【参考方案2】:

我的想法是它不是一个关键:它是一个约束。

它当然可以用作键,唯一标识一行,但它不是键。

例如,键是“ThingID”,这是一个替代,用于代替自然键的 ThingName。您仍然需要约束 ThingName:但它不会用作键。

我也会使用 UQ 和 UQC(如果集群)。

您可以改用唯一索引并选择“IXU”。根据所采用的逻辑,索引也是键,但仅在唯一时。否则它是一个索引。因此,我们将从 IK_columnname 开始用于唯一索引,IX_columnname 用于非唯一索引。太棒了。

唯一约束和唯一索引之间的唯一区别是包含列。

编辑:2013 年 2 月。从 SQL Server 2008 开始,索引也可以有过滤器。约束不能

所以,它归结为一个

按照其他使用 SQL 的星球,坚持使用 UQ 将 IK 用于唯一索引(IKC 也用于集群)以保持一致...

【讨论】:

你会更喜欢“IXU”而不是“UIX”吗? 见blogs.msdn.microsoft.com/dtjones/2009/10/29/…【参考方案3】:

我使用昆士兰大学。英国的 K 让我想到了 K,因为它用于 PK 和 FK。好吧,无论如何,在我想到英国之后;具有讽刺意味的是,当英国提出这么多其他协会时,这应该是 UNIQUE 的前缀 =)

【讨论】:

以上是关于唯一约束的命名约定的主要内容,如果未能解决你的问题,请参考以下文章

如何使用hibernate避免遇到违反唯一约束的问题?

nSQLServer与MySQL约束/索引命名的一些差异总结

Fluent NHibernate 主键约束命名约定

kubernetes资源命名约束和最佳实践

kubernetes资源命名约束和最佳实践

mysql唯一约束