Базовые операции таблиц и сущностей
Лекция 8. Структурированное хранилище данных Windows Azure Table
План:
1. Модель данных в Windows Azure Table
2. Секционирование данных в Windows Azure Table
3. Базовые операции таблиц и сущностей
4. Класс сущностей
5. Создание таблиц в Windows Azure Table
Модель данных в Windows Azure Table
Любое приложение вне зависимости от способа его размещения должно где-то хранить данные. При этом данные могут хранить локально, либо удаленно. "Облачный" способ хранения данных предлагает несколько иной способ. Обратим внимание на следующие особенности, которые необходимо учитывать при переносе традиционной реляционной структуры данных в Table Storage в "облаке":
· Структура данных удаленного хранения должна быть предельно простой. Чем проще структура данных, тем выше производительность доступа к данным нескольких конкурирующих приложений.
· Table Storage подходит для хранения реляционных данных, но само по себе данное хранилище реляционным не является. Это значит, то при переносе реляционной структуры данных в "облако", управлять ограничениями между субъектами хранения нужно будет пользователю.
Windows Azure Table поддерживает:
· Language Integrated Query – LINQ
· ADO.Net Data Services
· REST
· неограниченное число таблиц и сущностей, без ограничения размеров
· целостность каждой сущности
· блокировку обновлений и удалений
· возможность возврата частичных результатов запросов прерванных по времени ожидания, при этом имеется возможность продолжить дальнейшее выполнение запроса.
Для доступа к Windows Azure Table у приложения должна быть учетная запись. После создания учетной записи, пользователю предоставляется секретный ключ, используемый для аутентификации.
Ключевыми понятиями Table Storage являются:
· Таблица – содержит набор сущностей.
· Сущность – логически является строкой в таблице, представляет собой основной элемент данных, хранящихся в таблице. Содержит набор свойств.
· Свойство – Значение, хранимое в сущности.
Проводя аналогии с реляционным подходом, получим следующее: под таблицей понимается коллекция сущностей (Entities), подобных кортежам в реляционном подходе. Сущность же представляет собой набор свойств (Properties). Свойство же является парой "имя (name) - типизированное значение (typed value)". Сущности можно соотнести с полями в таблице в реляционном хранилище.
· ключ секции - свойство ключа таблицы. Используется для распределения по узлам хранения сущностей таблицы.
· ключ строки - свойство ключа таблицы, уникальный идентификатор сущности.
· временная метка - система хранит различные версии одной и той же сущности, для их различения используется временна метка.
· секция - набор сущностей с одинаковыми ключами секции.
Таблица 8.1. Пример:
| Ключ секции
| Ключ строки
| Свойство 1
| ...
| Свойство k
| | Отчетность1
|
| Значение свойства
| ...
| Значение свойства
| Секция 1
| Отчетность1
|
| Значение свойства
| ...
| Значение свойства
| Секция 1
| Документ1
|
| Значение свойства
| ...
| Значение свойства
| Секция 2
| Документ1
|
| Значение свойства
| ...
| Значение свойства
| Секция 2
| Документ1
|
| Значение свойства
| ...
| Значение свойства
| Секция 2
|
· порядок сортировки осуществляется сначала по ключу секции, затем - по ключу строки.
Ограничения таблиц, сущностей и их свойств:
1. Имена свойств таблиц должны состоять только из букв и цифр.
2. Имя таблицы не должно начинаться с цифры.
3. Имена таблиц различают регистры.
4. Длина имени таблицы должна быть в пределах от 3 до 63 символов
5. Сущность может иметь не более 255 свойств
6. Свойства "ключ секции" и "ключ строки" не могут быть больше 1Кб размером.
7. Свойство "временная метка" является ReadOnly.
8. Windows Azure Table не хранит схем, т.е. значения свойств сущностей одной таблицы могут относиться к разным типам данных.
9. Суммарный объем всех данных не может превышать 1Мб
Таблица 8.2. Поддерживаемые WAT типы данных:
| Тип
| Описание
| Binary
| Массив байтов до 64Кб
| Bool
| Булевское значение
| Datetime
| 64-битное значение временного UTC - формата, от 1.1.1600 до 12.31.9999
| Double
| 64-битное действительное число
| GUID
| 128-битный уникальный идентификатор
| Int
| 32-битное целочисленное значение
| Int64
| 64-битное целочисленное значение
| String
| Значение кодировки UTF-16, размером до 64Кб
|
Секционированиe
Главным образом от распределения секций по узлам хранения зависит масштабируемость системы хранения данных.
Система распределяет секции по узлам хранения по результатам истории использования секций, т.е. если ряд секций запрашивается чаще остальных, то система автоматически распределит их по нескольким узлам хранения, распределяя трафик между несколькими серверами. Важно помнить, что при этом объем секции не ограничен размерностью узла хранения.
Кроме того, хранение сущностей одной секции вместе позволяет повысить эффективность кэширования и других методов повышения производительности.
В случае, если операции осуществляются над сущностями одной таблицы и секции приложение может осуществлять несколько операций создания, обновления и удаления для набора сущностей в пределах одного пакетного запроса к системе. При выполнении операции происходит изоляция моментального снимка, вне зависимости от исхода самой операции. Таким образом, все последующие операции, выполняющиеся в это же время, осуществляются над снимком, сделанным до начала операции. Результат транзакции становится доступным только после ее успешного завершения.
Особенности выбора ключа секции
Выбор ключа секции - задача, которая сложнее чем кажется. С одной стороны, размещение сущностей в одной секции позволяет оптимизировать выполнение запросов, с другой - чем больше секций в одной таблице, тем проще для WAT распределить сущности по местам хранения, обеспечивая масштабируемость таблицы.
В связи с этим можно выделить следующие особенности выбора ключа секции:
1. Если планируется использовать запросы над группами сущностей, необходимо подбирать ключ секции таким образом, чтобы все сущности участвующие в запросе находились в одной секции, т.е. необходимо группировать сущности, участвующие в одном запросе.
2. В наиболее частых и важных запросах, помимо прочего следует указывать и ключ секции, поскольку при его отсутствии необходимые сущности будут отбираться просмотром всех секций таблицы.
3. Проверка масштабируемости: нагрузочное тестирование секции таблицы с целью проверки возможности обеспечения секцией необходимой производительности.
Базовые операции таблиц и сущностей
· создание;
· извлечение с применением фильтров;
· обновление (только сущности);
· удаление;
· транзакции над группами сущностей в пределах таблицы и секции;
Расширенные операции над таблицами и сущностями:
· разбиение на страницы;
· обработка конфликтов параллельных обновлений.
В таблице представлены базовые операции таблиц и сущностей и соответствующие им интерфейсы программирования приложений.
Таблица 8.3.
| Операция
| ADO.NET Data Services
| HTTP-команда
| Ресурс
| Описание
| Запрос
| LINQ Query
| GET
| Таблица
| Возвращает список всех таблиц данной учетной записи хранилища. В случае наличия фильтра таблицы возвращаются соответственно фильтру.
| Сущность
| Возвращает все сущности заданной таблицы или подмножество сущностей, если задан фильтр.
| Обновление всей сущности
| UpdateObject & SaveChanges(SaveChangesOptions.ReplaceOnUpdate)
| PUT
| Сущность
| Обновляет значения свойств сущности. Операция PUT замещает всю сущность и может использоваться для удаления свойств.
| Частичное обновление сущности
| UpdateObject & SaveChanges()
| MERGE
| Сущность
| Обновляет значения свойств сущности.
| Создание новой таблицы/ сущности
| AddObject & SaveChanges()
| POST
| Таблица
| Создает новую таблицу в данной учетной записи хранилища.
| Сущность
| Вставляет новую сущность в данную таблицу.
| Удаление таблицы/ сущности
| DeleteObject & SaveChanges()
| DELETE
| Таблица
| Удаляет таблицу в данной учетной записи хранилища.
| Сущность
| Удаляет сущность из данной таблицы.
| Транзакция над группой сущностей
| SaveChanges(SaveChangesOptions.Batch)
| POST
| $batch
| Поддержка транзакции над группой сущностей обеспечивается посредством пакетной операции над сущностями одной таблицы с одинаковым ключом секции. В ADO.NET Data Services опция SaveChanges требует, чтобы запрос выполнялся как одна транзакция.
|
Класс сущностей
Схема таблицы описывается как C#-класс. Такую модель использует ADO.NET Data Services. Схема известна только клиентскому приложению и упрощает доступ к данным. Сервер схему не применяет.
Для примера рассмотрим работу с таблицей контактов - Contact.
Рассмотрим описание сущностей Contact, хранящихся в таблице Contacts. Каждая сущность содержит следующие данные:
1. Группа контактов - Group ;
2. Имя контакта - NameOf ;
3. Дату создания контакта - DateOf ;
4. Адрес электронной почты - Email ;
5. Комментарии - Comment.
Для данной таблицы "Contacts" в качестве ключа секции используется Group, а в качестве ключа строки – Name Of. Partition Key и RowKey – ключи таблицы Contacts, они объявляются посредством атрибута класса DataServiceKey (Ключ сервиса данных). Кроме ключей, в качестве свойств объявлены характерные для данного вида сущностей атрибуты. Все свойства имеют открытые (public) методы считывания и присвоения значения и хранятся в таблице Windows Azure Table. Итак, в примере ниже:
public class Contacts
{
public string PartitionKey { get; set; }
public string RowKey { get; set; }
public datetime DateOf { get; set; }
public String Email { get; set; }
public String Comments { get; set; }
}
Создание таблиц
Далее рассмотрим, как создать таблицу Contacts для учетной записи хранилища. Создание таблицы аналогично созданию сущности в основной таблице "Tables". Эта основная таблица определена для каждой учетной записи хранилища, и имя каждой таблицы, используемой учетной записью хранения, должно быть зарегистрировано в основной таблице. Описание класса основной таблицы приведено ниже, где свойство TableName (Имя таблицы) представляет имя создаваемой таблицы.
public class TableStorageTable
{ public string TableName { get; set; }
}
Фактическое создание таблицы происходит следующим образом:
// Uri сервиса: "http://<Account>.table.core.windows.net/"
DataServiceContext context = new DataServiceContext(serviceUri);
TableStorageTable table = new TableStorageTable("Contacts ");
// Создаем новую таблицу, добавляя новую сущность
// в основную таблицу "Tables"
context.AddObject("Tables", table);
// результатом вызова SaveChanges является отклик сервера
DataServiceResponse response = context.SaveChanges();
serviceUri – это uri сервиса таблицы, http://<Здесь указывается имя учетной записи>.table.core.windows.net/.DataServiceContext (Контекст сервиса данных) – один из основных классов сервиса данных ADO.NET, представляющий контекст времени выполнения для сервиса. Он обеспечивает API для вставки, обновления, удаления и запроса сущностей с помощью либо LINQ, либо RESTful URI и сохраняет состояние на стороне клиента. Более подробный пример работы с Windows Azure Table, начиная от создания приложения, будет рассмотрен в рамках соответствующего практического занятия.
Список материалов для самостоятельного изучения
Обзор Windows Azure Table
1. http://blogs.msdn.com/b/jnak/archive/2010/01/06/walkthrough-windows-azure-table-storage-nov-2009-and-later.aspx
Windwows Azure Table - подробный обзор
1. http://msdn.microsoft.com/ru-ru/library/ee872426.aspx
2. http://www.bandgap.cs.rice.edu/classes/comp410/resources/Using%20Azure/Using%20Azure%20Table%20Storage.aspx
Программирование Windows Azure Table
1. http://windowsclient.net/blogs/anshulee/archive/2010/05/27/best-practices-for-ado-net-dataservices-when-using-azure-table-storage.aspx
Контрольные вопросы
1. Что такое Windows Azure Table?
2. Что такое секционирование данных и каково его назначеение?
3. Как организуется доступ к Windows Azure Table?
4. Перечислите базовые операции таблиц и сущностей в Windows Azure Table.
5. Что такое ключ секции Windows Azure Table?
6. В чем заключается контроль версий в Windows Azure Table?
7. Укажите свойства ключа секции и особенности его выбора.
8. Как в Windows Azure Table создать класс сущностей? Приведите пример создания класс сущностей.
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|