SQL连接表命名约定


70

我有2个表:用户和角色,并且有一个将这些表连接在一起的表。连接表中唯一的东西是链接两个表的ID。

我应该怎么称呼这张桌子?我从来没有真正看到过一个好的命名约定。

我以前见过的约定:

  • UsersToRolesJoin
  • UsersToRolesLink
  • UsersToRoles会员资格
  • UsersRoles

例如:

Users:  
Id  
Name

Roles:  
Id  
Name  

TableThatJoinsTheTwo:  
Id  
UserId  
RoleId  

1
很好的问题-有兴趣看看答案是什么。当然,这些表应该称为用户和角色(不是复数的),但这是一个完整的论点:)
serg10

10
我通常将表名复数只是因为它在视觉上更有意义。我没有用户表,我有用户表。
Scott Anderson

Answers:


38

似乎映射表正在存储每个用户所属的所有角色。如果这是正确的,我会打电话给桌子UserRoles

正确(IMO)可以使表格的意图多元化,而不是UsersRoles听起来很奇怪。


2
该表平等地描述了用户拥有的所有角色以及该角色拥有的所有用户。因此UsersRoles很有道理。
泰德·亨利

28

我称呼用户表User,角色表Role和联接表UserRoles

顺便说一句,在联接Id表中pk并不是真正必需的。更好地使UserIdRoleId一起PK,或只是英国(唯一键),这样就可以保证独特的User-Role关系。


没有主键?为什么?我虽然最佳实践是始终拥有PK?
桑尼男孩

@Sonny:因为您通常对联接表的单行从不感兴趣。它只会不必要地花费一个额外的索引。
BalusC,2009年

18
(User, Role)PK为这张桌子做一个漂亮的组合。无需创建代理。
Quassnoi

3
@BalusC:一个连接表确实需要一个PK,但不需要一个代理 PK。它需要的是PKFKsit链接组成的组合。
Quassnoi

1
@Sonny如果您想要一个主键,则可以简单地制作一个跨越UserId和RoleId的多列主键(假设一个用户不能两次添加到同一角色:)
Scott Anderson

25

我只建议UsersRoles,因为这就是它的含义。


2
除非出于某些原因确实需要,否则也请删除“ Id”列;假设查找更多是从用户端完成的,请在(UserId,RoleId)上创建一个CLUSTERED PK,并在(RoleId,UserId)上创建另一个索引,或者仅在RoleId上创建但包括UserId。
van

10
  • 表名应始终为单数,这样以后您就不必像“是User还是Users?以S结尾的东西怎么样?等等”(如果您刚刚开始项目,我现在将对此进行更改)
  • 共同的约定是:UserRole,和外部参照表:UserRole
  • 最重要的表或之前存在的表首先出现。如果“角色”表在用户权限之外没有任何实际用途,则尤其如此。因此UserRoleRoleUser
  • 我见过类似的东西User_X_Role或者UserXRole为好,如果你喜欢额外的冗长

这就是我的ORM(和许多其他)的工作方式:返回的集合是实体的复数名称。
D'Arcy Rittich,2009年

9

数据库代表企业,对吗?那么,该企业中的人们如何称呼这种关系?

这是我确实知道的一些:

  • employee报告到line manager==组织结构图

  • student需要course==入学

  • woman结婚man==婚姻

如有疑问,请咨询企业内的领域专家。


1
这是一个很好的观点,我认为应该更多地使用它。例如,“ Student_Course_Link”上的“注册”一目了然。
Greg Gum

7

我将链接表称为:

Remove_The_Surrogate_Primary_Key_From_The_Link_Table_Unless_You_Can_Prove_That_You_Really_Need_One

1
+1不错,尽管通常对表名的长度有限制=)
BalusC

是的,是的...就我而言,我实际上不需要它,并且将使用复合主键。
乔什·

@Josh Close:只需命名您的桌子即可UserRole:)
Quassnoi

...但是移除_Link零件。
一天,2012年

3
尽管有趣且准确,但这并不能真正回答最初的问题。我非常喜欢BalusC的答案。是的,我知道这是一个老问题。
Akrikos 2012年

6

我们具有相同的结构,并将链接表称为UserRoles。


同样在这里。我更喜欢表的复数名称(因为users表通常会容纳一组用户,而不是单个用户)。但是,当您随后将用户链接到他们所处的角色时,UserRoles才有意义。
亚伦·贝特朗

另一个很好的论据可能是很多对很多人都需要名称中的链接,以便我们引用UserRoleLinks。可能会工作,但是取决于您X
Adriaan Stander

4

这是我工作场所的惯例:

UsersXRoles

1
我喜欢这个,并打算使用它。除了角色以外,我们还有两个名为user和的表user_group,并且对链接表进行调用user_user_group会引起混淆。user_x_user_group看起来不错!
Phuah Yee Keat

2

我一直都喜欢:rel_user_roles或者relUserRoles。哪个表最先进入通常取决于它在数据模型中的位置。


2

我一直在仔细考虑这个问题,我希望将表格User和表格Role与表格链接起来UsersRoles。我认为这很好,因为它表示可以将多对多关系视为将多个角色链接到一个用户,或者实际上将许多用户链接到一个角色(因此,多个都有意义)。也可以将其理解为“用户的角色”,表示通常认为这种关系的方式是“用户具有的角色”。


我之所以喜欢这样,是因为当表名是单数时,它清楚地表明了many:man关系。
反向工程师

1

RoleUser-我使用字母顺序(即Role之前User)。这样,当您编写查询时,您不必尝试记住您用来命名联接表的顺序。

我也使用单数形式,就像别人提到的那样-您不必记住!为我工作。


1

2种方法:

  1. 在这些表之间,您将永远只有一种关系:联接表可以是RoleUser或Role_User。按照名字顺序依次输入字母,角色1st(角色1),用户(User),然后您就不必记住了!

  2. 这些表之间将具有多个关系:关系名-例如,您可能具有用户的常规角色列表,并且可能具有用户的潜在或过去角色列表。2个表相同,但关系不同。然后,您可能具有RoleUser_Current和RoleUser_Past。


0

我们一直使用两个表的名称,后接单词“ Links”。因此,在您的示例中,我们的表名将为“ UsersRolesLinks”。



0

我有一个约定,我觉得很容易看到:

User
Role
User2Role

0

我试图使事情简单,但也要描述性:

user_role_join


0

通过使用连接表的名称来命名连接表是很好的。例如,两个表“ products”和“ product_tags”,联接表称为“ product_product_tags”。最大的好处是,通过该名称,您可以立即说出将哪些表连接在一起。当您的数据库中有50个以上的表时,最好具有这样的表,而您不再需要考虑联接表的目的。


-2

实际上,使用表别名并通过AS选择器分开选择具有相同名称的列。

例如 SELECT user.id AS user_id

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.