MySQL:我应该在这个表中创建什么样的索引?

时间:2012-04-19 14:11:09

标签: mysql indexing

假设这是表的SQL代码:

CREATE  TABLE `user_is_in` (
  `id_user` INT NULL ,
  `id_city` INT NULL ,
  `when` DATETIME NULL ,
  INDEX `fk_user` (`id_user` ASC) ,
  INDEX `fk_city` (`id_city` ASC) ,
  CONSTRAINT `fk_user`
    FOREIGN KEY (`id_user` )
    REFERENCES `user` (`id` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `fk_city`
    FOREIGN KEY (`id_city` )
    REFERENCES `city` (`id` )
    ON DELETE SET NULL
    ON UPDATE CASCADE)
ENGINE = InnoDB;

该表的使用是存储Foursquare签到的种类(用户一次在一个地方注册)。

现在我有两个选择:

  • 使用3个字段创建唯一索引,但没有主键:

    UNIQUE INDEX id_user_is_in_UNIQUEid_user ASC,id_city ASC,when ASC)

  • 创建一个额外的经典ID自动增量字段

我不喜欢第二个选项,因为我想在用户和城市上创建查询(即:搜索在一个城市在一个城市签到的所有用户)

提前致谢。

1 个答案:

答案 0 :(得分:0)

你应该两个都做。添加自动递增主键并为所有三列添加唯一性约束。通过单独的系统分配键,您可以更轻松地定义此新表的外键,如果最终需要的话。对所有三列具有唯一性约束将确保不会创建重复数据。

一些快速的旁注:

  • 由于这是一个关联表,你的列确实应该是 NOT NULL
  • 您可能希望CASCADE删除城市中的 协会表。