我正在创建一个博客,并将用户权限(发布/编辑/删除博客文章)存储在一个 mysql 表中。
我应该为每个权限创建一列,还是将所有打击乐器组合成一列中的一个字符串,例如 101 意味着用户可以发布和删除但不能编辑。
我问的原因是我担心表格中的列太多。
最佳答案
首先,我会排除将所有权限组合到一个字段中的可能性。乍一看似乎很经济,但如果您需要扩展或修改您的权限结构,它可能会变成一个小问题。
为用户表中的每个权限创建一列对于简单系统来说是一个很好的设计,但可能会限制您 future 的可扩展性。
我建议在用户和权限之间实现多对多关系。这允许您在不更改架构的情况下添加任意类型的权限。通过简单的连接查询非常容易,并且可以移植到其他数据库。
您可以通过创建两个新表来完成此操作。假设以下架构:
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);
对于较小的博客,您可能不需要像这样灵活的架构,但它是一个经过验证的设计。如果愿意,您还可以更进一步,创建一个角色系统。这通过给每个用户一个角色(一对多)来工作,每个角色都有一些权限(多对多)。这样就不需要为每个用户设置权限,您可以简单地为他们分配一个角色,如“管理员”、“编辑”或“贡献者”,以及该角色的相关权限。
关于php - MYSQL - 每条数据一列或合并为一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1146184/