0

我有用户角色。

用户可以有多个角色。我有一张桌子叫users_roles.

我有三列 - id, user, role.

id是一个自增列。

所以,

  1. id由于我从不在代码中使用该列,因此删除该列是个好主意吗?

  2. 如果是,那么该表的索引应该是哪一列?还是根本不应该有索引?

4

3 回答 3

0

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

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

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

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

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

在表上显式定义更多索引也会导致查询执行的一些额外开销。

于 2012-07-19T05:11:57.333 回答
0

users_roles是一个很多很多的链接表。

在 many:many 表上至少有两种常用的主键方法:

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

有很多关于简单键和复合键的讨论,例如为什么单主键比复合键好?

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

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

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

于 2012-07-19T05:12:24.993 回答
0

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

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

于 2012-07-19T04:55:24.493 回答