为什么我应该创建一个 MySql table 仅包含索引?

Why should I create a MySql table containing index only?

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

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;

table "roles" 包含用户角色(例如 "Admin"、"User" 等...)。 table "users" 包含用户登录名和密码。

所以,我不明白为什么要创建table "user_roles"! "roles" 和 "users" 之间的关系是一对一的,所以我可以为这 2 个 table 插入一个索引并删除 "user_roles"...是吗? 为什么我需要加入 tables "users --> user_roles --> roles" 而不是 "users --> roles"?

提前致谢:)

对于 1:1 关系,只有一个 table。 (也有例外,但我在这里看不出有任何理由。)

如果每个 role 中有多个 users,但只有一个 role 中有一个 user,则将 role_id 添加到 [=16] =] table。这是1:many。您可能需要 INDEX(role_id).

如果一个user可以有很多roles,而每个role可以有很多users,那么你需要many:many。这将是编写第 3 个 table:

的最佳方式
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;

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

INT(6)中的(6)没有意义。特别是,它不会给你 6 位整数,它仍然给你 4 字节有符号整数,最多 20 亿。也许您应该使用 MEDIUMINT UNSIGNED 来表示 0..16M 的值。或者 SMALLINT UNSIGNED 表示 0..64K 的 2 字节值。