我正在阅读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 - >角色"代替"用户 - >角色" ?
提前致谢:)
答案 0 :(得分:1)
对于1:1的关系,只有一张桌子。 (也有例外,但我认为这里没有任何理由。)
如果每个users
中有多个role
但user
只有一个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。