协慌网

登录 贡献 社区

数据库,表和列的命名约定?

每当我设计数据库时,我总是想知道是否有最佳方式在数据库中命名项目。我经常问自己以下问题:

  1. 表名应该是复数吗?
  2. 列名应为单数吗?
  3. 我应该为表格或列添加前缀吗?
  4. 我在命名项目时应该使用大小写吗?

是否有建议的指南来命名数据库中的项目?

答案

我建议检查 Microsoft 的 SQL Server 示例数据库: https : //github.com/Microsoft/sql-server-samples/releases/tag/adventureworks

AdventureWorks 示例使用非常清晰和一致的命名约定,该约定使用模式名称来组织数据库对象。

  1. 表的单数名称
  2. 列的单数名称
  3. 表前缀的架构名称(例如:SchemeName.TableName)
  4. Pascal 机壳(又名上驼壳)

这里的答案很晚,但总之:

  1. 我的偏好是复数
  2. 表格 :* 通常 * 最好没有前缀。 列数
  3. 表格和列:PascalCase。

详细说明:

(1) 你必须要做的。每次您必须以某种方式执行的事情很少,但也有一些。

  • 使用 “[singularOfTableName] ID” 格式命名您的主键 。也就是说,无论您的表名是Customer还是Customer ,主键都应该是CustomerID
  • 此外, 必须在不同的表中一致地命名外键 。殴打不这样做的人应该是合法的。我认为尽管定义的外键约束通常很重要,但是一致的外键命名始终很重要
  • 您的数据库必须具有内部约定 。即使在以后的部分中,您会看到我非常灵活,但数据库中命名必须非常一致。与您在同一数据库中以相同的方式进行操作相比,将客户的表称为 “ 客户”还是 “ 客户”并不重要。您可以掷硬币来确定如何使用下划线,但是随后必须继续使用下划线。如果您不这样做,那么您就是一个自卑的坏人。

(2) 您可能应该做什么。

  • 代表不同表上的同类数据的字段命名为相同的字段。不要在一个表上有邮政编码,而在另一个表上没有 ZipCode。
  • 要在表名或列名中分隔单词,请使用 PascalCasing。使用 camelCasing 并不是本质上的问题,但这不是约定,看起来很有趣。我稍后会强调下划线。 (您可能不像以前那样使用 ALLCAPS。OBNOXIOUSTABLE.ANNOYING_COLUMN 在 20 年前在 DB2 中还可以,但现在不行。)
  • 请勿人为地缩短或缩写单词。名字简短明了比简短而混乱更好。超短名称是对更黑暗,更野蛮的时间的保留。 Cus_AddRef。那到底是什么?托管收件人参考?客户额外退款?自定义地址推荐?

(3) 您应该考虑的问题。

  • 我真的认为您应该为表使用复数名称。有些人认为单数。在其他地方阅读论点。但是,列名应为单数。即使您使用复数表名,代表其他表组合的表也可能是单数。例如,如果您具有 “ 促销”和 “ 项目”表,则表示某个项目是促销的一部分的表可以是 Promotions_Items,但也可以合法地是我认为的 Promotion_Items(反映一对多关系)。
  • 为特定目的而始终使用下划线。使用 PascalCasing,一般表的名称应该足够清楚;您不需要使用下划线来分隔单词。保存下划线(a)表示关联表,或(b)表示前缀,我将在下一个项目符号中解决。
  • 前缀既不是好事也不是坏事。 通常不是最好的。在您的第一个或两个数据库中,我不建议对表的常规主题分组使用前缀。表格最终不容易符合您的类别,这实际上会使查找表格更加困难 。凭经验,您可以计划并应用一个弊大于利的前缀方案。我曾经在 db 中工作过,其中数据表以tbl 开头 ,config 表以ctbl 开头vew 的视图,proc 的spudffn等等。它经过精心,始终如一的应用,因此效果还不错。需要前缀的唯一时间是,由于某种原因您拥有真正独立的解决方案时,它们位于同一数据库中。给它们加上前缀对分组表很有帮助。在特殊情况下也可以使用前缀,例如对于要突出的临时表。
  • 您很少(如果有的话)想给列加上前缀。

好的,因为我们考虑了很多意见:

我认为表名应为复数。表是实体的集合(表)。每行代表一个实体,表代表集合。因此,我将称一个 “人” 实体 “人” 表(或称 “人”,无论您喜欢什么)。

对于那些希望在查询中看到单数的 “实体名称” 的人,这就是我将表别名用于:

SELECT person.Name
FROM People person

有点像 LINQ 的 “从人中选人”。

至于 2、3 和 4,我同意 @Lars。