чё значит многомерность?

mod
Дата: 07.05.2005 08:00:38
Господа просвятите что значит многомерность Cache и как ею пользоваться?
p519446
Дата: 07.05.2005 23:24:16
Имхо, под многомерностью надо понимать возможность использования составных переменных с иерархической (древовидной) структурой.

Под словом "переменные" в Cache' имеются ввиду НЕ только объекты, создаваемые в оперативной памяти, но также и хранимые на диске образы этих объектов. Эти хранимые образы называются в Cache' глобалами. Причина такого названия в том, что создав такую переменную на машине #1 и сохранив её на диске (в файле cache.dat), можно сразу же использовать её на машине #2 (#3,...), загрузив в память этой (второй, третьей, etc.)машины из cache.dat.

Глобалы могут иметь произвольное количество т.н. узлов (которые также могут быть составными). Кроме того, элементы, составляющие глобалы, могут индексироваться не только натуральными числами, но вообще всеми действительными числами (>0, 0 и <0) и даже строками (подобное есть в массивах javascript).

Такими составными структурами можно легко изобразить, например, пятимерный куб (когда некий результат зависит от пяти аргументов, причём часто для многих "строк" и "столбцов" НЕобязательно наличие всех аргументов -- такой куб называется разреженным массивом).

Изображается такой "кубик" в виде дерева (для простоты восприятия индексы его ячеек приведены в виде натуральных чисел, хотя вместо них можно использовать, к примеру, слова -- типа "b23", "sklad01", или числа с плав. точкой: -12.34 etc.).

Каждая ячейка помимо того, что несёт инф. о связи со своими "потомками" или "предками", также может содержать какое-то значение. Именно "может" (т.е. НЕ обязана).

Вот пример: есть некий "большой склад", по которому требуется вести учет по пяти "номинациям": 1) вид товара, 2) матотв_лицо, 3) ангар, 4) стеллаж (ярус, этаж etc.) и 5) ячейка.
Конечным значением ФУНКЦИИ (от вышеуказанных пяти аргументов) является СОСТАВНОЕ значение - уник_ID_товара + название + коливество_на_полке.
Разумеется, всевозможные отчеты-выборки-справки могут потребоваться как по отдельным "номинациям", так и по нескольким из них.

Представить такой "складик" можно примерно так:
===== начало иллюстрации (5-мерный куб) =========
M
M(1) = "склад номер 1 - оригинальные запчасти"
M(1,1) = "мат. ответственный Иванов"
M(1,1,1) = "Иванов. Ангар 1"
M(1,1,1,1) = "Ангар 1. Стеллаж 1"
M(1,1,1,1, "B23") = список("41620-3B050","Фильтр масляный", 120)
M(1,1,1,1, "C19") = список("81205-0E357","Фильтр воздушный", 18)
......
M(1,1,1,2) ="... Ангар 1. Стеллаж 2"
M(1,1,2) = "Иванов. Ангар 2"
M(1,1,3) = "Иванов. Ангар 3"
M(1,1,3,1) = "... Ангар 3. Стеллаж 1"
M(1,1,4) = "Иванов. Ангар 4"
....
M(1,2) = "мат. ответственный Петров"
M(1,3) = "мат. ответственный Сидоров"
....
....
M(2) = "склад номер 2 -- аксессуары"
M(2,1)="мат ответственный Никитин"
M(2,1,1)
M(2,1,2)
...
M(2,2)="мат ответственный Романов"
M(2,2,1)
...

M(3)="склад номер 3 - ГСМ"
...
====== конец иллюстрации =====

А теперь самое главное: в Cache', чтобы нагородить такую структуру, достаточно следующих команд (их можно вводить "интерактивно" в Cache' Terminal (если делать нечего :)) или вызвать предварит. написанный скрипт):

set ^M(1) = "склад номер 1 - оригинальные запчасти"
set ^M(1,1) = "мат. ответственный Иванов"
set ^M(1,1,1) = "Иванов. Ангар 1"
....

Знак "крышки" (^) говорит системе "создать переменную M(...), присвоить ей такое-то значение и (сразу) СОХРАНИТЬ на диске".
Никаких "таблиц" создавать НЕ надо. Никаких скуль-выражений типа

insert into skladTable (sklad1) values ("склад номер 1 - оригинальные запчасти")

- также не надо (хотя все такие операции можно делать и через SQL).

Способ работы с данными как с древовидными структурами для Cache' является "родным". И он в нём выполняется намного быстрее, чем via SQL.

Кроме того, существует просто туча всяких вспомогат. ф-ций для работы с глобалами (например, проверка существования узла, проверка наличия непустых ДАННЫХ в узле, поиск узла, поиск "вверх"/"вниз" по иерархии, поиск (проход) "по горизонтали" и т.д.). Эти ф-ции, также выполняются быстрее, чем
если всё это делать на SQL.

ЗЫ-1. В документации Cache' есть где-то наглядное объяснение в виде анимации по этому вопросу. Там видно "как в мультфильме", как формируется примерно такая же многомерная байда, какую я привёл здесь.
Смотри в доке: [ROOT] / Caché Development Guides / Using Caché Multi-Dimensional Storage (дальше не помню, где именно; помню точно, что это было еще в версии 5.0.2).

ЗЫ-2. Зайди на http://www.cache.ru/cache/education/docs.html
- там у них всякие учебные мат-лы, наверняка этот вопрос тоже есть.
mod
Дата: 09.05.2005 07:38:03
Спасибо!