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

Презентация:



Advertisements
Похожие презентации
Triggers для mysql. Что есть триггер? Триггер - это хранимая процедура особого типа, исполнение которой обусловлено наступлением определенного события.
Advertisements

База данных База данных – это конкретная предметная область, описанная с помощью таблиц.
Вадим Думбравану руководитель проектов D7. ORM. Object-relational mapping Недостатки текущего похода в API На каждую сущность программируется свой GetList,
Лекция 3 Домены Ограничения на значения столбцов Создание, изменение и удаление таблиц Ключи и ссылочная целостность Защита таблиц.
СУБД Access Запросы Автор: Тутыгин В.С.. Назначение запросов Запросы обеспечивают простой доступ к определенному подмножеству записей одной или нескольких.
Что такое связи между таблицами В реляционной базе данных связи позволяют избежать избыточности данных. Например, в ходе создания базы данных, содержащей.
Коллекции классов Лекция 12. С помощью коллекций вместо создания структур данных программист использует готовые структуры данных, не заботясь об их реализации.
Основы SQL Запросы к базе данных. Что такое база данных SQL? SQL (Structured Query Language - «Структурированный язык запросов») - универсальный компьютерный.
ДАЛЕЕ БАЗА ДАННЫХ ACCESS Проектирование базы данных Создание базы данных Создание базы данных без помощи мастера Таблицы Создание таблицы в режиме конструктора.
Обеспечение целостности данных Процедурное. Хранимые процедуры Хранимые процедуры пишутся на специальном встроенном языке программирования, они могут.
Выполнение запросов, создание и редактирование отчета MS Access.
Презентация. Система управления базами данных (СУБД) совокупность программных и лингвистических средств общего или специального назначения, обеспечивающих.
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
Выражения унарные (унарный минус) арифметические (+, -, *, /) сравнения (, =, =, , LIKE, BETWEEN...) конкатенации (||) логические (NOT, AND, OR)
Общие сведения о Microsoft Access. позволяет хранить большие массивы данных, обрабатывать их, автоматизировать часто выполняемые операции, разрабатывать.
PL/SQL Триггер блок PL/SQL, выполняемый неявно каждый раз, когда происходит конкретное событие.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Автор презентации: Парфенова Наталья Владимировна Место работы: ГБОУ СПО «МК 5 ДЗМ» г.Москва Должность автора: преподаватель информатики.
Object Relational Mapping (ORM) Объектно-реляционное отображение.
Ресурсы WPF Два типа ресурсов WPF: объектные ресурсы (object resource) – определенный.NET-объект, который можно использовать многократно; ресурсы сборки.
Транксрипт:

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

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

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

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

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

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

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

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

Обзор CacheSQLStorage Объектное API Приложение Приложение %LoadData%LoadData %SaveData%SaveData %DeleteData%DeleteData SELECTSELECT INSERT / UPDATE DELETEDELETE SQL Реализация Глобалы Глобалы

Создайте Persistent-класс Добавьте свойства в класс Определите свойство (свойства), которое будет идентификатором класса (IDKey / Primary Key) Создайте стратегию хранения выставив соответствие между свойствами класса и данными глобала Обзор CacheSQLStorage

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

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

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

Различают следующие виды CacheSQLStorage карт: Данные (MasterMap): Должны быть определены все поля Индексы: Должны быть определены некоторые поля Full (по умолчанию): Все данные попадают в индексы Conditional: Данные попадают в индексы, если выполняется Nonnull: Нулевые значения (Null values) не попадают в индексы Виды карт

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

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

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

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

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 Подробности редактирования карт

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-levels value expression) Next Code: Используется программистом для переопределения генерируемого кода обхода Invalid Conditions: Выражения, используемые для исключения рядов из карты. Например, {L1}

RowID: Позиция поля в спецификации RowID Field: Имя поля, составляющего часть RowID Expression: Уровень внутри определения индексов глобала (subscript definition). Например, {L2} или {L6} Подробности редактирования RowID

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

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

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

Создайте Persistent-класс Добавьте свойства в класс Определите свойство (свойства), которое будет идентификатором класса (IDKey / Primary Key) Создайте стратегию хранения выставив соответствие между свойствами класса и данными глобала Реализуйте код доступа к объектам: %LoadData, %SaveData, %DeleteData Обзор CustomStorage

Для того чтобы использовать SQL с CustomStorage, необходимо определить специальный параметр класса: Parameter SQLENABLED = 1; Mapping the SQL portion with CustomStorage is identical to the methods used for CacheSQLStorage CustomStorage и SQL

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

Код, реализованный в %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

Код, реализованный в %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

Код, реализованный в %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

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

Phone Numbers Doctor Visits Пример модели данных Есть два отношения Parent-Children: Пациент может иметь несколько номеров телефона Пациент может посещать доктора несколько раз Удаление пациента удаляет его номера телефонов и визиты к врачу AddressAddress Patient

^P(SSN) = Name^DOB^Phone1~Phone2~...~PhoneN^Company ^P(SSN,Address) = City^PostalCode^Country ^P(SSN,Visits,VisitDate,VisitTime) = Symptom^Payment Пример структуры данных глобала ^P( ) = Smith,John^39873^ ~ ^AT&T ^P( ,Address) = New York^10312^USA ^P( ,Visits,58809,43200) = Cough^15.00 ^P( ,Visits,58820,57900) = Sore Throat^50.00

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

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

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

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

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

Создаем Storage

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

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

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

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

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

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

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

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

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

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

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

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

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

Создаем Storage

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

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

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

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

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

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

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

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

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

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

Создаем Storage

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

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

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

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

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

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