我正在创建一个博客,并在mysql表中存储用户权限(发布/编辑/删除博客帖子)。
我应该为每个权限创建一个列,还是将所有打击乐组合成一列中的字符串(例如101)意味着用户可以发布和删除但不能编辑。
我问的原因是我担心桌子上有太多栏目。
答案 0 :(得分:2)
我的选择是单独的列。如果您正在寻找特定权限,可以在以后查询。
你可能想要查看一些关于权限的标准设计,不需要第四次发明轮子:)
答案 1 :(得分:2)
考虑mysql(非标准)SET type。更有经验的编码员可能会支持bit field(这实际上是mysql的SET类型下面的内容)。
不要使用字符串,因为:
答案 2 :(得分:2)
首先,我将排除将所有权限合并到一个字段中。一开始看起来很经济,但如果您需要扩展或修改权限结构,它可能会变成一个问题。
为用户表中的每个权限创建一个列是一个简单系统的好设计,但可能限制您未来的可扩展性。
我建议在用户和权限之间实现多对多关系。这允许您在不更改架构的情况下添加所需的任意类型的权限。使用简单连接查询非常容易,并且可以移植到其他数据库。
您可以通过创建两个新表来实现此目的。假设以下架构:
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);
对于较小的博客,您可能不需要这样的灵活架构,但它是经过验证的设计。如果您愿意,还可以更进一步,创建一个角色系统。这通过为每个用户提供一个角色(一对多)来实现,每个角色都有许多权限(多对多)。这样,不需要基于每个用户设置权限,您可以简单地为它们分配“管理员”,“编辑器”或“贡献者”等角色,以及该角色的相关权限。
答案 3 :(得分:1)
您可以在一列中使用按位组合(位字段),如
const READ = 1;
const WRITE = 2;
const DELETE = 4;
...
因此产生的许可将是
read-only: 1
read-write: 3
read & delete, but not write: 5
and so on...
要检查位字段中的权限,您的查询必须类似于
SELECT * FROM table t WHERE t.permission & required_permission
,required_permission是按位或必需的权限标志。
但我也建议查看一些资源,以了解标准设计......
答案 4 :(得分:1)
我说可以放一个帖子,编辑和删除列。
但是,如果你采用Wordpress的权限,他们只需将其序列化为一个数组,然后将该数组存储在设置表中(4列:用户ID,设置键,设置值)。我认为如果你不打算给他们自己的表授权,Wordpress的方法才真正有效。
另一种方法是执行User_ID - 权限关系表。在一列中放置User_ID,在另一列中放置权限。但是,使每一行都具有权限。 IE,如果你想给用户ID 1所有权限,那就是:
权限:添加:1,编辑:2,删除:3
表
第1行:UserID:1权限:1
第2行:UserID:1权限:2
第3行:UserID:1权限:3