为什么我应该创建一个 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 字节值。
我正在学习 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 字节值。