2015-12-12 80 views
1

我已经阅读了大量的答案,但还没有找到解释。我想知道如何在特定的表上正确设置索引。MySQL:复合主键,关系表的唯一简单索引

我有其他两个表之间的连接关系表,也包含在它的一些数据:

Allocation table

enter image description here

我想知道如何在此基础上指出正确设置指标:

  • id列是必需的(因为我使用Lara vel框架,需要id主键)。

  • room_id,channel_iddate需要是唯一的,因为3一起表示行。

  • room_idchannel_id是外键。

  • date列必须被索引为其常用搜索列。

我想出了这一点,但我敢肯定它的冗余和错误:

  • 复合主键:idroom_idchannel_id
  • 复合独特索引:room_id,channel_iddate
  • 指数:room_id
  • 指数:channel_id
  • 指数:date

其他问题:是否date需要是复合主键的一部分?

想知道如何正确设置主键,索引和唯一标识。

回答

1

这就是我会做,以满足您的requierments:

  • 主键:id
  • 指数:room_id
  • 指数:channel_id
  • 唯一索引:dateroom_idchannel_id

E xplanation:

  1. id是自动增量,所以它就足够PK了。
  2. room_idchannel_id在PK无用的,如果id是第一名。
  3. 每个指数包含的PK。所以PK应该尽可能小。
  4. 如果唯一索引与date开始,你可以使用它的日期搜索。因此不需要单独的date索引。
+0

有趣的,所以第一个独特的价值表现不同的是,随后的呢?关于保持PK小,我可以把这作为一般的经验法则吗?这意味着如果存在一个id PK存在的类似关系表,最好将外键仅保留为索引? – Jonathan

+0

对于第一个问题,请看看[多列索引(http://dev.mysql.com/doc/refman/5.7/en/multiple-column-indexes.html):“MySQL的可以使用多重用于测试索引中所有列的查询的列索引,或测试**仅第一列**,..“的查询。对第二个问题:不 - 我不会把它作为一般规则。但在你的情况和大多数情况下,如果定义了自动增量coulmn,AI列应该是PK。没有 - 没有必要将FK放入PK中,只是因为它是FK。 –