Рекурсия, полнотекстовый поиск, индексы
Потребовалось-таки мне копировать ветвь дерева и потому сразу же потребовалась так называемая РЕКУРСИЯ, вызов из функции той же самой функции.
В медицинской базе, про которую тут:
http://akostina76.ucoz.ru/blog/2016-11-24-3643
…мне потребовалось в справочнике связей создавать копии структур справочника объектов (чтобы руками это не делать).
Выглядит это так:
… т.е в справочник добавляется новая строка, а если к этой ветке прицелены ещё какие-то ветки, то для них всех выполняется эта же функция но с чуть другими параметрами.
Рекурсия появилась уже в Турбо Си. Но где-то раньше, видимо на больших машинах её не было. Потому что об этом говорилось как о достижении. И действительно компилятор должен что-то сложное генерировать чтобы во всё том же ассемблерном коде, для каждого вызова функции создавалась своя изолированная среда (экземпляры переменных и т.д). Так или иначе в обычных языках это есть довольно давно.
Здесь я написала про то, что SQL этого не умеет:
http://akostina76.ucoz.ru/blog/2016-11-26-3650
Ошиблась. Отсюда:
https://habrahabr.ru/post/27439/
Рекурсивны SQL запросы являются одним из способов решения проблемы дерева и других проблем, требующих рекурсивную обработку. Они были добавлены в стандарт SQL 99. До этого они уже существовали в Oracle. Несмотря на то, что стандарт вышел так давно, реализации запоздали. Например, в MS SQL они появились только в 2005-ом сервере.
… Но только с стандарте это появилось в 1999 году, а в SQL Server-е с 2005 года.
И хранимые процедуры вызывать можно, но не более 32 вложений:
http://www.sql.ru/forum/24992/rekursivnyy-vyzov-hranimyh-procedur
Так что некоторый дурной тон в виде работы с данными из программы а не средствами базы данных не является единственной возможностью.
При этом почти наверняка там внутри что-то есть, что позволяет работать с этими деревьями. Здесь описано:
http://akostina76.ucoz.ru/blog/2016-11-24-3643
… добавление внутренних полей Родитель1, 2 чтобы хоть как-то ускорить выборки. Это решает вопрос не полностью а частично и это дополнительная, хранящаяся в базе информация. Но ведь все индексы, по которым осуществляется поиск это какая-то дополнительная хранимая информация. Чтобы решить вопрос радикально мне потребовалось бы завести отдельную таблицу (типа 1С-овских характеристик) и хранить в ней для каждой строки полный список «ветвей» («родителей»), который к ней ведёт. При таком добавлении все выборки, которые обычно делаются рекурсией осуществлялись бы мгновенно, выборкой по этой внутренней таблице – своеобразному индексу.
Есть ещё один тип информации, с которым всё чаще и чаще приходится работать. Это произвольный и достаточно длинный текст. И по этому объекту тоже что-то надо искать. И на нем тоже никак не работают стандартные индексы, годные для сортировки и поиска коротких слов.
В SQL Server-е для этого есть специальный, отдельный полнотекстовый индекс:
http://dbasimple.blogspot.ru/2012/08/ms-sql-server-2008-full-text-search.html
… который работает быстрее чем LIKE в выражении WHERE просто потому, что он – индекс.
Я таким никогда не пользовалась, но можно искать не просто тексты, в которых есть слова, но и тексты, в которых эти слова, например, разделены не более чем двумя другими словами тоже можно:
https://msdn.microsoft.com/ru-ru/library/ms142568.aspx
В 1С тоже есть свой полнотекстовый поиск с аналогичными возможностями:
http://v8.1c.ru/overview/Term_000000275.htm
… который судя по пустому каталогу SQL Server-е делается своими внутренними средствами.
Это было два примера данных, для которых не годятся стандартные индексы как средство поиска. Статью по какому-то экзотическому индексу, данную Новиковым:
http://www.math.spbu.ru/SD_AIS/ru-index.shtml
… я пыталась понять в 1994 году. Мне это показалось неинтересным потому что было непонятно что за информация такая может требовать чего-то отличного от уже созданного NTX файла с B-деревом. Но жизнь сложнее. И объекты, для работы с которыми могут потребоваться нестандартные средства не звучат может потому, что с ними ещё не научились работать.
Напомню, что в 1994 году обычнее языки уже умеют работать с рекурсией, а для работы с базой данных этого инструмента ещё нет даже в стандарте. И, тем более, нет ещё внутреннего инструментария (каких-то индексов) для работы со всем этим. Но все эти очень полезные для хозяйства вещи уже кто-то придумывал и разрабатывал.
|