Хранение иерархии папок в реляционной базе данных

У меня есть объекты, представляющие папки, и мне интересно, должны ли они быть представлены в базе данных.

С одной стороны, кажется, что самым простым способом было бы не представлять объекты папки и просто сохранять значение пути для объектов, содержащихся в папке. Проблема, которую я вижу в этом, заключается в том, что вы не можете сохранить папку, потомки которой не содержат никаких элементов, что не так уж важно. Кроме того, у меня нет четкого представления о том, как загрузить иерархию папок для отображения (например, в TreeView), не загружая все в память заранее, что, вероятно, будет проблемой производительности.

Альтернативой является наличие таблицы «Папка» со ссылками на ее родительскую папку. Кажется, это должно работать, но я не уверен, как разрешить папки с одинаковым именем, если они не имеют общего родителя. Должно ли это быть чем-то, чем должна заниматься БД, или это то, что я должен просто применять в бизнес-логике?


person Davy8    schedule 05.04.2009    source источник
comment
Это легко реализовать с новым HIERARCHYID, зарегистрированным в SQL Server 2008 (на стороне БД).   -  person Konstantin Tarkus    schedule 05.04.2009
comment
Хм, это доступно в SQLCE?   -  person Davy8    schedule 05.04.2009
comment
@ Davy8, во всех версиях (включая экспресс), кроме SQL CE.   -  person Konstantin Tarkus    schedule 05.04.2009
comment
+1 Хороший вопрос. Преимущества использования базы данных SQL — с точки зрения производительности для хранения/обработки иерархии.   -  person therobyouknow    schedule 16.06.2011


Ответы (4)


Идея примерно такая (самоотсылка):

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
)
person mmx    schedule 05.04.2009
comment
уникальный ключ :), не обязательно, это просто часть имени ограничения. - person mmx; 05.04.2009
comment
круто, спасибо :) Я знаю, что это всего лишь часть имени, но наиболее распространенные префиксы соглашения об именах sql мне неизвестны, поскольку большая часть мира OO имеет тенденцию уклоняться от венгерской нотации, которая кажется довольно популярной в реляционном мире. - person Davy8; 05.04.2009

Взгляните на ERD в середине этой страницы. Вынесение иерархии в отдельную таблицу позволяет поддерживать несколько таксономий.

person Glenn    schedule 05.04.2009
comment
Мне кажется ссылка битая. - person madth3; 24.01.2013

Сначала спросите себя, какова цель сохранения иерархии в базе данных и какие функциональные возможности вы от этого получаете. Затем попросите рассмотреть работу и техническое обслуживание, которое необходимо для этого.

Если вы просто используете его для заполнения древовидного элемента управления, есть встроенные элементы управления, которые действуют непосредственно против системы папок. Будет ли это работать лучше для вас? Вы получаете что-то помимо этого, сохраняя это в базе данных? Как вы планируете синхронизировать базу данных с реальной системой папок, которую можно изменить вне БД? Если вы не предоставляете виртуальную файловую систему, может быть лучше просто пойти прямо против реальной вещи с соответствующими путями, хранящимися в базе данных.

person Tom H    schedule 05.04.2009

SQL Server имеет тип данных hierarchyid, который поддерживает иерархические структуры. Заметьте, работает только в полной версии.

person Dmitri Nesteruk    schedule 05.04.2009