mysql - 表格行或列
问题描述
我有一个项目需要我设置自定义权限,分为三个类别“管理员、经理、用户”我的常规方法是将权限分配在一个表中作为标题,然后为每个类别添加一个原始的 0 或 1 以激活或停用组的权限,如下所示:
id|name|can_do_this|can_do_that
1|admin|1|1
2|manager|1|0
3|user|0|0
但是我的教授要求每个用户单独添加每个权限,而不是每个组,如下所示:
id|user_id|privilege|active
1,1,can_do_this,1
2,1,can_do_that,1
3,2,can_do_this,1
4,2,can_do_that,0
我的问题,为了我的理智..哪个更有效?他的观点是,如果我们需要添加新权限,我们将不需要 ALTER 表来添加新列。希望这个问题有意义。
解决方案
对我来说,这是一个非常简单的数据建模问题。您的数据模型中有两个“实体”:
- 用户
- 特权
这表明每个人都应该有自己的桌子。
因为这是一个多对多的关系(很多用户可以有一个给定的权限,一个用户可以有很多权限),第三张表通常用于表达这种关系;这通常称为“联结表”或“关联表”。
您的教授给出了以行而不是列来表示值的一个很好的理由:添加新权限的能力。
我可以再补充几个:
- 该
userPrivileges
表可以有一个createdOn
列,以便您知道权限何时生效。 userPrivileges
可以有一个列,因此createdBy
您知道谁授予了特权。- 该
userPrivileges
表可以有一个suspended
列,因此您可以暂时挂起特权。
推荐阅读
- javascript - 前端/后端之间的导入
- node.js - 安装了最新的 node-sass 但项目不断尝试安装 node-sass 4.9.0
- godot - 我在 Youtube 上的一个视频的帮助下制作了一个 Godot 平台游戏我做了和他一样的一切,但我的角色拒绝向左移动
- python-3.x - 如何在 python 中计算 2、2D kde 图之间的公共体积/交集?
- javascript - 用户登录后如何打开侧边栏选项卡
- macos - cmake:如何在 macOS 上的应用程序包中找到二进制文件?
- django - Pinax npm 安装失败
- c# - C#:无法从 JSON 字符串中获取子值
- python - Odoo划分两个浮点字段 - AttributeError
- java - 在 Windows 上使用 JPackage 是否可以让 main .exe 不作为控制台运行,但让其他 laucher 作为控制台运行?