MySQL Структура для дерева с разными типами - PullRequest
0 голосов
/ 06 августа 2020

Мне было поручено построить древовидную структуру. У меня нет опыта в этой штуке, и мне было интересно, есть ли какие-нибудь явно очевидные проблемы с моим подходом.

Итак, у меня есть большая таблица файлов (и поля, касающиеся регулярного использования данных в этом файле), которые должны оставаться такими же , и я создаю структуру, в которой есть папки, поэтому папки могут содержать X файлов и X папок. Но файлы не могут иметь дочерних элементов.

Я думал, что со структурой мне придется обрабатывать либо null folderId, либо fileId, но в остальном, я думаю, все в порядке. что древовидная структура должна лениво загружаться через REST API, чтобы пользователь мог щелкнуть узел и получить всех его дочерних узлов, используя идентификатор. Я не уверен, что мой дизайн идеален, поэтому хочу получить отзывы.

Я собирался построить свою структуру таблицы вот так (заранее извините за плохое форматирование):

FileTable

  • Id
  • Version
  • File

FolderTable

  • Id
  • Name

ItemTable

  • Id
  • FolderId foreignKey
  • FileId foreignKey

TreeTable

  • Id
  • Внешний ключ ParentId TreeTable
  • Внешний ключ ID элемента

1 Ответ

1 голос
/ 06 августа 2020

Я думаю об использовании только одной таблицы

DirObject

со следующими полями:

  • Id
  • ParentId # Ссылка на родительский объект - родительский объект должен иметь тип 'Folder'
  • ObjectType #Folder или File
  • Version
  • OwnerUser
  • OwnerGroup
  • Разрешения
  • LastUpdate
  • Размер файла
  • Статус
  • Путь

Обновление:

Поскольку вам потребуется отдельная таблица для файлов, попробуйте следующее:

Папки

  • Id
  • ParentId # Ссылка на родительскую папку
  • OwnerUser
  • OwnerGroup
  • Разрешения
  • LastUpdate
  • Статус
  • Путь

Файлы

  • Id
  • FolderId # Внешний ключ из таблицы папок
  • OwnerUser
  • OwnerGroup
  • Разрешения
  • LastUpdate
  • Статус
  • Путь

Примечание:

Значение Пути должно быть таким же, как работают обычные каталоги \ folder1 \ folder2 \ folder3 \ filename

Это поможет, когда вы захотите получить размер определенной папки. ваш запрос будет иметь вид

SELECT SUM(FileSize) from db.files where path like '\path\of\folder\%';

...