我有用户角色。
用户可以有多个角色。我有一张桌子叫users_roles
.
我有三列 - id
, user
, role
.
id
是一个自增列。
所以,
id
由于我从不在代码中使用该列,因此删除该列是个好主意吗?如果是,那么该表的索引应该是哪一列?还是根本不应该有索引?
我有用户角色。
用户可以有多个角色。我有一张桌子叫users_roles
.
我有三列 - id
, user
, role
.
id
是一个自增列。
所以,
id
由于我从不在代码中使用该列,因此删除该列是个好主意吗?
如果是,那么该表的索引应该是哪一列?还是根本不应该有索引?
如果您打算删除“id”字段,那么您将如何在 user 和 user_roles 表之间建立关系。
定义主键总是更好。默认索引是在您定义主键时创建的。它以某种方式提高了性能。
此外,当您定义外键时,也会生成外键索引。因此您的表查询执行将变得更快。
这是您的第一个答案: 根据您的要求,目前您可以从 user_roles 表中删除“id”主键,因为它只是用作用户和角色之间的关系表。但是在大多数 PHP 框架中,即使在关系表中删除主键也不是一个好习惯。
这是您的第二个答案:如果您要删除主键,那么您将不得不将“用户”和“角色”字段上的索引维护为外键索引。如果您不打算从 user_roles 表中删除主键。然后将为“id”、“user”和“role”字段生成 3 个索引。第一个索引将是主索引,其余两个是foreignKey 索引。
在表上显式定义更多索引也会导致查询执行的一些额外开销。
users_roles
是一个很多很多的链接表。
在 many:many 表上至少有两种常用的主键方法:
users_roles
有自己的代理主键,如这里的情况 ( users_roles.id
)有很多关于简单键和复合键的讨论,例如为什么单主键比复合键好?
请注意,索引和主键是不同的概念。主键是唯一性,索引是性能。(一个表可以有多个索引,但只有一个PK)
如果,正如您似乎在说的那样,没有其他表引用 user_roles,那么您实际上不需要主键。
如果您的users_roles
表变大,您可能希望在用户列上添加索引,也可能在角色表上添加索引,例如,如果您经常搜索具有特定角色的用户。
我同意,如果用户是用户 ID,那么您不需要 id 列,用户 ID 可以是您的索引 PK。
如果 user 是用户的名称,那么您将要保留 id,或者创建一个 user_id 以便您可以拥有有效的索引键。