Hare.ru @ Коллективный разум / Hare.ru @ Дикое место |
Архив hare.ru | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Мысли, конвертированные в текст | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Концептуальные работыОт V7 к V8. Обсуждение концепций структур данных. Таблицы данных.Дмитрий Малюгин (где-то в 2001)
Введение. Целью данной работы является обсуждение свойств некоторых объектов метаданных платформы «1С:Оперативный учет». Будут предложены пути "повышения концептуального единства" текущей версии платформы (далее V7), которые должны облегчить и упорядочить процесс создания устойчивых информационных систем. Среди множества предложений по улучшению функциональных свойств V7 были выбраны те, которые, на наш взгляд, наиболее важны с концептуальной точки зрения:
Зачастую автор испытывал затруднения с использованием соответствующей материалу терминологии. В ряде мест пришлось вводить новые термины, возможно, не всегда удачные, что могло сказаться на четкости выражения мыслей. Где-то изложенному не хватает строгости и подробностей, но написание книги не являлось целью работы. Автор рассчитывает на терпение читателей и соответствующий уровень подготовки. I. Таблицы данных (ТД). Группировка кортежей. Общие свойства таблиц данных. Почему мы начинаем обсуждение с таблиц? Потому что данное понятие является базовым (абстрактным) в теории БД. В конечном счете, выходные данные получают обычно в виде неких таблиц, что достаточно удобно. Как известно, версия 7.5 платформы не поддерживала понятие Таблица Значений, но в версии 7.7 данный объект "под давлением обстоятельств" пришлось ввести. Поскольку понятие было "введено задним числом", возникли определенные нестыковки с уже имеющимися понятиями V7. Забудем на время про те объекты, которые используются в V7, и зададимся вопросом, какими свойствами должна обладать абстрактная Таблица Данных (не путать с таблицей значений)? Для начала – стандартными свойствами таблиц, состоящих из набора кортежей. Вспомним основные свойства:
Группировка кортежей. В V7 есть два объекта (Таблица Значений и Запрос) для манипулирования с одним и тем же – с выборкой данных. Это не выглядит логичным. Более того, процедуры навигации различны, в запросе это цикличный обход группировок, а в таблице значений – перебор строк. Не правильнее ли будет сократить число сущностей? Для начала разберемся с группировками. Конечно, "группировка" не очень удачный термин (особенно в свете того, что в V7 есть перпендикулярное понятие "группы элементов" в справочниках). Возможно, что правильнее было бы использовать термин "упорядочивание". Но тогда необходимо заменить используемый в V7 оборот "упорядочить по:" на "сортировать по:", что может привести к еще большей путанице, так что потерпим "группировку". Итак, вводим понятие Группировки Кортежей в таблице данных. Под группировкой кортежей по какой-либо колонке мы понимаем упорядочивание кортежей по какому-либо критерию, заданному для значений данной колонки. Каким же образом после группировки появляются "циклы обхода группировок"? Дело в том, что группировка ТД по какой-либо колонке разбивает исходную ТД на ТД-владельца, в которой есть группирующая колонка с уникальными значениями (а также, возможно, некоторые "итоговые" колонки), и на подчиненные ей таблицы с неупорядоченными кортежами (в которых группирующая колонка, разумеется, отсутствует). Каждая из подчиненных таблиц, в свою очередь, также может быть сгруппирована по какой-либо из оставшихся колонок, образуя новые связи "один ко многим" и т.д. Поясним сказанное на примере. Пусть мы имеем на входе неупорядоченную таблицу данных ТД1:
Исходная таблица данных ТД1 После группировки таблицы ТД1 по столбцу AB с добавлением итогов по колонке NUM получаем три таблицы – таблицу-владельца с двумя кортежами (A, 8) и (B, 4), а также подчиненные данным элементам неупорядоченные таблицы:
Подчиненные таблицы можно также группировать по следующему столбцу (CD), получая уже второй уровень подчиненности и т.д. Наверное, не помешает будет также операция отмены группировки для возврата к исходной таблице, после чего можно группировать в другом порядке. Отметим, что теперь операции навигации по подчиненным таблицам невозможны без позиционирования на каком-либо кортеже таблицы-владельца AB. Это и есть "обход группировок" в терминах V7. Как известно, только после вызова метода Группировка() можно получить значения таблицы в группирующих колонках. Более правильным будет сохранить обычную терминологию таблиц для выборки кортежей. Тем более что в общем случае группировка может быть осуществлена совместно по нескольким колонкам. Например, после группировки ТД1 по AB+CD (не путать с группировкой по AB, а затем по CD) с включением итогов по NUM получим:
Таким образом, при выполнении группировки исходной таблицы (рассматриваем только один уровень) необходимо указать:
Поясним сказанное на примере таблицы ТД1. Пусть изначально ТД1 свободна от группировок. Тогда позиционирование на первой записи (с помощью метода ТД1.ВстатьВНачало()) даст кортеж со значениями { ТД1.AB=a, ТД1.CD=c, ТД1.NUM=1 } Сгруппируем ТД1 по колонке AB (включая итоги по NUM) и дадим группировке имя грAB. Метод может выглядеть примерно так: ТД1.Группировать("грAB", "AB", "SumNUM=Итог(NUM)"). Теперь метод ТД1.ВстатьВНачало() даст кортеж { ТД1.AB=a, ТД1.SumNUM=8 } Значения колонок CD и NUM не определены. Однако после позиционирования на кортеже таблицы-владельца есть возможность навигации по подчиненной таблице – ТД1.грAB.ВстатьВНачало() даст кортеж { ТД1.грAB.CD=c, ТД1.грAB.NUM=1 } Следующий уровень группировки можно применять к предыдущему, например: ТД1.грAB.Группировать("грCD", "CD", "SumNUM=Итог(NUM)"). После двух таких группировок доступ к атрибуту "NUM" возможен только через три точки (ТД1.грAB.грCD.NUM) и только после позиционирования на кортежах всех таблиц-владельцев. Достоинство приведенного определения операции группировки в том, что операция замкнута, то есть в результате ее выполнения мы получаем просто еще один объект типа Таблица Данных. Это позволяет выполнять рекурсивные вызовы операций, организовывать циклы и т. д. Более того, на наш взгляд, ничто не препятствует тому, чтобы на одном уровне группирования организовывать группировки разных типов. То есть, применительно к нашему примеру, допускается сосуществование группировок ТД1.грAB1 и ТД1.грAB2, сгруппированных по одной и той же колонке AB. При этом подчиненные таблицы (тип и идентификаторы колонок) данных группировок могут быть различны. Аналог – существование нескольких справочников, подчиненных одному владельцу, или документов с несколькими табличными частями. Важный момент заключается также в том, что группировка может производиться не только "вниз", но и "вверх". Допустим, мы имеем колонку в ТД со ссылками на товары, и каждый из товаров имеет реквизит "Производитель". Мы можем (или мягче – должны иметь возможность) сгруппировать данную ТД по производителям товаров. При выполнении такой операции к ТД добавляется колонка "Производитель", а текущая ТД преобразуется в подчиненную – ТД.Производитель. При обсуждении группировок уместно вспомнить о необходимости введения в платформу понятий Интервал (временной и числовой) и Набор Интервалов. Это сделает возможным операцию группировки по значениям типа "Число" и "Дата". Концепция интервалов – отдельная тема, которой мы еще коснемся при обсуждении оборотных ресурсов функциональных зависимостей. Проецирование объектов агрегатного типа в Таблицу Данных Объект ТД является наиболее низшим в иерархии объектов агрегатного типа, следовательно, любой другой объект должен иметь процедуры проецирования (отображения, выгрузки) в таблицу данных. Кроме того, существующие в V7 независимые сущности Запрос и Таблица значений должны слиться в одно понятие – Таблица данных. Результатом выполнения запроса должна быть ТД, а уж сгруппированная или нет – определяется текстом запроса. Рассмотрим операции выгрузки объектов в ТД.
Резюме.
|
Партнеры: Также может быть интересно: Канал Россия 1 на http://spbtvonline.ru/ |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Сайт поддерживается за счет партнеров: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
:::... Сайт содержит архив двух версий hare.ru | Карта сайта |