2009-04-05 2 views
4

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

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

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

+0

Его легко реализовать с новым HIERARCHYID, зарегистрированным в SQL Server 2008 (со стороны БД) –

+0

Хм, это доступно в SQLCE? – Davy8

+0

@ Davy8, во всех версиях (inlcuding express), кроме SQL CE. –

ответ

5

Идея что-то вроде этого (автореферентных):

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 
) 
+0

Звучит неплохо, что представляет префикс uk? – Davy8

+0

уникальный ключ :), не обязательно, это просто часть имени ограничения. –

+0

cool thanks :) Я знаю, что это всего лишь часть имени, но самые распространенные префиксы условных обозначений для sql-кода неизвестны мне, поскольку большая часть мира OO стремится уклониться от венгерской нотации, которая кажется довольно популярной в реляционном мире. – Davy8

1

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

+0

Кажется, ссылка сломана. – madth3

0

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

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

0

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

Смежные вопросы