为什么要创建仅包含索引的MySql表?

时间:2015-08-14 08:05:03

标签: mysql database indexing relational-database

我正在阅读Java Spring教程,以了解有关Web应用程序中安全登录的一些基本信息。 在本教程中,作者创建了3个MySql表来管理身份验证:

CREATE TABLE `roles` (
  `id` int(6) NOT NULL AUTO_INCREMENT,
  `role` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

CREATE TABLE `users` (
  `id` int(6) NOT NULL AUTO_INCREMENT,
  `login` varchar(20) NOT NULL,
  `password` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

CREATE TABLE `user_roles` (
  `user_id` int(6) NOT NULL,
  `role_id` int(6) NOT NULL,
  KEY `user` (`user_id`),
  KEY `role` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

表"角色"包含用户角色(例如" Admin"," User" etc ...)。 表"用户"包含用户登录名和密码。

所以,我无法理解为什么表" user_roles"已经被创造了!角色之间的关系"和"用户"是一对一的,所以我可以为这两个表插入索引并删除" user_roles" ...是不是? 为什么我需要加入表格"用户 - > user_roles - >角色"代替"用户 - >角色" ?

提前致谢:)

1 个答案:

答案 0 :(得分:1)

对于1:1的关系,只有一张桌子。 (也有例外,但我认为这里没有任何理由。)

如果每个users中有多个roleuser只有一个role,则role_id添加Users表。这是1:很多。您可能需要INDEX(role_id)

如果user可以包含多个roles且每个role可以有多个users,那么您需要很多:{很多。这将是编写第3个表的最佳方式:

CREATE TABLE `user_roles` (
  `user_id` int(6) NOT NULL,
  `role_id` int(6) NOT NULL,
  PRIMARY KEY (`user_id`, role_id),
  KEY         (`role_id`, user_id)
) ENGINE=InnoDB DEFAULT;

从某种意义上说,这是一个仅有索引的表,因为PRIMARY KEY包含所有字段。

(6)中的INT(6)毫无意义。特别是,它不会为您提供6位整数,它仍然为您提供高达20亿的4字节有符号整数。也许您应该将MEDIUMINT UNSIGNED用于0..16M的值。或SMALLINT UNSIGNED为2字节值0..64K。