mysql - 表格行或列

标签 mysql sql

我有一个项目需要设置自定义权限,分为三类“管理员、经理、用户” 我的常规方法是将权限作为标题分布在一个表中,然后为每个类别添加一个 raw 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

我的问题,为了我的理智..哪个更有效率?他的观点是,如果我们需要添加新权限,我们将不需要更改表来添加新列。 希望这个问题是有道理的。

最佳答案

对我来说,这是一个非常简单的数据建模问题。您的数据模型中有两个“实体”:

  • 用户
  • 特权

这表明每个人都应该有自己的 table 。

因为这是一个多对多的关系(多个用户可以有给定的权限,一个用户可以有很多权限),所以通常使用第三个表来表达这种关系;这通常称为“连接表”或“关联表”。

您的教授给出了一个以行而不是列来表示值的很好的理由:添加新权限的能力。

我可以再补充几个:

  • userPrivileges 表可以有一个 createdOn 列,以便您知道权限何时生效。
  • userPrivileges 可以有一个 createdBy 列,因此您知道谁授予了权限。
  • userPrivileges 表可以有一个suspended 列,因此您可以暂时暂停权限。

关于mysql - 表格行或列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50554287/

相关文章:

sql - 帮助删除关系表

mysql - 如何在 MySQL 中找到更好的电影评分的平均值

mysql - PostgreSQL:如何使用 GROUPING SETS、CUBE 和 ROLLUP 进行汇总

MySQL接受任何密码

php - 比较数组键并创建 MySQL 语句的方法

java - 如何在 Hibernate 中配置 StatementInspector?

mysql - 如何计算从开始到现在过去了多少天

php - 如何在从数据库中检索数据时隐藏重复数据

php - 数据库结构,Eav模型,搜索查询太慢

mysql - 我如何在此 SQL 语句中使用 "as"?