Хранение иерархии папок в реляционной базе данных
-
23-08-2019 - |
Вопрос
У меня есть объекты, представляющие папки, и мне интересно, должны ли они быть представлены в базе данных.
С одной стороны, кажется, что самым простым способом было бы не представлять объекты папки, а просто сохранить значение пути для объектов, содержащихся в папке.Проблемы, которые я вижу в связи с этим, заключаются в том, что вы не можете сохранить папку, потомки которой не содержат никаких элементов, что не так уж и важно.Также у меня нет четкого представления о том, как загрузить иерархию папок для отображения (например, в виде дерева) без предварительной загрузки всего в память, что, вероятно, было бы проблемой производительности.
Альтернативой является наличие таблицы "Папка" со ссылками на ее родительскую папку.Кажется, это должно сработать, но я не уверен, как разрешить папки с одинаковым именем, если у них нет общего родительского элемента.Должно ли это вообще быть чем-то, чем должна заниматься БД, или это то, что я должен просто применять в бизнес-логике?
Решение
Идея заключается примерно в этом (самоссылка):
CREATE TABLE FileSystemObject (
ID int not null primary key identity,
Name varchar(100) not null,
ParentID int null references FileSystemObject(ID),
constraint uk_Path UNIQUE (Name, ParentID),
IsFolder bit not null
)
Другие советы
Взгляните на ERD в середине этого Страница.Выделение иерархии в отдельную таблицу позволяет поддерживать несколько таксономий.
Сначала спросите себя, какова цель сохранения иерархии в базе данных и какую функциональность вы получаете за счет этого.Затем попросите рассмотреть работу и техническое обслуживание, которые требуются для этого.
Если вы просто используете его для заполнения элемента управления в виде дерева, существуют встроенные элементы управления, которые работают непосредственно с системой папок.Сработало бы это лучше для вас?Получаете ли вы что-то сверх этого, сохраняя это в базе данных?Как вы планируете синхронизировать базу данных с реальной системой папок, которая может быть изменена за пределами базы данных?Если вы не предоставляете виртуальную файловую систему, возможно, было бы лучше просто перейти непосредственно к реальной системе с соответствующими путями, хранящимися в базе данных.
SQL Server имеет hierarchyid
тип данных, поддерживающий иерархические структуры.Имейте в виду, работает только в полной версии.