Navicat 博客

SQL 中命名约定的快速指南 - 第 1 部分 2023 年 2 月 15 日,由 Robert Gravelle 撰写

表名

命名约定是一组规则(成文的或未成文的),用来提高数据模型的可读性。你可以在命名数据库中的任何内容时应用这些规则,包括表、列、主键和外键、存储过程、函数、视图等。但你不需要将规则应用到所有数据库对象。例如,只将命名约定规则应用到表名和列名。这全由你决定,因为使用命名约定不是强制性的,但仍然有它的好处。本系列文章由三部分组成,将介绍一些普遍常用的命名约定,并讲解一些制定你专属的命名约定的技巧。第 1 部分文章将介绍表名,而第 2 部分将重点介绍列名。最后,第 3 部分将介绍其他数据库对象的命名约定,例如外键、过程、函数和视图。

为什么要使用命名约定

数据库中极少数只有少量表。而事实上,有数百个表并非罕见。所以使用遵循命名约定就能提高模型整体的可读性并能更容易找到数据库(DB)对象,助你轻松完成工作。

另一个很好的理由是数据库会随着时间慢慢不断地发展变化。尽管通常会避免更改其模式并仅在必要时才进行更改,但更改数据库对象的名称可能会在多方面影响你的应用程序代码。由于你可以预期数据库将或多或少地保持与其初始时非常相似的状态,如果你从一开始就选用最佳的做法并在添加新对象时继续使用它,那么随着时间过去数据库结构都能保持良好的组织。

单数与复数表名

关于表命名的最常见问题之一是使用单数形式还是复数形式。在这个问题上有很多不同的意见。事实上,我们可以看到 MySQL classicmodels 和 sakila 示例数据库的模式都用了这两种方式命名,前者使用复数表名,后者使用单数命名:

classicmodels_and_sakila_table_names (62K)

如果有助于工作,大多数 DBA 都会使用单数名称。 一个原因是像“users”、“roles”这样的复数名称可能会导致一些奇怪的表名,例如“users_have_roles”而不是“user_has_role”。

描述现实世界的实体

任何时候命名代表现实世界事物的实体时,都应该使用它们的专有名词。这适用于 employee、customer、city、country 等表。通常,一个词应该就能准确描述该表中的内容。

有时你必须使用多个词来描述表中的内容。在 classicmodels 数据库中可以看到这样的一个例子。有一个表“orders”和另一个表“order_details”:

orders 表
orders_table (250K)
order_details 表
order_details_table (250K)

“order_details”有有关订购产品的数据,例如订购的数量和价格。该表可以命名为“product_details”,但这并不能表达该产品与订单相关联。

命名相关表

对于两个表之间的关系,标准做法是使用两个表的名称。也可以在两个名称之间添加一个动词来描述该操作是什么,例如“user_has_role”,或简称为“user_role”。Sakila 示例数据库就是使用此约定,用结合了两个名称的中间表将相关表连接起来。我们可以在下面的数据库模型中看到两个例子——“film_actor”和“film_category”:

sakila_model (141K)

关于 SQL 中表命名约定的结语

如果命名约定在特定情况下没有逻辑意义,请不要害怕放弃使用它。例如,如果我们有一个 product 和 invoice 表,并且我们想要指定哪些产品在哪些发票上,那么名称“invoice_item”可能比“invoice_product”或“invoice_contains_product”更有意义。

Navicat 文章
频道条目
分享
文章归档