powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Загнать иерархию в базу
17 сообщений из 17, страница 1 из 1
Загнать иерархию в базу
    #36030241
xrw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем, интересует такой вопрос:
К примеру у нас имеется файловая структура (диск c: например), нужно дерево имен файлов и папок хранить в базе данных. Как должна выглядеть модель базы в таком случае?
...
Рейтинг: 0 / 0
Загнать иерархию в базу
    #36030405
Дмитрий16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xrwПривет всем, интересует такой вопрос:
К примеру у нас имеется файловая структура (диск c: например), нужно дерево имен файлов и папок хранить в базе данных. Как должна выглядеть модель базы в таком случае?

Есть куча вариантов:
1. Хранить полные пути к каждому файлу просто текстовой строкой.
Основное достоинство - скорость поиска, вставки, удаления + простота структуры.

2. Табличка папки, табличка файлы. табличка нахождения файла в папке (помним про мнемонические ссылки в NTFS) где один и тот же файл может быть в нескольких папках.

P.S. ты случайно не EPAM на собеседование ходил? :-)
...
Рейтинг: 0 / 0
Загнать иерархию в базу
    #36030414
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xrwПривет всем, интересует такой вопрос:
К примеру у нас имеется файловая структура (диск c: например), нужно дерево имен файлов и папок хранить в базе данных. Как должна выглядеть модель базы в таком случае?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create table disk(
  id int not null, 
  idParent int
  name varchar( 127 ) not null
)

alter table disk add constraint PK_disk primary key(id)
alter table disk add constraint FK_disk foreign key references disk(idDisk)
alter table disk add constraint UQ_disk unique(id, name)
...
Рейтинг: 0 / 0
Загнать иерархию в базу
    #36030463
xrw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий16
P.S. ты случайно не EPAM на собеседование ходил? :-)
Не это не йа :)

Senya_L, при таком подходе как мне можно будет сформировать полный путь и вычислить уровень вложенности конечного элемента?
По идее нужно будет пробежаться по всем idParent в иерархии, не слишком ли это накладно?
...
Рейтинг: 0 / 0
Загнать иерархию в базу
    #36030509
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xrwДмитрий16
P.S. ты случайно не EPAM на собеседование ходил? :-)
Не это не йа :)

Senya_L, при таком подходе как мне можно будет сформировать полный путь и вычислить уровень вложенности конечного элемента?
По идее нужно будет пробежаться по всем idParent в иерархии, не слишком ли это накладно?Корневые элементы выбираем как
Код: plaintext
select * from disk where idParent is null
Предикат IS NULL обычно индексируется, так что ненакладно. Полный путь вычислить можно при помощи CTE-запросов, которые к настоящему времени реализованы в большинстве СУБД как часть стандарта SLQ-99. Например, тынц .
...
Рейтинг: 0 / 0
Загнать иерархию в базу
    #36030738
Дмитрий16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xrwДмитрий16
P.S. ты случайно не EPAM на собеседование ходил? :-)
Не это не йа :)

Senya_L, при таком подходе как мне можно будет сформировать полный путь и вычислить уровень вложенности конечного элемента?
По идее нужно будет пробежаться по всем idParent в иерархии, не слишком ли это накладно?


Вот и еще один плюс хранения полного пути - он сразу есть :-)
+ еще добавить колонки на расширение, отдельно имя, даты создания, доступа, модификации, флаги.
Уровень вложенности = количество символов '\' :-)
...
Рейтинг: 0 / 0
Загнать иерархию в базу
    #36031372
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий16Вот и еще один плюс хранения полного пути - он сразу есть :-)Это недостаточный повод делать через ж@пу. Сделайте правильно, а если не устраивает скорость - сделайте денормализацию. Аккуратно, с обновлением иерархии в триггерах или ХП, но это потом.
...
Рейтинг: 0 / 0
Загнать иерархию в базу
    #36043248
Дмитрий16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_LДмитрий16Вот и еще один плюс хранения полного пути - он сразу есть :-)Это недостаточный повод делать через ж@пу. Сделайте правильно, а если не устраивает скорость - сделайте денормализацию. Аккуратно, с обновлением иерархии в триггерах или ХП, но это потом.

Ну это не мне. а про ж@опу - так ведь все условиями использования задается. А они не заданы. И, например при количестве файлов 10 штук городить деревья просто глупо. Хотя это и классика.
Поэтому ставить диагноз что правильно а что нет я бы не стал.

А вообще вот тут есть почти готовый пример
...
Рейтинг: 0 / 0
Загнать иерархию в базу
    #36043282
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий16Ну это не мне. а про ж@опу - так ведь все условиями использования задается. А они не заданы. И, например при количестве файлов 10 штук городить деревья просто глупо. Хотя это и классика.Вам, вам...
Вы же предлагаете. При том непонятно предлагаете: с одной стороны говорите, что деревья - это классика, с другой - деревья глупо. Я еще раз говорю: обычная практика такова, что изначально делать надо правильно, т.е. в соответствии с реляционной теорией. А если в процессе эксплуатации выявляется низкая производительность запросов на "правильной" структуре, то переходят к аккуратной денормализации, с поддержанием ссылочной и прочей целостности на триггерах, в ХП или еще как. Вы предлагаете сделать все наоборот, так что не соглашусь.
...
Рейтинг: 0 / 0
Загнать иерархию в базу
    #36043330
Дмитрий16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_L..., с поддержанием ссылочной и прочей целостности на триггерах,....
Ахтунг :-)
...
Рейтинг: 0 / 0
Загнать иерархию в базу
    #36043383
xrw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот скоро программку свою доделаю, выложу сюда и споров появится ещё больше :)
...
Рейтинг: 0 / 0
Загнать иерархию в базу
    #36043389
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий16Senya_L..., с поддержанием ссылочной и прочей целостности на триггерах,....
Ахтунг :-)А как Вы думали? HierarchyId есть пока только в MSSQL 2008, а далеко не все его использут. И даже не все используют MSSQL вообще. :)

Я лишь сказал, что это крайние меры, когда требования к скорости не обеспечиваются структурой БД. Какие Ваши предложения помимо криков "ахтунг"?
...
Рейтинг: 0 / 0
Загнать иерархию в базу
    #36043412
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xrwЯ вот скоро программку свою доделаю, выложу сюда и споров появится ещё больше :)Программку сюда не надо. Структуру БД - можно.
...
Рейтинг: 0 / 0
Загнать иерархию в базу
    #36043422
Дмитрий16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_LДмитрий16Senya_L..., с поддержанием ссылочной и прочей целостности на триггерах,....
Ахтунг :-)А как Вы думали? HierarchyId есть пока только в MSSQL 2008, а далеко не все его использут. И даже не все используют MSSQL вообще. :)

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


Ну для начала я бы выяснил каких операций будет больше и на каких нужно обеспечить наибольшее быстродействие. Выснить примерный объем данных (минимум и максимум) ну а уже исходя из условий решать какой вариант структуры лучше подойдет.
Например, в планарной структуре (блин я что зря везеде смайлики рисовал) процедура создания множества вложенных папок - это _один_ инсерт. против многих в иерархической. и в тоже время перемещение папки в папку быстрее в иерархической против планарной. Поэтому я и говорю, что заочно не зная какие предъявляются требования - сложно говорить о том, какая структура правильная. У каждой свои + и -.
...
Рейтинг: 0 / 0
Загнать иерархию в базу
    #36043493
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий16У каждой свои + и -.Кстати, о птичках (С).
То, что Вы называете "планарной структурой" реализовано в КЛАДРе. И эта структура вызывает самые неоднозначные оценки. Лично я всегда переделывал КЛАДР в обычное дерево. Кто-то раскидывает по нескольким табличкам, но не видел ни разу, чтобы кто-то оставлял все 'as is'.

Причину могу указать на примере:

Требуется : выбрать все регионы
Решение "планарное" :
Код: plaintext
1.
2.
3.
  select
    *
  from KLADR
  where CODE like '__00000000000';
Получаем table scan ибо никакая СУБД не поддерживает индексирование предиката типа LIKE '%ABC'.
Решение "иерархическое"
Код: plaintext
1.
2.
3.
4.
  select
    *
  from KLADR
  where idKLADR IS NULL;

Так что вижу только минусы. Плюсов не наблюдается. Массовые вставки, если только, да и то...
...
Рейтинг: 0 / 0
Загнать иерархию в базу
    #36043503
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_L Решение "иерархическое"
Код: plaintext
1.
2.
3.
4.
  select
    *
  from KLADR
  where idKLADR IS NULL;
Ошибочка тут. Запрос читать так:
Код: plaintext
1.
2.
3.
4.
  select
    *
  from KLADR
  where idParent IS NULL;
И этот запрос будет использовать индекс, между прочим
...
Рейтинг: 0 / 0
Загнать иерархию в базу
    #36043569
Дмитрий16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну KLADR - это вообще ужас. Такую фигню сделать - это еще суметь надо :-)
Кстати кладр это даже и планарная табличка в целом то. Кладр можно было бы считать планарным если бы он весь был в одной _очень_ большой таблице и GUID в качестве идентификатора.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Загнать иерархию в базу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]