2012-07-19 62 views
0

我有用户角色。标准化中“JOIN”表的索引

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

我有三栏 - id,user,role

id是一个自动增量列。

所以,

  1. 是否掉落id列,因为我从来没有在代码中使用的是一个好主意吗?

  2. 如果是,那么这个表的索引应该是什么列?还是应该没有索引?

+1

其确定为现在如果你不使用它,但未来的角度来看,我建议你保持这些ID,因为它为您提供了灵活性,伸展你的代码 – swapnesh 2012-07-19 04:52:12

回答

0

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

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

+1

我完全错过了这条线...... 保持id字段,我假设它是一个自动编号的整数,在这种情况下,大小最大为4个字节,如果您担心ID不够用,您需要先获得20亿用户,然后才能开始担心用完ID“ – 2012-07-19 05:04:57

0

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

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

另外,当你定义一个外键时,外键索引也会被生成。因此你的表查询执行会变得更快。

这是你的第一个答案: 根据您的要求,为当前暂时还删除user_roles表中的“ID”主键,因为它是一样的用户和角色之间的关系表使用。 但是在大多数PHP框架中,即使在关系表中放弃主键也不是一个好习惯。

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

在表上明确定义更多索引还会在查询执行时产生一些额外开销。

+0

”在用户和user_roles表之间建立关系“。我确实提到有一个名为'user'的专栏。 – kapeels 2012-07-19 17:16:07

+0

现在请看看。 – 2012-07-20 04:10:30

0

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

有至少2种常用方法的主键很多:很多表:

  • users_roles都有自己的代理主键,在此情况下(users_roles.id
  • OR,创建组合键由(用户,角色)组成,因为用户不应该多次在同一个角色中。

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

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

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

如果您的users_roles表变大,您可能需要在用户列以及角色表中添加索引,例如,如果您经常搜索特定角色的用户。