如何命名数据库表以提供自然的组织结构?最佳实践是什么?

12
我们在相关的表上放置常见的前缀,以确保它们在我们的数据库管理软件(Toad、Enterprise Manager等)中彼此相邻显示。
例如,所有用户表都以单词"User"开头:
  • User
  • UserEvent
  • UserPurchase
理想情况下,为了尊重程序员的三大美德,这些表应该分别命名为User、Event和Purchase,以节省一些打字时间,同意吗?
这种命名约定是自然地将相关表分组的最佳(唯一?)实践吗?

2
人们会争论为什么要将ID作为每个表的主键...但是请为了我,为了我的孩子,为了所有已故的爱尔兰作家不要这样做。当你的数据库中有200张表时,你将拥有接近200个具有完全相同名称但含义完全不同的列。简直是地狱。 - Mark Brady
@Mark:我完全同意“ID”,但这与Cory的问题有什么关系吗? - Bill Karwin
8个回答

28

在命名规范方面,我有两点不同于常规做法...

  1. 我不喜欢使用前缀来让一些东西在UI中分组。对我来说,表的名称应该是代码易读且有意义的。有很多研究(大多被程序员忽略了)表明,像使用下划线、逻辑名称、消除缩写和消除前缀等这些因素对代码理解和操作速度有非常大的影响。而且,如果你使用前缀来区分表,当一个表被多个领域使用时会怎样——甚至更糟糕的是,它最初只在一个领域中使用,但之后开始在另一个领域中使用。你现在要重新命名表吗?

  2. 我几乎完全忽略名称长度。我更关心的是可读性和理解性,而不是输入列或表名称需要多花1/10秒的时间。当你记住了所有浪费的时间都在尝试记住你是否将“number”缩写为“no”、“num”或“nbr”,并且考虑到使用Intellisense,使用更长、更有意义的名称对我来说是显而易见的。

有了这些想法,如果您的UserEvents表与用户相关的事件,那么这个名称就十分合适。在我看来,仅使用“Events”会得到一个不够明确的表名。

希望这可以帮到您!


5
您有关于您提到的研究的链接吗? - Alix Axel

6
我不会为了按字母顺序排列表名而使用命名约定。虽然这样做很好,但这不应该是设计上的要求。
阅读乔·塞尔科(Joe Celko)的书 "SQL编程风格。" 他在该书的第一章中讲述了命名约定,遵循元数据命名的ISO 11179标准进行指导。他的建议之一是避免在命名约定中使用不必要的前缀。

非常好的观点。尽管Celco有一些非常极端的观点。他对仅使用自然键和mySQL不是数据库的抱怨真的降低了我对他意见的尊重。 - Cory House
1
是的,我同意Celko绝对是一个脾气暴躁和狂热的人。但是我们可以抱着一颗谨慎的心态接受他的观点,同时从他的书中获得有用的东西。 - Bill Karwin

4
如果这个表格是"用户"和"事件"表之间的多对多关系的表示,我会使用这种记号,即"UserEvent"。

3

我认为这取决于您计划如何扩展数据模型。例如,如果您不仅想要拥有用户事件,还想要账户事件或登录事件,并且用户、账户和登录都是不同类型的实体,但它们共享一些事件,则您可能需要一个规范化的数据库模型:

  • 用户(Id int,Name varchar)
  • 账户(Id int,Name varchar)
  • 登录(Id int,Name varchar)
  • 事件(Id int,Name varchar)
  • 用户事件(UserId int,EventId int)
  • 账户事件(AccountId int,EventId int)
  • 登录事件(LoginId int,EventId int)

3
我认为在SQL中的命名约定应该遵循其他编程语言使用的相同准则。我总是更喜欢清晰地标识变量名/类名的目的,这通常意味着更多的输入。我认为要记住的重要事情是代码只写一次,但要读很多次,因此清晰度至关重要。 过去4或5年中,我注意到变量名称已从“eDS”增加到“employeeDataSet”,我认为IntelliSense是主要原因。 我认为我们会看到同样的事情发生在SQL中,因为Red Gate SQL Prompt和现在的MS SQL2008已将Intellisense引入主流数据库世界。

1

个人而言,我会这样重命名我的表:

  • 主要表:tbl_user
  • 参考表:ref_profil
  • 相关表:lnk_user_profil

1

我也会避免使用前缀来从按字母顺序排序的列表中获取含义。这通常是不好的数据管理方式。如果表之间有密切关联,那么管理数据模型的软件应该能够建立表之间的关系,而不管表的命名方式如何。

像UserEvents这样的名称应该用于描述每行内容与用户和事件之间关系的表。如果我在一个新的数据库中看到这样的表,我会期望在这个表中看到一个由两个外键组成的主键,一个指向Users表,另一个指向Events表。

如果我看到了不同的东西,我就必须放慢速度,直到我理解设计者的约定为止。

最后一点引发了一些问题:有多少新人需要快速掌握数据库?这些人将有哪些文档可用?这些新人对包括数据库在内的项目的成功或数据库设计师的成功有多重要?


0

就我个人而言,我更喜欢使用您列出的类似命名条件,因为这是一种非常合乎逻辑的模式,它们以一种易于查找的方式组织在一起,而且通常额外输入的一些字符并不会导致太多问题或时间上的减少。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接