Я изо всех сил пытаюсь найти эффективное решение для определения доступа пользователя к указанной папке, используя PHP (в частности Laravel) и MySQL. Я хочу создать систему с функциональностью Google Drive-esque ...
Например, Джо Блоггс создает много папок в папках, например, 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 |
Таким образом, основываясь на записи 1 в folder_users
, Джо Блоггс должен иметь права владельца, чтения и записи для всех папок, находящихся под Level 1
. Затем Джо Блоггс предоставляет Джону Сноу право на чтение и запись для Level 3
, что, в свою очередь, должно дать Джо Блоггсу право на чтение и запись для Level 3
, Level 3.1
, Level 3.2
и всего, что будет создано в любом из них в будущем.
Кроме того, пользователь должен иметь возможность пометить папку. Я мог бы предположить, что это может быть просто достигнуто с отдельной таблицей и запросить это отдельно -
Table name: starred_folders
| id | folder_id | user_id |
| -- | --------- | ------- |
| 1 | 7 | 2 |
Текущее решение, которое у меня есть, - для каждой папки в цепочке, к которой у пользователя есть права доступа, создается запись в таблице folders_users
. Я чувствую, что это просто усложняет вещи и создает чрезмерное количество записей. Это особенно верно, когда дело доходит до общего доступа к папке, так как я должен воссоздать все дерево для этого одного пользователя. Или представьте, если пользователь отменяет доступ на запись к одному из общих пользователей, все дерево (возможно, сотни записей) необходимо обновить для одного флага.
Каков наилучший способ создания этих деревьев? и быстро и качественно определить уровень доступа пользователя в той или иной папке? Я подозреваю, что единственный способ сделать это - рекурсия, но я обеспокоен ее эффективностью? Или я должен использовать что-то совершенно отличное от MySQL для этого? Я кратко изучил графовые базы данных, но не вижу, чтобы это был путь вперед, поскольку у нас нет инфраструктуры для его поддержки.
Спасибо, Крис.