【发布时间】:2020-07-18 05:33:36
【问题描述】:
我正在努力想出一个有效的解决方案来确定用户对指定文件夹的访问权限,使用 PHP(特别是 Laravel)和 MySQL。我想创建一个具有 Google Drive-esque 功能的系统...
例如,Joe Bloggs 在文件夹中创建了许多文件夹,例如Level 1 > Level 2 > Level 3 > Level 4 > Level 5。在这些文件夹中的任何一个中,都可以有任意数量的附加子文件和文件夹。
这将是生成的数据库结构 -
Table name: users
| id | name |
| -- | ---------- |
| 1 | Joe Bloggs |
| 2 | John Snow |
Table name: folders
| id | parent_id | author_id | name |
| -- | --------- | --------- | --------- |
| 1 | NULL | 1 | Level 1 |
| 2 | 1 | 1 | Level 2 |
| 3 | 2 | 1 | Level 3 |
| 4 | 3 | 1 | Level 4 |
| 5 | 4 | 1 | Level 5 |
| 6 | 2 | 1 | Level 3.1 |
| 7 | 2 | 1 | Level 3.2 |
Table name: folders_users
| id | folder_id | user_id | owner | read | write |
| 1 | 1 | 1 | 1 | 1 | 1 |
| 2 | 3 | 2 | 0 | 1 | 1 |
因此,根据 folder_users 中的记录 1,Joe Bloggs 应该对 Level 1 下的所有文件夹拥有所有者、读取和写入权限。 Joe Bloggs,然后授予 John Snow 对 Level 3 的读写访问权限,这反过来又应授予 Joe Bloggs 对 Level 3、Level 3.1、Level 3.2 的读写访问权限以及将来在其中任何一个下创建的任何内容。
此外,用户应该可以为文件夹加注星标。我想这可以简单地通过一个单独的表来实现并单独查询 -
Table name: starred_folders
| id | folder_id | user_id |
| -- | --------- | ------- |
| 1 | 7 | 2 |
我目前的解决方案是针对用户有权访问的链中的每个文件夹,在folders_users 表中创建一条记录。我觉得这只是使事情过于复杂并创建了过多的记录。在共享文件夹时尤其如此,因为我必须为该用户重新创建整个树。或者,想象一下,如果用户撤销对其中一个共享用户的写入权限,则必须针对单个标志更新整个树(可能有数百条记录)。
生成这些树并快速有效地确定用户在任何给定文件夹中的访问级别的最佳方法是什么?我怀疑这样做的唯一方法是递归,但我担心它的效率?或者,我是否应该为此使用与 MySQL 完全不同的东西?我对图形数据库进行了简短的了解,但我认为这对我们来说不是一个前进的方向,因为我们没有支持它的基础架构。
谢谢, 克里斯。
【问题讨论】:
标签: php mysql laravel recursion