Разделы презентаций


Работа с существующими глобалами через объекты и SQL

Содержание

СодержаниеCacheStorageОбзор стратегий храненияCacheSQLStorageCustomStorageПример CacheSQLStorage

Слайды и текст этой презентации

Слайд 1Работа с существующими глобалами через объекты и SQL
Вадим Федоров
InterSystems Corporation

Работа с существующими глобалами через объекты и SQLВадим ФедоровInterSystems Corporation

Слайд 2Содержание
CacheStorage
Обзор стратегий хранения
CacheSQLStorage
CustomStorage
Пример CacheSQLStorage

СодержаниеCacheStorageОбзор стратегий храненияCacheSQLStorageCustomStorageПример CacheSQLStorage

Слайд 3Сравнение стратегий хранений
 Обеспечивается Caché
 Реализуется разработчиком

Сравнение стратегий хранений	Обеспечивается Caché	Реализуется разработчиком

Слайд 4 CacheStorage идеально подходит для новых приложений
CacheSQLStorage применяется, когда

с существующими глобалами можно и нужно работать с помощью SQL
CustomStorage

используется тогда, когда нельзя работать с глобалами через SQL и нужно реализовывать собственную сложную логику для обеспечения объектного доступа

Выбираем стратегию хранения

CacheStorage идеально подходит для новых приложений CacheSQLStorage применяется, когда с существующими глобалами можно и нужно работать

Слайд 5Содержание
CacheStorage
Обзор стратегий хранения
CacheSQLStorage
CustomStorage
Пример CacheSQLStorage

СодержаниеCacheStorageОбзор стратегий храненияCacheSQLStorageCustomStorageПример CacheSQLStorage

Слайд 6Обзор CacheStorage
Объектное API
Приложение
%LoadData
%SaveData
%DeleteData
ObjectScript
ObjectScript
ObjectScript
Объектная реализация
Глобалы

Обзор CacheStorageОбъектное APIПриложение%LoadData%SaveData%DeleteDataObjectScriptObjectScriptObjectScriptОбъектная реализацияГлобалы

Слайд 7 CacheStorage генерирует глобалы, в которых используется $ListBuild
Уникальный идентификатор (IDKey

/ PrimaryKey) может автоматически сгенерирован Cache или задан разработчиком вручную

Это влияет на структуру глобалов
Можно управлять хранением свойств классов в глобалах
Это влияет на структуру значений глобалов

Информация о CacheStorage

CacheStorage генерирует глобалы, в которых используется $ListBuildУникальный идентификатор (IDKey / PrimaryKey) может автоматически сгенерирован Cache или

Слайд 8Содержание
CacheStorage
Обзор стратегий хранения
CacheSQLStorage
CustomStorage
Пример CacheSQLStorage

СодержаниеCacheStorageОбзор стратегий храненияCacheSQLStorageCustomStorageПример CacheSQLStorage

Слайд 9Обзор CacheSQLStorage
Объектное API
Приложение
%LoadData
%SaveData
%DeleteData
SELECT
INSERT / UPDATE
DELETE
SQL Реализация
Глобалы

Обзор CacheSQLStorageОбъектное APIПриложение%LoadData%SaveData%DeleteDataSELECTINSERT / UPDATEDELETESQL РеализацияГлобалы

Слайд 10 Создайте Persistent-класс
Добавьте свойства в класс
Определите свойство (свойства),

которое будет идентификатором класса (IDKey / Primary Key)
Создайте стратегию

хранения выставив соответствие между свойствами класса и данными глобала

Обзор CacheSQLStorage

Создайте Persistent-класс Добавьте свойства в класс Определите свойство (свойства), которое будет идентификатором класса (IDKey / Primary

Слайд 11При работе через объекты будут вызываться триггеры (при использовании CacheStorage

они не вызываются)!
Поддерживается ссылка и Parent-Child отношение для связи классов
Особенности

CacheSQLStorage
При работе через объекты будут вызываться триггеры (при использовании CacheStorage они не вызываются)!Поддерживается ссылка и Parent-Child

Слайд 12 CacheSQLStorage обычно создается:
Программистом
Программой конвертации из F-DBMS
Программой конвертации из KB-SQL
Создание

CacheSQLStorage

CacheSQLStorage обычно создается:ПрограммистомПрограммой конвертации из F-DBMSПрограммой конвертации из KB-SQLСоздание CacheSQLStorage

Слайд 13 Не ко всем структурам глобалов можно настроить CacheSQLStorage так

чтобы обеспечить полный SQL-доступ (Read/Write/Delete)
Некоторые структуры подходят только для чтения

через SQL (SELECT)
Чтобы обеспечитьобновление иногда необходима дополнительная работа, кроме установки Mapping

Обеспечение SQL-доступа

Не ко всем структурам глобалов можно настроить CacheSQLStorage так чтобы обеспечить полный SQL-доступ (Read/Write/Delete)Некоторые структуры подходят

Слайд 14Различают следующие виды CacheSQLStorage карт:
Данные (MasterMap): Должны быть определены

все поля
Индексы: Должны быть определены некоторые поля
Full (по умолчанию):

Все данные попадают в индексы
Conditional: Данные попадают в индексы, если выполняется
Nonnull: Нулевые значения (Null values) не попадают в индексы

Виды карт

Различают следующие виды CacheSQLStorage карт: Данные (MasterMap): Должны быть определены все поля Индексы: Должны быть определены некоторые

Слайд 15 IDKey индексы определяют уникальные идентификаторы для объектов
Primary Key

индексы определяют уникальные идентификаторы для SQL
IDKey и Primary Key

индексы обычно строятся по одним и тем же полям

ID и Primary Key

IDKey индексы определяют уникальные идентификаторы для объектов Primary Key индексы определяют уникальные идентификаторы для SQL IDKey

Слайд 16Индексы (subscripts) карт обычно эквивалентны индексам глобалов
Индексы карт используется

для формирования кода, перебирающего записи таблицы.
Поддерживаются следующие типы

индексов (subscripts) :
Sub: Основанный на «стандартном» индексе глобалов
Piece: Основанный на определенной позиции (используется разделитель)
Global: Основанный на данных, хранящихся в нескольких глобалах
Other: Основанный на пользовательском коде

Индексы глобалов (Subscripts)

Индексы (subscripts) карт обычно эквивалентны индексам глобалов Индексы карт используется для формирования кода, перебирающего записи таблицы. Поддерживаются

Слайд 17 Существует тесная связь между IDKey и RowID для карт

данных, но не для карт индексов
A RowID используется

для уникальной идентификации данных в глобале, на основе индекса глобала, определенного в карте
Например, для глобала:
^Person(PersonID,“Cars”,CarID)=“Make^Model^Year”
2 поля будут нашими RowID:
PersonID: хранится на первом уровне {L1}
CarID: хранится на третьем уровне {L3}

RowID

Существует тесная связь между IDKey и RowID для карт данных, но не для карт индексов A

Слайд 18 Когда определены индексы глобала, нужно определить хранение свойств класса

в глобале
Можно определить дополнительные узлы индекса глобала (только литералы)

Можно использовать $Piece или $ListBuild

Карты данных

Когда определены индексы глобала, нужно определить хранение свойств класса в глобале Можно определить дополнительные узлы индекса

Слайд 19 Map Name: Имя карты.
Map Type: Данные или Индексы

(Data or Index)
Global Name: Имя глобала (^…) или локального

массива
Node Structure: Структура узла: $Piece или $List
Population Type: Тип заполнения
Population %: Оценка предполагаемого количества рядов в индексе
Condition: Выражение определяющее условие. Например, {Name}‘=“”
Conditional Fields: Поля, по которым будет проверяться условие
Conditional with hostvars: Булева значение, которое влияет на использование индекса кэшированными запросами
Row Reference: Позволяет программистам переопределить сгенерированный RowID

Подробности редактирования карт

Map Name: Имя карты. Map Type: Данные или Индексы (Data or Index) Global Name: Имя глобала

Слайд 20 Access Type: Тип доступа. Sub, Piece, Global или Other

Delimiter: Разделитель. Используется, если тип доступа Piece
Expression: Выражение. Обычно

{поле}, “string” или число, или определенная позиция
Loop Init Value: Не включаемое значение, используемое для генерации кода обхода
Start Value: Включаемое значение, используемое в сгенерированном коде обхода
Stop Value: Значение, при котором обход останавливается
Stop Expression: Выражение, при котором обход останавливается, например, {L1}>200
Data Access: Доступ к данным. Переопределяет контекст текущего выражения для вычисления значения текущего уровня доступа (Override the context of the current access-level’s value expression)
Next Code: Используется программистом для переопределения генерируемого кода обхода
Invalid Conditions: Выражения, используемые для исключения рядов из карты. Например, {L1}<1
Access Variables: Переменные, используемые программистом, для обеспечения обеспечения уникальности имен

Подробности редактирования индексов глобалов

Access Type: Тип доступа. Sub, Piece, Global или Other Delimiter: Разделитель. Используется, если тип доступа Piece

Слайд 21 RowID: Позиция поля в спецификации RowID
Field: Имя

поля, состовляющего часть RowID
Expression: Уровень внутри определения индексов глобала

(subscript definition). Например, {L2} или {L6}

Подробности редактирования RowID

RowID: Позиция поля в спецификации RowID Field: Имя поля, состовляющего часть RowID Expression: Уровень внутри определения

Слайд 22 Field: Имя поля
Node: Дополнительный индекс глобала (только литерал),

где находится поле
Piece: Позиция в строке $Piece
Delimiter: Разделитель.

Например, “^” или $c(1)

Подробности редактирования данных

Field: Имя поля Node: Дополнительный индекс глобала (только литерал), где находится поле Piece: Позиция в строке

Слайд 23Содержание
CacheStorage
Обзор стратегий хранения
CacheSQLStorage
CustomStorage
Пример CacheSQLStorage

СодержаниеCacheStorageОбзор стратегий храненияCacheSQLStorageCustomStorageПример CacheSQLStorage

Слайд 24Обзор CustomStorage
Объектные API
Прилжение
%LoadData
%SaveData
%DeleteData
?
?
?
Собственная реализация
Глобалы

Обзор CustomStorageОбъектные APIПрилжение%LoadData%SaveData%DeleteData???Собственная реализацияГлобалы

Слайд 25 Создайте Persistent-класс
Добавьте свойства в класс
Определите свойство (свойства),

которое будет идентификатором класса (IDKey / Primary Key)
Создайте стратегию хранения

выставив соответствие между свойствами класса и данными глобала
Реализуйте код доступа к объектам: %LoadData, %SaveData, %DeleteData

Обзор CustomStorage

Создайте Persistent-класс Добавьте свойства в класс Определите свойство (свойства), которое будет идентификатором класса (IDKey / Primary

Слайд 26 Для того чтобы использовать SQL с CustomStorage, необходимо определить

специальный параметр класса:
Parameter SQLENABLED = 1;
Mapping the SQL

portion with CustomStorage is identical to the methods used for CacheSQLStorage

CustomStorage и SQL

Для того чтобы использовать SQL с CustomStorage, необходимо определить специальный параметр класса: 		Parameter SQLENABLED = 1;

Слайд 27 Для того чтобы использовать объекты с CustomStorage, необходимо выполнить

следующее:
Реализовать %LoadData, %SaveData, %DeleteData
В Вашем коде Вы должны

управлять :
ID объектов на диске и в памяти (с помощью метода %IdSet())
Переменными экземпляров свойств (имена свойств имеют первые символы “i%” )
Concurrency
Уникальностью данных
Ограничениями, накладываемыми внешних ключей (Foreign key constraints)

CustomStorage и объекты

Для того чтобы использовать объекты с CustomStorage, необходимо выполнить следующее: Реализовать %LoadData, %SaveData, %DeleteData В Вашем

Слайд 28 Код, реализованный в %LoadData(), будет выполняться каждый раз, когда

загружается объект, обычно после вызова %Open() и %OpenId()
Пример %LoadData:

Method %LoadData(id As %Library.String) As %Library.Status
{
Set i%SSN = id
Set i%Name = $Piece(^P(id),“^”,1)
Set i%DOB = $Piece(^P(id),“^”,2)

Quit $$$OK
}

%LoadData

Код, реализованный в %LoadData(), будет выполняться каждый раз, когда загружается объект, обычно после вызова %Open() и

Слайд 29 Код, реализованный в %SaveData(), будет выполняться каждый раз, когда

сохраняется объект, в результате вызова метода %Save()
Пример %SaveData:

Method %SaveData(id As %Library.String) As %Library.Status
{
Lock ^P(id):5 If '$Test Quit $$$ERROR($$$LockFailedToAcquireExclusive)

Set id = i%SSN
Do ..%IdSet(id)

Set $Piece(^P(id),”^”,1) = i%Name
Set $Piece(^P(id),”^”,2) = i%DOB

Quit $$$OK
}

%SaveData

Код, реализованный в %SaveData(), будет выполняться каждый раз, когда сохраняется объект, в результате вызова метода %Save()

Слайд 30 Код, реализованный в %DeleteData, будет выполняться каждый раз, когда

объект будет удаляться, в результате вызова %Delete() или %DeleteId()
Пример %DeleteData:

Method %DeleteData(id As %String, concurrency as %Integer) As %Status
{
Lock ^P(id):5 If '$Test Quit $$$ERROR($$$LockFailedToAcquireExclusive)

Kill ^P(id)

Quit $$$OK
}

%DeleteData

Код, реализованный в %DeleteData, будет выполняться каждый раз, когда объект будет удаляться, в результате вызова %Delete()

Слайд 31Содержание
CacheStorage
Обзор стратегий хранения
CacheSQLStorage
CustomStorage
Пример CacheSQLStorage

СодержаниеCacheStorageОбзор стратегий храненияCacheSQLStorageCustomStorageПример CacheSQLStorage

Слайд 32Phone Numbers
Doctor Visits
Пример модели данных
Есть два отношения Parent-Children:
Пациент

может иметь несколько номеров телефона
Пациент может посещать доктора несколько

раз
Удаление пациента удаляет его номера телефонов и визиты к врачу

Address

Patient

Phone NumbersDoctor VisitsПример модели данных Есть два отношения Parent-Children: Пациент может иметь несколько номеров телефона Пациент может

Слайд 33^P(SSN) = “Name^DOB^Phone1~Phone2~...~PhoneN^Company”
^P(SSN,“Address”) = “City^PostalCode^Country”
^P(SSN,“Visits”,VisitDate,VisitTime) = “Symptom^Payment”
Пример структуры данных глобала
^P(“211-22-1222”)

= “Smith,John^39873^718-317-3312~917-225-2213^AT&T”
^P(“211-22-1222”,“Address”) = “New York^10312^USA”
^P(“211-22-1222”,“Visits”,58809,43200) = “Cough^15.00”
^P(“211-22-1222”,“Visits”,58820,57900) = “Sore Throat^50.00”

^P(SSN) = “Name^DOB^Phone1~Phone2~...~PhoneN^Company”^P(SSN,“Address”) = “City^PostalCode^Country”^P(SSN,“Visits”,VisitDate,VisitTime) = “Symptom^Payment”Пример структуры данных глобала^P(“211-22-1222”) = “Smith,John^39873^718-317-3312~917-225-2213^AT&T”^P(“211-22-1222”,“Address”) = “New York^10312^USA”^P(“211-22-1222”,“Visits”,58809,43200) = “Cough^15.00”^P(“211-22-1222”,“Visits”,58820,57900)

Слайд 34^PI(Name,SSN) = “”
Пример структуры индексов глобала
^PI(“Smith,John”,“211-22-1222”) = “”

^PI(Name,SSN) = “”Пример структуры индексов глобала^PI(“Smith,John”,“211-22-1222”) = “”

Слайд 35Создаем Persistent-класс

Создаем Persistent-класс

Слайд 36Добавляем свойства

Добавляем свойства

Слайд 37Выбираем уникальный идентификатор
Базируется на одном поле: SSN

Выбираем уникальный идентификатор Базируется на одном поле: SSN

Слайд 38Определяем ID / Primary Key индекс
Основан на свойстве SSN

Не изменяйте collation индекса

Определяем ID / Primary Key индекс Основан на свойстве SSN Не изменяйте collation индекса

Слайд 39Создаем Storage

Создаем Storage

Слайд 40Создаем карту данных
Имя карты не может содержать символ «пробел»

Создаем карту данных Имя карты не может содержать символ «пробел»

Слайд 41Определяем индексы глобала
Первый уровень индекса глобала - SSN

Определяем индексы глобала Первый уровень индекса глобала - SSN

Слайд 42Определяем Row ID
Первый Row ID 1 основан на SSN,

которое хранится в первом уровне индекса глобала

Определяем Row ID Первый Row ID 1 основан на SSN, которое хранится в первом уровне индекса глобала

Слайд 43Определяем свойства
Введите разделитель и дополнительную информацию

Определяем свойства Введите разделитель и дополнительную информацию

Слайд 44Срздаем карту индексов
Выберите тип заполнения ‘full’

Срздаем карту индексов Выберите тип заполнения ‘full’

Слайд 45Определяем индексы глобала индексов

Определяем индексы глобала индексов

Слайд 46Определяем Row ID индекса
Первый Row ID основан на SSN,

который хранится в уровне 2 индекса глобала

Определяем Row ID индекса Первый Row ID основан на SSN, который хранится в уровне 2 индекса глобала

Слайд 47Сохраняем и компилируем класс

Сохраняем и компилируем класс

Слайд 48Создаем дочернюю таблицу PhoneList
Этот класс тоже Persistent

Создаем дочернюю таблицу PhoneListЭтот класс тоже Persistent

Слайд 49Создаем отношение Parent-Child
Отношения (Relationship) – специальный класс свойств
Кроме

определения свойства в этом классе (PatientRef), Вы должны определить другую

сторону отношения (PhoneNumbers)
Создаем отношение Parent-Child Отношения (Relationship) – специальный класс свойств Кроме определения свойства в этом классе (PatientRef), Вы

Слайд 50Добавляем остальные свойства
Кроме свойства, Вы должны определить свойство для

представления позиции во встроенной разделенной (Counter)

Добавляем остальные свойства Кроме свойства, Вы должны определить свойство для представления позиции во встроенной разделенной (Counter)

Слайд 51Выбираем уникальный идентификатор
Наш идентификатор будет строится на поле Counter

Выбираем уникальный идентификатор Наш идентификатор будет строится на поле Counter

Слайд 52Определяем индекс ID / Primary Key
Задайте индекс по свойству

Counter
Не модифицируйте collation
Свойство PatientRef неявно часть IDKey /

Primary Key
Определяем индекс ID / Primary Key Задайте индекс по свойству Counter Не модифицируйте collationСвойство PatientRef неявно часть

Слайд 53Создаем Storage

Создаем Storage

Слайд 54Создаем карту данных
Имя карты не может содержать символ «пробел»

Создаем карту данных Имя карты не может содержать символ «пробел»

Слайд 55Определяем индексы глобала
Первый уровень индекса глобала основан на Training.Patient.SSN

Второй уровень индекса глобала основан на “^” разделителе, используя третью

позицию
Третий уровень индекса глобала основан на “~” разделителе, используя свойство Counter для позиции
Определяем индексы глобала Первый уровень индекса глобала основан на Training.Patient.SSN Второй уровень индекса глобала основан на “^”

Слайд 56Определяем Row ID
Row ID 1 основан на Training.Patient.SSN, которое

хранится на первом уровне индекса глобала
Row ID 2 основан

на Counter, которое хранится на первом уровне индекса глобала
Определяем Row ID Row ID 1 основан на Training.Patient.SSN, которое хранится на первом уровне индекса глобала Row

Слайд 57Определяем свойства
Внесите только свойство HomePhone

Определяем свойства Внесите только свойство HomePhone

Слайд 58Сохраняем и компилируем класс

Сохраняем и компилируем класс

Слайд 59Создаем дочернюю таблицу Visit
Этот класс тоже Persistent

Создаем дочернюю таблицу Visit Этот класс тоже Persistent

Слайд 60Создаем отношение Parent-Child
Кроме определения свойства в этом классе (PatientRef),

Вы должны определить другую сторону отношения (Visits)

Создаем отношение Parent-Child Кроме определения свойства в этом классе (PatientRef), Вы должны определить другую сторону отношения (Visits)

Слайд 61Добавляем остальные свойства

Добавляем остальные свойства

Слайд 62Выбираем уникальный идентификатор
В этот раз идентификатор будет строиться по 2

полям: VisitDate и VisitTime

Выбираем уникальный идентификаторВ этот раз идентификатор будет строиться по 2 полям: VisitDate и VisitTime

Слайд 63Определяем индекс ID / Primary Key
Постройте индекс по свойствам

VisitDate и VisitTime
Не изменяйте collation
Свойство PatientRef неявно часть

IDKey / Primary Key
Определяем индекс ID / Primary Key Постройте индекс по свойствам VisitDate и VisitTime Не изменяйте collation Свойство

Слайд 64Создаем Storage

Создаем Storage

Слайд 65Создаем карту данных
Имя карты не может содержать символ «пробел»

Создаем карту данных Имя карты не может содержать символ «пробел»

Слайд 66Определяем индексы глобала
Первый уровень индекса глобала основан на Training.Patient.SSN

Второй уровень индекса глобала основан на литерале “Visits”
Третий уровень

индекса глобала основан на VisitDate
Четвертый уровень индекса глобала основан на VisitTime
Определяем индексы глобала Первый уровень индекса глобала основан на Training.Patient.SSN Второй уровень индекса глобала основан на литерале

Слайд 67Определяем Row ID
Row ID 1 основан на свойстве Training.Patient.SSN,

которое хранится на первом уровне индекса глобала
Row ID 2

основан на свойстве VisitDate, которое хранится на третьем уровне индекса глобала
Row ID основан на свойстве VisitTime, которое хранится на четвертом уровне индекса глобала

Определяем Row ID Row ID 1 основан на свойстве Training.Patient.SSN, которое хранится на первом уровне индекса глобала

Слайд 68Определяем свойства

Определяем свойства

Слайд 69Сохраняем и компилируем класс

Сохраняем и компилируем класс

Слайд 70Работа с существующими глобалами через объекты и SQL
Вадим Федоров
InterSystems Corporation

Работа с существующими глобалами через объекты и SQLВадим ФедоровInterSystems Corporation

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика