Хранение иерархии папок в реляционной базе данных - PullRequest
5 голосов
/ 05 апреля 2009

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

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

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

Ответы [ 4 ]

6 голосов
/ 05 апреля 2009

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

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
)
1 голос
/ 05 апреля 2009

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

0 голосов
/ 05 апреля 2009

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

0 голосов
/ 05 апреля 2009

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

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

...