应用场景:后台管理系统,给创建的用户分配可见的菜单权限。比如说给用户A分配了10个菜单,那么用户登录之后在菜单栏就能看到这10个菜单。现在菜单最多3级。根据目前的业务来看单个用户分配的菜单最多不超过30个。
现在数据库使用MongoDB,对于菜单权限有2种存储方案:
- 菜单列表,即每个用户权限表里会存一个菜单列表,这样单次查询一条记录里能看到该用户下的所有菜单。
- 菜单项平铺,每一行记录对应一个用户的一个菜单,这样如果用户可见20个菜单,则表里会有20行记录。
方案1的好处是存储起来比较方便,并且查询时直接一条记录就能返回所有菜单列表;方案2的好处是可以很方便的查询出某一个菜单被赋予了哪些用户可见。
个人比较倾向于方案2,但不太确定是否是通用的设计方式。大家有啥建议吗?谢谢!
在 sql 下, 方案2更好. 在 mongo 下, 方案1更好.
不知道你的这个项目中有没有用户权限组的概念.
如果有权限组的话, 就是一个权限组的 collection 里面, 每个权限下保存了一个菜单项的数组.
如果没有权限组的话, 就可以按照你说的方案1, 在每个用户表里, 或者单独的用户权限表里, 保存一个菜单数组.
当然, 保存菜单项的 id 数组或许更合适.
mongo 里面数组也是可以建立索引的, 查询也很方便.
另外, 也可以参考 mongo 自身的权限系统, 其权限设置也是保存在 mongo 数据库内的, 通常都是 admin 库下的 users 表. 如果你的 mongo 开启了权限管理, 并且权限库名字就叫 admin, 则可以用以下命令查看:
以上输出为示例. 可以看到官方存储权限的方案也是用数组.
参考:
mongo 官方文档 - 用户权限管理
mongo 官方文档 - 数组索引