- PVSM.RU - https://www.pvsm.ru -
«Caché предоставляет программистам свободу в выборе способа хранения и доступа к данным через объекты, SQL, либо путем прямого доступа к многомерным структурам данных. Независимо от способа доступа, все данные в базах данных Caché хранятся в многомерных массивах.»
Технологический справочник Caché [1]
«Глобалы (глобальные хранимые переменные) – абстракция B-tree структур, используемых в MUMPS для хранения больших объемов данных.»
A Universal NoSQL Engine, Using a Tried and Tested Technology [2]
В статье — пара примеров создания SQL проекций на различные структуры глобалов.
Для новых хранимых классов Caché автоматически использует стандартный способ хранения — CacheStorage [3]. В каких случаях может понадобиться создание собственных способов хранения (CacheSQLStorage или CustomStorage)?
Для схемы хранения CacheSQLStorage (или CustomStorage) настраивается SQL проекция (SQL storage map). Проекция содержит необходимую для компилятора информацию о используемых глобалах, их ключах (subscripts), правилах прохода по ключам и расположении данных. На основании этой информации компилятор генерирует необходимые методы доступа к данным.
Разомнемся на простом примере из статьи A Universal NoSQL Engine [2]. Телефонный справочник использует два глобала ^telephone — для хранения данных и ^nameIndex — для хранения индекса по владельцу телефонного номера.
Важным моментом создания SQL проекции является установка соответствия между ключами глобала данных и идентификатором объекта. В нашем случае это телефонный номер — первый ключ ^telephone.
После настройки хранения выполните запросы insert, update, delete к классу data.phones. Попробуйте использовать объектный доступ к экземплярам класса (%New, %Save, %DeleteId). Обратите внимание на содержимое глобалей после выполнения операций.
Рассмотрим более сложный пример, характерный для унаследованных приложений. На входе глобал вида:
^dish(3)=«КАШИ»
^dish(3,315)=«Каша рисовая вязкая*200*178.2*3.1*4.4*33.7**гр*780»
^dish(3,315,2)=«Вода*161*161»
^dish(3,315,36)=«Крупа рисовая*43.6*43.6»
^dish(3,315,50)=«Масло сливочное*5*5»
^dish(3,316)=«Каша перловая вязкая*200*178.7*4.1*4.6*32.1**пор*4744»
^dish(3,316,2)=«Вода*161*161»
^dish(3,316,34)=«Крупа перловая*43.6*43.6»
^dish(3,316,50)=«Масло сливочное*5*5»
^dish(3,317)=«Каша овсяная вязкая*200*206.5*5.8*6.9*32**пор*6282»
^dish(3,317,2)=«Вода*157*157»
^dish(3,317,33)=«Крупа овсяная*49.0*49.0»
^dish(3,317,50)=«Масло сливочное*5*5»
^dish(3,318)=«Каша геркулесовая вязкая*200*192.2*5.7*6.8*28.6**пор*2436»
^dish(3,318,2)=«Вода*161*160»
^dish(3,318,3)=«Геркулес*43.6*43.6»
^dish(3,318,50)=«Масло сливочное*5*5»
Здесь в одном глобале хранятся объекты нескольких классов: dish.kind — тип блюда, dish.dish — блюдо, dish.product — продукт блюда. Причем структура глобала предопределяет тип отношений между этими классами — parent-child [6].
Особенностью настройки проекции для классов dish.dish и dish.product является синтаксис описания ключей глобала
Вместо имени свойства указывается имя parent класса и, после точки, имя его свойства — идентификатора. Ускоренный процесс создания проекции можно увидеть здесь [7]
Настроенную проекцию Cache сохраняет в экземплярах классов:
Соответственно, создать хранение можно и программным способом. Например, сделать свой мастер [13] создания схемы хранения. В Студии настроенный способ хранения отображается как xml (в Cache 2013.1 автоматически, а в более ранних версиях через меню: Вид — Показать хранение).
Для каждого хранимого класса Caché создает запрос Extent и генерирует программы его выполнения. Сгенерированный код класса может помочь в настройке или отладке проекции (см. метки zExtentExecute, zExtentFetch).
Интересные примеры проекций можно посмотреть в системных классах Caché. Например, вышеперечисленные классы схемы хранения — это проекция на глобал.
Более подробную информацию по настройке проекций можно прочитать в лекции [14] Вадима Федорова со Школы инноваций Intersystems.
Автор: doublefint
Источник [15]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/oop/37506
Ссылки в тексте:
[1] Технологический справочник Caché: http://intersystems.ru/cache/technology/techguide/cache_tech-guide_02.html
[2] A Universal NoSQL Engine, Using a Tried and Tested Technology: http://www.mgateway.com/docs/universalNoSQL.pdf
[3] CacheStorage: http://docs.intersystems.com/cache20131/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_persistence#GOBJ_persistence_pccachestorage
[4] MUMPS: http://ru.wikipedia.org/wiki/MUMPS
[5] GlobalsDB: http://globalsdb.org/
[6] parent-child: http://docs.intersystems.com/cache20131/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_relationships_dep
[7] здесь: http://youtu.be/7-E4KiOJUAg?hd=1
[8] %Dictionary.StorageDefinition: http://docs.intersystems.com/cache20131/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=%25Dictionary.StorageDefinition
[9] %Dictionary.StorageSQLMapDefinition: http://docs.intersystems.com/cache20131/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=%25Dictionary.StorageSQLMapDefinition
[10] %Dictionary.StorageSQLMapSubDefinition: http://docs.intersystems.com/cache20131/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=%25Dictionary.StorageSQLMapSubDefinition
[11] %Dictionary.StorageSQLMapDataDefinition: http://docs.intersystems.com/cache20131/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=%25Dictionary.StorageSQLMapDataDefinition
[12] %Dictionary.StorageSQLMapRowIdSpecDefinition: http://docs.intersystems.com/cache20131/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=%25Dictionary.StorageSQLMapRowIdSpecDefinition
[13] свой мастер: http://docs.intersystems.com/cache20131/csp/docbook/DocBook.UI.Page.cls?KEY=GSTD_Templates#GSTD_interactive
[14] лекции: http://www.intersystems.ru/cache/education/school2003/CustomStorage.zip
[15] Источник: http://habrahabr.ru/post/179523/
Нажмите здесь для печати.