首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL -每条数据一列或合并成一列

问MYSQL -每条数据一列或合并成一列
EN

Stack Overflow用户
提问于 2009-07-17 23:49:37
回答 5查看 891关注 0票数 1

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

我是否应该为每个权限创建一个列,或者将所有的输入组合到一个列中,例如101,这意味着用户可以发布和删除,但不能编辑。

我问的原因是我担心我的表中有太多的列。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-07-18 00:50:40

首先,我排除了将所有权限合并到一个字段中的可能性。乍一看似乎很经济,但如果您需要扩展或修改权限结构,它可能会变成一个小问题。

为用户表中的每个权限创建一列对于简单系统来说是一个很好的设计,但可能会限制您将来的可扩展性。

我建议在用户和权限之间实现多对多关系。这允许您在不更改架构的情况下添加任意多类型的权限。使用简单的join进行查询非常容易,并且可以移植到其他数据库。

您可以通过创建两个新表来实现这一点。假设模式如下:

代码语言:javascript
复制
CREATE TABLE `users` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `username` VARCHAR(100),
    -- other user fields --
);

我们可以像这样添加m2m权限模式:

代码语言:javascript
复制
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 
);

然后,您可以添加一些示例用户和权限:

代码语言:javascript
复制
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');

最后,您可以将用户与权限关联,如下所示:

代码语言:javascript
复制
-- 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);

对于较小的博客,您可能不需要像这样灵活的模式,但它是一个经过验证的设计。如果您愿意,您还可以进一步创建角色系统。这是通过为每个用户分配一个角色(一对多)来实现的,并且每个角色都有多个权限(多对多)。这样就不需要在每个用户的基础上设置权限,您可以简单地为他们分配一个角色,如“管理员”、“编辑”或“贡献者”,以及该角色的相关权限。

票数 2
EN

Stack Overflow用户

发布于 2009-07-17 23:53:22

我的选择是单独的列。使以后在查找特定权限时可以更轻松地进行查询。

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

票数 2
EN

Stack Overflow用户

发布于 2009-07-17 23:59:07

考虑mysql的(非标准) SET type。更有经验的程序员可能更喜欢bit field (这实际上是mysql的SET类型下面的类型)。

不要使用字符串,因为:

  1. 字符串是一种非常低效的存储位值的方法--您使用的是每个标志一个字节,其中您只需要一个位
  2. 对该字段进行查询将需要进行令人发指的字符串操作,并且永远不会是有效的
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1146184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档