使用 PHP 和 MySQL 使数据库驱动的菜单项在每个用户的基础上可见?
Make Database driven Menu items visible on a Per User basis using PHP and MySQL?
我正在使用 PHP 和 MySQL 为管理面板构建菜单。每个菜单项都是一个 MySQL 记录。
我需要能够为每个用户设置每个菜单的可见性 record/item。
我知道大多数人会在 "user group" 的基础上这样做,但是我的老板要求每个菜单项都以个人为基础,以确定谁可以查看哪些菜单项。
我知道如何非常轻松地制作一个基于每个用户组的可见性的数据库驱动菜单,但是我不确定如何在每个用户的基础上进行操作?
如果数据库中有20个菜单项和20个用户。我需要能够设置一个 setting/permission 来指示每个用户是否可以查看或不查看每个单独的菜单项记录。
关于在 MySQL 数据库结构中的外观的任何想法和帮助?
这是我当前的菜单 SQL 架构...
CREATE TABLE IF NOT EXISTS `intranet_links` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL,
`description` text NOT NULL,
`url` varchar(255) DEFAULT NULL,
`permission` varchar(50) NOT NULL DEFAULT 'admin',
`notes` text,
`active` int(2) NOT NULL DEFAULT '1',
`sort_order` int(11) DEFAULT NULL,
`parent_id` int(10) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
菜单系统如下图所示。将有父菜单项和子菜单项,这使得父菜单记录的行为类似于 Folder/directory...
user_to_item table 似乎是显而易见的解决方案,但我仍然会选择基于组的权限。为什么?
假设您有 10 万个用户,并且您正在添加新的菜单项以供所有人看到,使用 user_to_items table 您必须执行 10 万次插入,然后在删除权限时,再次100K 次删除,突然间您的 mysql 开始因碎片化而窒息。
此外,您肯定会有一些公共区域可供所有人查看,而某些部分仅供管理员使用 - 再次强调使用群组。
我的建议是拥有 user_to_group
权限,比如 'Server Admin' 组和 'Other Services',然后是个人 user_to_item
table,您将只检查那么如果用户有权组。
还记得有一些类似 child<->ancestor 的关系,所以你可以快速找到某些 parent 的所有 child ex:
item_id | name
1 |'Server Admin'
2 |'phpMyAdmin'
3 |'phpMyAdmin_subItem'
item_id | ancestor_id
1 | null
2 | 1
3 | 1
3 | 2
这样通过ancestor_id = 1搜索可以快速找到phpMyAdmin和phpMyAdmin_subItem属于Server Admin目录,然后进行权限检查。
我正在使用 PHP 和 MySQL 为管理面板构建菜单。每个菜单项都是一个 MySQL 记录。
我需要能够为每个用户设置每个菜单的可见性 record/item。
我知道大多数人会在 "user group" 的基础上这样做,但是我的老板要求每个菜单项都以个人为基础,以确定谁可以查看哪些菜单项。
我知道如何非常轻松地制作一个基于每个用户组的可见性的数据库驱动菜单,但是我不确定如何在每个用户的基础上进行操作?
如果数据库中有20个菜单项和20个用户。我需要能够设置一个 setting/permission 来指示每个用户是否可以查看或不查看每个单独的菜单项记录。
关于在 MySQL 数据库结构中的外观的任何想法和帮助?
这是我当前的菜单 SQL 架构...
CREATE TABLE IF NOT EXISTS `intranet_links` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL,
`description` text NOT NULL,
`url` varchar(255) DEFAULT NULL,
`permission` varchar(50) NOT NULL DEFAULT 'admin',
`notes` text,
`active` int(2) NOT NULL DEFAULT '1',
`sort_order` int(11) DEFAULT NULL,
`parent_id` int(10) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
菜单系统如下图所示。将有父菜单项和子菜单项,这使得父菜单记录的行为类似于 Folder/directory...
user_to_item table 似乎是显而易见的解决方案,但我仍然会选择基于组的权限。为什么?
假设您有 10 万个用户,并且您正在添加新的菜单项以供所有人看到,使用 user_to_items table 您必须执行 10 万次插入,然后在删除权限时,再次100K 次删除,突然间您的 mysql 开始因碎片化而窒息。 此外,您肯定会有一些公共区域可供所有人查看,而某些部分仅供管理员使用 - 再次强调使用群组。
我的建议是拥有 user_to_group
权限,比如 'Server Admin' 组和 'Other Services',然后是个人 user_to_item
table,您将只检查那么如果用户有权组。
还记得有一些类似 child<->ancestor 的关系,所以你可以快速找到某些 parent 的所有 child ex:
item_id | name
1 |'Server Admin'
2 |'phpMyAdmin'
3 |'phpMyAdmin_subItem'
item_id | ancestor_id
1 | null
2 | 1
3 | 1
3 | 2
这样通过ancestor_id = 1搜索可以快速找到phpMyAdmin和phpMyAdmin_subItem属于Server Admin目录,然后进行权限检查。