我正在创建博客,并将用户权限(发布/编辑/删除博客帖子)存储在mysql表中。
我是否应该为每个权限创建一个列,或者将所有的输入组合到一个列中,例如101,这意味着用户可以发布和删除,但不能编辑。
我问的原因是我担心我的表中有太多的列。
发布于 2009-07-18 00:50:40
首先,我排除了将所有权限合并到一个字段中的可能性。乍一看似乎很经济,但如果您需要扩展或修改权限结构,它可能会变成一个小问题。
为用户表中的每个权限创建一列对于简单系统来说是一个很好的设计,但可能会限制您将来的可扩展性。
我建议在用户和权限之间实现多对多关系。这允许您在不更改架构的情况下添加任意多类型的权限。使用简单的join进行查询非常容易,并且可以移植到其他数据库。
您可以通过创建两个新表来实现这一点。假设模式如下:
CREATE TABLE `users` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`username` VARCHAR(100),
-- other user fields --
);我们可以像这样添加m2m权限模式:
CREATE TABLE `permissions` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(50) NOT NULL UNIQUE,
);
CREATE TABLE `users_permissions` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY_KEY,
`user_id` INT NOT NULL,
`permission_id` INT NOT NULL
);然后,您可以添加一些示例用户和权限:
INSERT INTO `users` (DEFAULT, 'joe');
INSERT INTO `users` (DEFAULT, 'beth');
INSERT INTO `users` (DEFAULT, 'frank');
INSERT INTO `permissions` (DEFAULT, 'Administrator');
INSERT INTO `permissions` (DEFAULT, 'Write Blog');
INSERT INTO `permissions` (DEFAULT, 'Edit Blog');
INSERT INTO `permissions` (DEFAULT, 'Delete Blog');最后,您可以将用户与权限关联,如下所示:
-- joe gets all permissions
INSERT INTO `permissions` (DEFAULT, 1, 1);
INSERT INTO `permissions` (DEFAULT, 1, 2);
INSERT INTO `permissions` (DEFAULT, 1, 3);
INSERT INTO `permissions` (DEFAULT, 1, 4);
-- beth can write and edit
INSERT INTO `permissions` (DEFAULT, 2, 2);
INSERT INTO `permissions` (DEFAULT, 2, 3);
-- frank can only write
INSERT INTO `permissions` (DEFAULT, 3, 2);对于较小的博客,您可能不需要像这样灵活的模式,但它是一个经过验证的设计。如果您愿意,您还可以进一步创建角色系统。这是通过为每个用户分配一个角色(一对多)来实现的,并且每个角色都有多个权限(多对多)。这样就不需要在每个用户的基础上设置权限,您可以简单地为他们分配一个角色,如“管理员”、“编辑”或“贡献者”,以及该角色的相关权限。
发布于 2009-07-17 23:53:22
我的选择是单独的列。使以后在查找特定权限时可以更轻松地进行查询。
你可能想要检查一些关于权限的标准设计,不需要第四次发明轮子:)
https://stackoverflow.com/questions/1146184
复制相似问题