3.4. ДОПУСТИМЫЕ СПОСОБЫ ИСПОЛЬЗОВАНИЯ АНТИПАТТЕРНА
Конструкция списка соседства, возможно, прекрасно обеспечит ту работу, которую требуется выполнить в приложении. Достоинство конструкции списка соседства состоит в извлечении прямого родительского или дочернего объекта заданного узла. В этом случае не представляет сложности и вставка строки. Если данные операции — это все, что необходимо делать с иерархическими данными, тогда Список соседства способен хорошо справляться с ними.
НЕ УСЛОЖНЯЙТЕ
Я написал для компьютерного центра обработки данных приложение по отслежи-
ванию производственных ресурсов. Внутри компьютеров скомпоновано некоторое
оборудование; например, дисковый контроллер с кэшем установлен в сервере,
смонтированном в стойке, а дополнительные модули памяти установлены в кон-
троллере диска.
Мне требовалось SQL-решение, позволяющее легко отслеживать использование иерархических коллекций. Но мне также надо было отслеживать каждую отдельную часть оборудования для создания бухгалтерских отчетов по амортизации, использованию оборудования и рентабельности инвестиций.
Менеджер сообщил, что совокупности могут иметь подмножества и, таким образом, дерево теоретически может распространяться на любую глубину. Потребовалось несколько недель, чтобы улучшить программный код функций обработки деревьев в хранилище базы данных, пользовательского интерфейса, администрирования и отчетности.
Однако на практике приложению инвентаризации никогда не надо выполнять группирование оборудования с деревом глубже одиночной взаимосвязи «родитель-потомок». Если бы мой клиент подтвердил, что этого будет достаточно для моделирования его требований к инвентаризации, мы могли бы сэкономить усилия, не выполняя достаточно большого объема работы.
РСУБД (реляционные СУБД) некоторых производителей поддерживают расширения SQL с целью поддержки иерархий, хранящихся в формате списка соседства. Стандарт SQL-99 определяет синтаксис рекурсивного запроса, использующего ключевое слово WITH, за которым следует обыкновенное табличное выражение.
Файл npvmepa:_Trees/legit/cte.sql
WITH CommentTree
(comment_id, bug_id, parent_id, author, comment, depth)
AS (
SELECT *, 0 AS depth FROM Comments WHERE parent_id IS NULL UNION ALL
SELECT c.*, ct.depth+1 AS depth FROM CommentTree ct JOIN Comments с ON (ct.comment_id = c.parent_id))
SELECT * FROM CommentTree WHERE bug_id = 1234;
В Microsoft SQL Server 2005, Oracle 1 lg, IBM DB2 и PostgreSQL 8.4 поддерживаются рекурсивные запросы с использованием обычных табличных выражений, подобных показанным выше.
MySQL, SQLite и Informix пока еще не поддерживают этот синтаксис. То же самое относится к СУБД Oracle 10g, которая по-прежнему широко применяется на практике. Можно было бы предположить, что в будущем синтаксис рекурсивных запросов станет доступным во всех популярных базах данных, и тогда использование списка соседства не будет связано с соответствующими ограничениями.
Базы данных Oracle 9i и 10g поддерживают оператор WITH, но не для рекурсивных запросов. Вместо этого существует фирменный синтаксис: START WITH и CONNECT BY PRIOR. Данный синтаксис подходит для подобных рекурсивных запросов:
Файл примера: Trees/legit/connect-by.sql
SELECT * FROM Comments
START WITH comment_id = 9876
CONNECT BY PRIOR parent_id = comment_id;
Опубликовал vovan666
June 18 2013 12:24:57 ·
0 Комментариев ·
3648 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.