- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试了解使用权限的最佳方式,据我所知,有两个主要选项。
第一个选项是使用按位运算,为此我将使用以下数据库结构:
用户
user_id | user_permission
---------------------
1 | 15
2 | 1
权限
permission_id | permission_name
-----------------------
1 | Read
2 | Write
4 | Execute
8 | Delete
然后检查用户是否有权限我会使用操作:
$user_permission & $permission_id
我看到的主要好处是:
我看到的主要缺点是:
BIGINT
,则为 64)第二种选择是使用多对多子表,为此我会使用以下数据库结构:
用户
user_id
-------
1
2
权限
permission_id | permission_name
-----------------------
1 | Read
2 | Write
3 | Execute
4 | Delete
用户权限
user_id | permission_id
-----------------------
1 | 1
1 | 2
1 | 3
1 | 4
2 | 1
然后为了检查用户是否具有权限,我将使用操作(其中 $user_permission
是一个 permission_id
数组):
in_array($permission_id, $user_permission);
我看到的主要好处是:
我看到的主要缺点是:
问题
以下哪一个是更好的选择?我看到了每种方法的优点和缺点,不确定哪种更合适。尽管我知道上下文可能起作用;那么在哪些情况下按位操作会更好,在哪些情况下多对多子表会更好?还是有我不知道的第三种选择?
我目前更倾向于使用多对多表以获得外键约束的好处和更多的权限可能性,但我想知道我是否遗漏了其他东西;按位操作权限似乎非常普遍,所以我认为使用它们是有充分理由的。
最佳答案
我认为按位运算符是实现用户权限的最佳方式。在这里,我将展示如何使用 Mysql 实现它。
下面是一个包含一些示例数据的示例表:
表 1:存储权限名称的权限表有点像 1,2,4,8..etc(2 的倍数)
CREATE TABLE IF NOT EXISTS `permission` (
`bit` int(11) NOT NULL,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`bit`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
将一些示例数据插入表中。
INSERT INTO `permission` (`bit`, `name`) VALUES
(1, 'User-Add'),
(2, 'User-Edit'),
(4, 'User-Delete'),
(8, 'User-View'),
(16, 'Blog-Add'),
(32, 'Blog-Edit'),
(64, 'Blog-Delete'),
(128, 'Blog-View');
表2:用户表,用于存储用户id、名称和角色。角色将被计算为权限的总和。
示例:
如果用户 'Ketan' 具有 'User-Add' (bit=1) 和 'Blog-Delete' (bit-64) 权限,则角色将为 65 (1+64)。
如果用户“Mehata”具有“Blog-View”(bit=128)和“User-Delete”(bit-4)权限,那么角色将为 132 (128+4)。
CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`role` int(11) NOT NULL,
`created_date` datetime NOT NULL
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
示例数据-
INSERT INTO `user` (`id`, `name`, `role`, `created_date`)
VALUES (NULL, 'Ketan', '65', '2013-01-09 00:00:00'),
(NULL, 'Mehata', '132', '2013-01-09 00:00:00');
用户的加载权限登录后,如果我们想加载用户权限,我们可以在下面查询以获取权限:
SELECT permission.bit,permission.name
FROM user LEFT JOIN permission ON user.role & permission.bit
WHERE user.id = 1
这里 user.role "&"permission.bit 是位运算符,输出为 -
User-Add - 1
Blog-Delete - 64
如果我们想检查某个特定用户是否拥有用户编辑权限-
SELECT * FROM `user`
WHERE role & (select bit from permission where name='user-edit')
输出 = 无行。
您还可以看到:http://goo.gl/ATnj6j
关于php - 权限:按位运算还是多对多子表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15558460/
我有一台 MySQL 服务器和一台 PostgreSQL 服务器。 需要从多个表中复制或重新插入一组数据 MySQL 流式传输/同步到 PostgreSQL 表。 这种复制可以基于时间(Sync)或事
如果两个表的 id 彼此相等,我尝试从一个表中获取数据。这是我使用的代码: SELECT id_to , email_to , name_to , status_to
我有一个 Excel 工作表。顶行对应于列名称,而连续的行每行代表一个条目。 如何将此 Excel 工作表转换为 SQL 表? 我使用的是 SQL Server 2005。 最佳答案 这取决于您使用哪
我想合并两个 Django 模型并创建一个模型。让我们假设我有第一个表表 A,其中包含一些列和数据。 Table A -------------- col1 col2 col3 col
我有两个表:table1,table2,如下所示 table1: id name 1 tamil 2 english 3 maths 4 science table2: p
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 1 年前。 Improve th
下面两个语句有什么区别? newTable = orginalTable 或 newTable.data(originalTable) 我怀疑 .data() 方法具有性能优势,因为它在标准 AX 中
我有一个表,我没有在其中显式定义主键,它并不是真正需要的功能......但是一位同事建议我添加一个列作为唯一主键以随着数据库的增长提高性能...... 谁能解释一下这是如何提高性能的? 没有使用索引(
如何将表“产品”中的产品记录与其不同表“图像”中的图像相关联? 我正在对产品 ID 使用自动增量。 我觉得不可能进行关联,因为产品 ID 是自动递增的,因此在插入期间不可用! 如何插入新产品,获取产品
我有一个 sql 表,其中包含关键字和出现次数,如下所示(尽管出现次数并不重要): ____________ dog | 3 | ____________ rat | 7 | ____
是否可以使用目标表中的LAST_INSERT_ID更新源表? INSERT INTO `target` SELECT `a`, `b` FROM `source` 目标表有一个自动增量键id,我想将其
我正在重建一个搜索查询,因为它在“我看到的”中变得多余,我想知道什么 (albums_artists, artists) ( ) does in join? is it for boosting pe
以下是我使用 mysqldump 备份数据库的开关: /usr/bin/mysqldump -u **** --password=**** --single-transaction --databas
我试图获取 MySQL 表中的所有行并将它们放入 HTML 表中: Exam ID Status Assigned Examiner
如何查询名为 photos 的表中的所有记录,并知道当前用户使用单个查询将哪些结果照片添加为书签? 这是我的表格: -- -- Table structure for table `photos` -
我的网站都在 InnoDB 表上运行,目前为止运行良好。现在我想知道在我的网站上实时发生了什么,所以我将每个页面浏览量(页面、引荐来源网址、IP、主机名等)存储在 InnoDB 表中。每秒大约有 10
我在想我会为 mysql 准备两个表。一个用于存储登录信息,另一个用于存储送货地址。这是传统方式还是所有内容都存储在一张表中? 对于两个表...有没有办法自动将表 A 的列复制到表 B,以便我可以引用
我不是程序员,我从这个表格中阅读了很多关于如何解决我的问题的内容,但我的搜索效果不好 我有两张 table 表 1:成员 id*| name | surname -------------------
我知道如何在 ASP.NET 中显示真实表,例如 public ActionResult Index() { var s = db.StaffInfoDBSet.ToList(); r
我正在尝试运行以下查询: "insert into visits set source = 'http://google.com' and country = 'en' and ref = '1234
我是一名优秀的程序员,十分优秀!