Mysql a";加入;标准化中的表

Mysql a";加入;标准化中的表,mysql,Mysql,我有用户角色 用户可以有多个角色。我有一个名为users\u roles的表 我有三列-id,user,role id是一个自动递增列 所以 删除id列是不是一个好主意,因为我从来没有在代码中使用过它 如果是,那么该表的索引应该是哪一列?或者根本不应该有索引 我同意如果user是userid,那么您不需要id列,userid可以是您的索引PK 如果user是该用户的名称,那么您需要保留该id,或者创建一个user\u id,这样您就可以拥有一个有效的索引键 如果您想删除“id”字段,那么您将如何

我有用户角色

用户可以有多个角色。我有一个名为
users\u roles
的表

我有三列-
id
user
role

id
是一个自动递增列

所以

  • 删除
    id
    列是不是一个好主意,因为我从来没有在代码中使用过它

  • 如果是,那么该表的索引应该是哪一列?或者根本不应该有索引


  • 我同意如果user是userid,那么您不需要id列,userid可以是您的索引PK


    如果user是该用户的名称,那么您需要保留该id,或者创建一个user\u id,这样您就可以拥有一个有效的索引键

    如果您想删除“id”字段,那么您将如何在用户和用户角色表之间建立关系

    最好定义主键。默认索引是在定义主键时创建的。而且它在某种程度上提高了性能

    此外,定义外键时,也将生成外键索引。因此,表查询的执行速度将更快

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

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


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

    users\u roles
    是一个多链接表

    对于多:多表上的主键,至少有两种常用方法:

    • users\u roles
      有其自己的代理主键,如此处所示(
      users\u roles.id
    • 或者,创建一个由(user,role)组成的复合键,因为用户不应该多次处于同一角色
    关于简单密钥和复合密钥有很多讨论,例如

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

    如您所说,如果没有其他表引用用户角色,那么实际上不需要主键


    如果
    users\u roles
    表变大,可能需要在users列上添加索引,也可能在roles表上添加索引,例如,如果您经常搜索某个特定角色的用户。

    如果您现在不使用它,现在还可以,但从未来的角度来看,我建议您保留这些ID,因为它为您提供了扩展代码的灵活性。我完全错过了这一行。。。保留id字段,我假设它是一个自动编号的整数,在这种情况下,大小最大为4字节,如果您担心id用完,您需要获得20亿用户,然后才能开始担心id用完“如何在用户和用户角色表之间建立关系”。我确实提到了一个名为
    user
    的专栏。