Особенности создания и работы с реляционным хранилищем данных - Введение в облачные решения Microsoft

Как мы уже говорили в лекциях, хранилище Windows Azure, помимо прочего, подходит для хранения реляционных данных, для этого используются возможности Windows Azure Table. Однако, само по себе, табличное хранилище Windows Azure не хранит данные в реляционном виде. Возникает вопрос, каким образом возможно хранить реляционную структуру и как обеспечить миграцию данных?

Ответов на данные вопросы может быть множество. То как вы решите переносить существующую реляционную структуру данных в облако, зависит целиком от вас самих. Мы продемонстрируем самый простой и очевидный способ - построчное чтение данных из реляционной БД и запись их в таблицу Windows Azure, что и будет целью данной практической работы.

Во-первых, нам понадобится реляционная база данных. В нашей базе будут храниться 3 взаимосвязанные сущности - Адрес, Фирма и Сотрудник.

В данной лабораторной работе мы использовали SQL Management Studio для соединения с базой sqlexpress и выполнения запросов.

Создадим базу данных при помощи запроса 16.1

Create database azureexample

Листинг 16.1.

Теперь необходимо создать таблицы, связи между ними и заполнить их тестовым набором данных. Вы можете проделать это самостоятельно, а можно просто выполнить нижеследующий зарос:

Use azureexample

Create table Address(

AddresID int identity(1,1) primary key,

Country nvarchar(max),

City nvarchar(max),

Street nvarchar(max),

House int

)

Create table Firm(

FirmID int identity(1,1) primary key,

NameOf nvarchar(max),

Telephone nvarchar(10),

Email nvarchar(max),

AddressKey int not null

)

Create table Employee(

EmployeeID int identity(1,1) primary key,

FirstName nvarchar(max),

LastName nvarchar(max),

Telephone nvarchar(10),

FirmKey int

)

Alter table dbo. Firm add constraint

FK_Firm_Address foreign key

(

AddressKey

) references dbo. Address

(

AddresID

) on update no action

On delete no action

Alter table dbo. Employee add constraint

FK_Employee_Firm foreign key

(

FirmKey

)

References dbo. Firm

(

FirmID

)

On update no action

On delete no action

Insert into Address

Values ('RF', 'Tomsk', 'Evergreen Terrace', '247')

Insert into Firm

Values ('Firm1', 'xxx-xx-xx', ' \n Этот адрес e-mail защищен от спам-ботов. Чтобы увидеть его, у Вас должен быть включен Java-Script ', '1')

Insert into Firm

Values ('Firm2', 'xxx-xx-xx', ' \n Этот адрес e-mail защищен от спам-ботов. Чтобы увидеть его, у Вас должен быть включен Java-Script ', '1')

Insert into Employee

Values ('Ivan', 'Ivanov', 'x-xxx-xx','1')

Insert into Employee

Values ('Victor', 'Romanov', 'x-xxx-xx','1')

Insert into Employee

Values ('Alex', 'Petrov', 'x-xxx-xx','2')

Таким образом мы получили три таблицы. Диаграмма данных созданной базы представлена ниже:

Рис. 16.1.

Теперь необходимо решить, каким образом данная реляционная структура может быть перенесена в таблицу. Как вам известно из лекции, таблицу Windows Azure можно соотнести с коллекцией взаимосвязанных сущностей, если проводить аналогии с реляционными базами данных. В то время, как строки таблиц Windows Azure, по сути являются экземплярами конкретных сущностей.

Мы предлагаем следующее очевидное решение:

Создать Windows Azure таблицу "Relational", которая будет содержать в себе сущности Address, Firm и Employee

Ключ секции будет указывать на соответствие строки таблицы Azure экземпляру сущности реляционной БД, т. е. для всех сотрудниковключ секции будет - "Employee"

Значения атрибутов - ключей в реляционных таблицах будут являться значениями RowKey для таблицы "Relational", такими образом пара ключ секции - ключ строки будет являться уникальным идентификатором однозначно указывающим на принадлежность Azure - строки конкретной сущности исходной БД и определяющим экземпляр сущности

Значения остальных атрибутов будут перенесены без изменений.

Мы не видим необходимости в создании нового VS - проекта, поэтому просто изменим WorkerRole. cs проекта, созданного в рамках предыдущей практической работы. А именно, метод Run, чей листинг представлен ниже:

CloudStorageAccount. SetConfigurationSettingPublisher(

(configName, configSettingPublisher) =>

{

Var connectionString =

RoleEnvironment. GetConfigurationSettingValue(configName);

ConfigSettingPublisher(connectionString);

}

);

CloudStorageAccount account = CloudStorageAccount. FromConfiguration Setting("DataConnectionString");

//создание таблицы Windows Azure Table

CloudTableClient _tc = null;

_tc = account. CreateCloudTableClient();

_tc. CreateTableIfNotExist("Relational");

Context context = new Context(account. TableEndpoint, account. Credentials);

//определение параметров подключения к БД, измените строку подключения

//соответствующим образом, для соединения с вашим sql - сервером

SqlConnection conn = new SqlConnection("Data Source=saigon sqlexpress;

Initial Catalog=azureexample; Integrated Security=true;");

//импорт данных из таблицы Address

//указываем команду для чтения данных из базы

SqlCommand cmd = new SqlCommand("SELECT * FROM Address", conn);

Conn. Open();

SqlDataReader adr = cmd. ExecuteReader();

While (adr. Read())

{

//в параметрах метода AddObject указывает имя таблицы и определяем новую сущность класс //Address

Context. AddObject("Relational", new Address

{

PartitionKey = "Address",

RowKey = adr["AddresID"].ToString(),

Country = adr["Country"].ToString(),

City = adr["City"].ToString(),

Street = adr["Street"].ToString(),

House = Convert. ToInt32(adr["House"].ToString())

});

Context. SaveChanges();

}

Adr. Close();

//импорт данных из таблицы Firm

Cmd. CommandText = "SELECT * FROM Firm";

SqlDataReader frm = cmd. ExecuteReader();

While (frm. Read())

{

Context. AddObject("Relational", new Firm

{

PartitionKey = "Firm",

RowKey = frm["FirmID"].ToString(),

Nameof = frm["NameOf"].ToString(),

Telephone = frm["Telephone"].ToString(),

Email = frm["Email"].ToString(),

Adresskey = Convert. ToInt32(frm["AddressKey"].ToString())

});

Context. SaveChanges();

}

Frm. Close();

//импорт данных из таблицы Employee

Cmd. CommandText = "SELECT * FROM Employee";

SqlDataReader emp = cmd. ExecuteReader();

While (emp. Read())

{

Context. AddObject("Relational", new Employee

{

PartitionKey = "Employee",

RowKey = emp["EmployeeID"].ToString(),

Firstname = emp["FirstName"].ToString(),

Lastname = emp["LastName"].ToString(),

Telephone = emp["Telephone"].ToString(),

Firmkey = Convert. ToInt32(emp["FirmKey"].ToString())

});

Context. SaveChanges();

}

Emp. Close();

Conn. Close();

Кроме того, нам необходимо создать классы - соответствующие сущностям реляционной базы данных, а также класс - контекст.

Класс Address. cs

Class Address: TableServiceEntity

{

Public String country { get; set; }

Public String city { get; set; }

Public String street { get; set; }

Public int house { get; set; }

}

Класс Firm. cs

Class Firm: TableServiceEntity

{

Public String nameof { get; set; }

Public String telephone { get; set; }

Public String email { get; set; }

Public int adresskey { get; set; }

}

Класс Employee. cs

Class Employee: TableServiceEntity

{

Public String firstname { get; set; }

Public String lastname { get; set; }

Public String telephone { get; set;}

Public int firmkey { get; set; }

}

Класс Context. cs

Class Context: TableServiceContext

{

Public IQueryable<Address> ContactData

{

Get

{

Return this. CreateQuery<Address>("Address");

}

}

Public Context(Uri baseAddress, StorageCredentials credentials) :

Base(baseAddress. AbsoluteUri, credentials) { }

Запустите приложение и дождитесь конца его выполнения. В обозревателе серверов раскройте вкладку "Хранилище Windows Azure", затем обновите вкладку "Таблицы" и раскройте ее. Как вы можете видеть, появилась таблица "Relational".

Рис. 16.2.

Если вы решите ее просмотреть, то увидите, что данные из реляционной БД успешно перенесены в таблицу.

Рис. 16.3.

Похожие статьи




Особенности создания и работы с реляционным хранилищем данных - Введение в облачные решения Microsoft

Предыдущая | Следующая