规范化中“JOIN”表的索引

时间:2012-07-19 04:48:05

标签: mysql

我有用户角色。

用户可以拥有多个角色。我有一张名为users_roles的表。

我有三列 - iduserrole

id是一个自动增量列。

所以,

  1. 放弃id列是不是一个好主意,因为我从未在代码中使用它?

  2. 如果是,那么该列应该是哪个列的索引?或者根本没有索引?

3 个答案:

答案 0 :(得分:0)

我同意如果用户是userid,那么你不需要id列,userid可以是你的索引PK。

如果user是用户的名称,那么您将要保留id,或者创建user_id,以便您可以拥有一个有效的索引键。

答案 1 :(得分:0)

如果您要删除“id”字段,那么如何在user和user_roles表之间建立关系。

定义主键总是更好。定义主键时会创建默认索引。它以某种方式提高了性能。

同样,当您定义外键时,也会生成外键索引。因此,您的表查询执行将变得更快。

这是您的第一个答案: 根据您的要求,目前您可以从user_roles表中删除“id”主键,因为它只是用作用户和角色之间的关系表。 但是在大多数PHP框架中,即使在关系表中删除主键也不是一个好习惯。

这是您的第二个答案:如果您要删除主键,则必须将“user”和“role”字段上的索引维护为foreignKey索引。如果您不打算从user_roles表中删除主键。然后将为“id”,“user”和“role”字段生成3个索引。第一个索引是主索引,其余两个是foreignKey索引。

在表上明确定义更多索引也会导致查询执行带来一些额外开销。

答案 2 :(得分:0)

users_roles是许多链接表。

在许多表格中至少有两种常用的主键方法:

  • users_roles有自己的代理主键,如此处的情况(users_roles.id
  • 或者,您创建一个由(用户,角色)组成的复合键,因为用户不应该多次使用同一个角色。

关于简单vs复合键的讨论很多,例如Why single primary key is better than composite keys?

请注意,索引和主键是不同的概念。主键是唯一性,索引是性能。 (您可以在表上有多个索引,但只能有一个PK)

如果您似乎在说,没有其他表引用user_roles,那么您实际上并不需要主键。

如果您的users_roles表变大,您可能希望在users列上添加索引,也可能在role表中添加索引,例如如果您经常搜索特定角色的用户。