MYSQL - 每个数据一列或组合成一列

时间:2009-07-17 23:49:37

标签: php mysql

我正在创建一个博客,并在mysql表中存储用户权限(发布/编辑/删除博客帖子)。

我应该为每个权限创建一个列,还是将所有打击乐组合成一列中的字符串(例如101)意味着用户可以发布和删除但不能编辑。

我问的原因是我担心桌子上有太多栏目。

5 个答案:

答案 0 :(得分:2)

我的选择是单独的列。如果您正在寻找特定权限,可以在以后查询。

你可能想要查看一些关于权限的标准设计,不需要第四次发明轮子:)

答案 1 :(得分:2)

考虑mysql(非标准)SET type。更有经验的编码员可能会支持bit field(这实际上是mysql的SET类型下面的内容)。

不要使用字符串,因为:

  1. 字符串是一种非常低效的存储位值的方法 - 你每个标志使用一个字节,你只需要一个位
  2. 查询该字段将需要令人发指的字符串操作,并且永远不会有效

答案 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