с реляционными базами данных 2 глава




Особенности использования индексов зависят от формата связываемых таблиц. Так, для таблиц dBase индексы строятся по одному полю и нет деления на ключ (главный или первичный индекс) и индексы. Для организации связи в главной и подчиненной таблицах выбираются индексы, составленные по полям совпа­дающего типа, например, целочисленного.

Для таблиц Paradox в качестве полей связи главной таблицы должны использо­ваться поля ключа, а для подчиненной таблицы — поля индекса. Кроме того, в подчиненной таблице обязательно должен быть определен ключ. На рис. 2.2 показана схема связи между таблицами БД Paradox.


24


Часть I. Основы работы с базами данных


 



 


В главной таблице определен ключ, построенный по полю MCode автоинкре­ментного типа. В подчиненной таблице определен ключ по полю D_Number так­же автоинкрементного типа и индекс, построенный по полю D_Code целочис­ленного типа. Связь между таблицами устанавливается по полям D_Code и M_Code. Индекс по полю D_Code является внешним ключом. В названия полей включены префиксы, указывающие на принадлежность поля соответствующей таблице. Так, названия полей главной таблицы начинаются с буквы м (Master), a названия полей подчиненной таблицы начинаются с буквы d (Detail). Подобное именование полей облегчает ориентацию в их названиях, особенно при боль­шом количестве таблиц.


Замечание


J


Как отмечалось, поля связи должны быть индексированными, хотя, строго говоря, это требование не всегда является обязательным. При доступе к данным средства­ми языка SQL можно связать (соединить) между собой таблицы и по неиндексиро-ванным полям. Однако в этом случае скорость выполнения операций будет низкой.

Связь между таблицами определяет отношение подчиненности, при котором одна таблица является главной (родительской, или мастером — Master), а вто­рая — подчиненной (дочерней, или детальной — Detail). Саму связь (отношение) называют связь "главный-подчиненный", "родительский-дочерний" или "мастер-детальный". Существуют следующие виды связи:

□ отношение "один-к-одному";

□ отношение "один-ко-многим";

□ отношение "много-к-одному";

□ отношение "много-ко-многим".

Отношение "один-к-одному" означает, что одной записи в главной таблице соот­ветствует одна запись в подчиненной таблице. При этом возможны два варианта:

□ для каждой записи главной таблицы есть запись в подчиненной таблице;

□ в подчиненной таблице может не быть записей, соответствующих записям главной таблицы.


Глава 2. Реляционные базы данных и средства работы с ними


25


Отношение "один-к-одному" обычно используется при разбиении таблицы с большим числом полей на несколько таблиц. В этом случае в первой таблице остаются поля с наиболее важной и часто используемой информацией, а ос­тальные поля переносятся в другую (другие) таблицу.

Отношение "один-ко-многим" означает, что одной записи главной таблицы в подчиненной таблице может соответствовать несколько записей, в том числе ни одной. Этот вид отношения встречается наиболее часто. После установления связи между таблицами при перемещении на какую-либо запись в главной таб­лице в подчиненной таблице автоматически становятся доступными записи, у которых значение поля связи равно значению поля связи текущей записи глав­ной таблицы. Такой отбор записей подчиненной таблицы является своего рода фильтрацией.

Типичным примером является, например, организация учета выдачи книг в библиотеке, для которой удобно создать следующие две таблицы:

□ таблицу карточек читателей, содержащую такую информацию о читателе, как фамилия, имя, отчество, дата рождения и домашний адрес;

□ таблицу выдачи книг, в которую заносится информация о выдаче книги чи­тателю и о возврате книги.

В этой ситуации главной является таблица карточек читателей, а подчинен­ной — таблица выдачи книг. Один читатель может иметь на руках несколько книг, поэтому одной записи в главной таблице может соответствовать несколько записей в подчиненной таблице. Если читатель сдал все книги или еще не брал ни одной книги, то для него в подчиненной таблице записей нет. После связы­вания обеих таблиц при выборе записи с данными читателя в таблице выдачи книг будут доступны только записи с данными о книгах, находящихся на руках этого читателя.

В приведенном примере предполагается, что после возврата книги соответст­вующая ей запись удаляется из таблицы выдачи книг. Вместо удаления записи можно заносить в соответствующее поле дату возврата книги.

Отношение "много-к-одному" отличается от отношения "один-ко-многим" только напрвлением. Если на отношение "один-ко-многим" посмотреть со стороны подчиненной таблицы, а не главной, то оно превращается в отношение "много-к-одному".

Отношение "много-ко-многим "имеет место, когда одной записи главной таблицы может соответствовать несколько записей подчиненной таблицы и одновремен­но одной записи подчиненной таблицы — несколько записей главной таблицы. Подобное отношение реализуется, например, при планировании занятий в ин­ституте и устанавливается между таблицами, в которых хранится информация о номерах аудиторий и номерах учебных групп. Так как учебная группа может заниматься в разных аудиториях, то одной записи об учебной группе (первая таблица) может соответствовать несколько записей о занимаемых этой группой аудиториях. В то же время в одной аудитории могут заниматься разные учебные группы (даже одновременно), поэтому одной записи об аудитории может соот­ветствовать несколько записей об учебных группах (вторая таблица).


26


Часть I. Основы работы с базами данных


На практике отношение "много-ко-многим" используется достаточно редко. Причинами являются сложность организации связи между таблицами и взаимо­действия между их записями. Кроме того, многие СУБД, в том числе Paradox, не поддерживают организацию ссылочной целостности для подобного отноше­ния. Отметим также, что для отношения "много-ко-многим" понятия главной и подчиненной таблицы не имеют смысла.

Среди рассмотренных отношений наиболее общим является отношение "один-ко-многим". Другие виды отношений можно рассматривать как его варианты — отношение "один-к-одному" представляет собой частный случай этого отноше­ния, а отношение "много-к-одному" является его "переворотом". Отношение "много-ко-многим" можно свести к отношению "один-ко-многим", соответст­вующим образом преобразовав и разделив таблицы. В дальнейшем предполага­ется, что таблицы связаны именно отношением "один-ко-многим".

Работа со связанными таблицами имеет следующие особенности.

□ При изменении (редактировании) поля связи может нарушиться связь между записями двух таблиц. Поэтому при редактировании поля связи записи глав­ной таблицы нужно соответственно изменять и значения поля связи всех подчиненных таблиц.

□ При удалении записи главной таблицы нужно удалять и соответствующие ей записи в подчиненной таблице (каскадное удаление).

□ При добавлении записи в подчиненную таблицу значение ее поля связи должно быть установлено равным значению поля связи главной таблицы.

Ограничения по установке, изменению полей связи и каскадному удалению за­писей могут быть наложены на таблицы при их создании. Эти ограничения, на­ряду с другими элементами, например описаниями полей и индексов, входят в структуру таблицы и действуют для всех приложений, которые выполняют опе­рации с БД. Указанные ограничения можно задать при создании или реструкту­ризации таблицы, например, в среде программы Database Desktop, которая по­зволяет устанавливать связи между таблицами при их создании.

Ограничения, связанные с установкой, изменением значений полей связи и каскадным удалением записей, могут и не входить в структуру таблицы (таб­лиц), а реализовываться программным способом. В этом случае программист должен обеспечить:

□ организацию связи между таблицами;

□ установку значения поля связи подчиненной таблицы (это может также вы­полняться автоматически);

□ контроль (запрет) редактирования полей связи;

□ организацию (запрет) каскадного удаления записей.

Например, в случае удаления записи из главной таблицы программист должен проверить наличие соответствующих записей в подчиненной таблице. Если та­кие записи есть, то необходимо удалить и их или, наоборот, запретить удаление записей из обеих таблиц. И в том, и в другом случае пользователю должно быть выдано предупреждение.


Глава 2. Реляционные базы данных и средства работы с ними


27


Механизм транзакций

Информация БД в любой момент времени должна быть целостной и непроти­воречивой. Одним из путей обеспечения этого является использование меха­низма транзакций.

Транзакция представляет собой выполнение последовательности операций. При этом возможны две ситуации.

□ Успешно завершены все операции. В этом случае транзакция считается ус­пешной, и все изменения в БД, которые были произведены в рамках тран­закции отдельными операциями, подтверждаются. В результате БД переходит из одного целостного состояния в другое.

□ Неудачно завершена хотя бы одна операция. При этом вся транзакция счита­ется неуспешной, и результаты выполнения всех операций (даже успешно выполненных) отменяются. В результате происходит возврат БД в состояние, в котором она находилась до начала транзакции.

Таким образом, успешная транзакция переводит БД из одного целостного состояния в другое. Использование механизма транзакций необходимо:

□ при выполнении последовательности взаимосвязанных операций с БД;

□ при многопользовательском доступе к БД.

Транзакция может быть неявной или явной. Неявная транзакция стартует авто­матически, а по завершении также автоматически подтверждается или отменя­ется. Явной транзакцией управляет программист с использованием компонента Database и/или средств SQL.

Часто в транзакцию объединяются операции над несколькими таблицами, когда производятся действия по внесению в разные таблицы взаимосвязанных изме­нений. Пусть осуществляется перенос записей из одной таблицы в другую. Если запись сначала удаляется из первой таблицы, а затем заносится во вторую таб­лицу, то при сбое, например из-за перерыва в энергопитании компьютера, воз­можна ситуация, когда запись уже удалена, но во вторую таблицу не попала. Если запись сначала заносится во вторую таблицу, а потом удаляется из первой таблицы, то при сбое возможна ситуация, когда запись будет находиться в двух таблицах. В обоих случаях имеет место нарушение целостности и непротиворе­чивости БД.

Для предотвращения подобной ситуации операции удаления записи из одной таблицы и занесения ее в другую таблицу объединяются в одну транзакцию. Выполнение этой транзакции гарантирует, что при любом ее результате целост­ность БД нарушена не будет.

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


28


Часть I. Основы работы с базами данных


количества товара, новое значение может быть не занесено в соответствующую запись, в результате чего будет нарушена целостность БД, и она будет содержать некорректные значения. Такая ситуация возможна, например, в случае много­пользовательского доступа к БД при редактировании этой записи другим при­ложением. Поэтому в случае невозможности внести изменения в наличное ко­личество товара должно блокироваться и добавление новой записи в таблицу движения товара.

Для реализации механизма транзакций СУБД предоставляют соответствующие средства.

Бизнес-правила

Бизнес-правила представляют собой механизмы управления БД и предназначены для поддержания БД в целостном состоянии, а также для выполнения ряда дру­гих действий, например, накапливания статистики работы с БД.

(_____ ЗамечаниеJ

В данном контексте бизнес-правила являются просто правилами управления БД и не имеют отношения к бизнесу как предпринимательству.

В первую очередь бизнес-правила реализуют следующие ограничения БД:

□ задание допустимого диапазона значений;

□ задание значения по умолчанию;

□ требование уникальности значения;

□ запрет пустого значения;

□ ограничения ссылочной целостности.

Бизнес-правила можно реализовывать как на физическом, так и на программ­ном уровнях. В первом случае эти правила (например, ограничения ссылочной целостности для связанных таблиц) задаются при создании таблиц и входят в структуру БД. В дальнейшей работе нельзя нарушить или обойти ограничение, заданное на физическом уровне.

Вместо бизнес-правил, заданных на физическом уровне, или в дополнение к ним можно определить бизнес-правила на программном уровне. Действие этих правил распространяется только на приложение, в котором они реализованы. Для программирования в приложении бизнес-правил используются компоненты и предоставляемые ими средства. Достоинство такого подхода заключается в легкости изменения бизнес-правил и определении правил "своего" приложения. Недостатком является снижение безопасности БД, связанное с тем, что каждое приложение может устанавливать свои правила управления БД. В главе 19, по­священной навигационному способу доступа, приводится пример программиро­вания бизнес-правил в приложении, связанный с каскадным удалением записей связанных таблиц.


Глава 2. Реляционные базы данных и средства работы с ними


29


При работе с удаленными БД в архитектуре "клиент-сервер" бизнес-правила можно реализовывать также на сервере.

Словарь данных

Словарь данных представляет собой совокупность определений БД и атрибутов. Словарь данных позволяет сформировать и сохранить характеристики, которые в дальнейшем можно использовать для описания БД.

Использование словаря данных позволяет:

□ ускорить процесс создания БД;

□ облегчить изменение характеристик БД;

□ придать единообразный вид визуальным компонентам приложения.

Определение БД является специализированной БД, которая описывает структуру базы, но не содержит данных. Это описание структуры можно использовать для создания других БД.

Атрибуты представляют собой совокупности характеристик отдельных полей. Заданные через атрибуты характеристики поля при выполнении приложения устанавливаются в качестве значений соответствующих свойств визуальных компонентов, которые отображают значения поля, например, DBGrid или DBText. Приведем некоторые наиболее распространенные характеристики полей (они же свойства визуальных компонентов):

□ Alignment — выравнивание;

□ DisplayLabel — заголовок столбца (сетки DBGrid);

□ Readonly — недоступность поля для редактирования (поле предназначено только для чтения);

□ Required — требование обязательного ввода значения;

□ visible — видимость;

□ DispiayFormat — формат отображаемого значения;

□ Minvalue — минимальное значение;

□ Maxvalue — максимальное значение.

Для работы со словарем данных удобно использовать программу SQL Explorer.

Таблицы форматов dBase и Paradox

Delphi не имеет своего формата таблиц, но поддерживает как собственные два типа локальных таблиц — dBase и Paradox. Каждая из этих таблиц имеет свои особенности.

Таблицы dBase являются одним из первых появившихся форматов таблиц для персональных компьютеров и поддерживаются многими системами, которые связаны с разработкой и обслуживанием приложений, работающих с БД.


30


Часть I. Основы работы с базами данных


Основные достоинства таблиц dBase:

□ простота использования;

□ совместимость с большим числом приложений.

В табл. 2.1 содержится список типов полей таблиц dBase IV. Для каждого типа приводится символ, используемый для его обозначения в программе Database Desktop (это программа создания и редактирования таблиц, SQL-запросов и за­просов QBE), а также описание значений, которые может содержать поле рас­сматриваемого типа.

Таблица 2.1. Типы полей таблиц dBase IV



 


 


Замечание


J


При работе с таблицей в среде программы Database Desktop значения полей типа

Binary, Memo и ole не отображаются.

Таблицы dBase являются достаточно простыми и используют для своего хране­ния на дисках относительно мало физических файлов. По расширению файлов можно определить, какие данные они содержат.

□ dbf — таблица с данными.

□ dbt — данные больших двоичных объектов, или BLOB-данные (Binary Large OBject). К ним относятся двоичные, Memo- и OLE-поля. Memo-поле также называют полем комментариев.


Глава 2. Реляционные базы данных и средства работы с ними


31


П mdx — поддерживаемые индексы.

□ ndx — индексы, непосредственно не поддерживаемые форматом dBase. При
использовании таких индексов программист должен обрабатывать их само­
стоятельно.

Имя поля в таблице dBase должно состоять из букв и цифр и начинаться с бук­вы. Максимальная длина имени составляет 10 символов. В имена нельзя вклю­чать специальные символы и пробел.

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

Таблицы Paradox являются достаточно развитыми и удобными для создания БД. Можно отметить следующие их достоинства:

□ большое количество типов полей для представления данных различных типов;

□ поддержка целостности данных;

□ организация проверки вводимых данных;

□ поддержка парольной защиты таблиц.

Большой набор типов полей позволяет гибко выбирать тип для точного пред­ставления данных, хранимых в базе. Например, для представления числовой информации можно использовать один из пяти числовых типов. В табл. 2.2 со­держится список типов полей для таблиц Paradox 7. Для каждого типа приво­дятся символ, используемый для обозначения этого типа в программе Database Desktop, и описание значений, которые может содержать поле рассматриваемо­го типа.

Таблица 2.2. Типы полей таблиц в Paradox 7

Тип Обозначение Описание значения

Alpha А Строка символов. Длина не более 255 символов

Number N Число с плавающей точкой. Диапазон -10307... 10308.

Точность 15 цифр мантиссы

Money $ Денежная сумма. Отличается от типа Number тем,

что в значении отображается денежный знак. Обо­значение денежного знака зависит от установок Windows

Целое число. Диапазон -32 768... 32 767

Целое число. Диапазон —2 147 483 648... 2 147 483 647

Число в двоично-десятичном формате

Дата. Диапазон 01.01.9999 до н. э.... 31.12.9999

Время


32


Часть I. Основы работы с базами данных


Таблица 2.2 (окончание)



 


J

Замечание

При работе с таблицей в среде программы Database Desktop значения полей типа

Graphic, Binary, Memo и OLE не отображаются.

Имя поля в таблице Paradox должно состоять из букв (допускается кириллица) и цифр и начинаться с буквы. Максимальная длина имени составляет 25 симво­лов. В имени можно использовать такие символы, как пробел, #, $ и некоторые другие. Не рекомендуется использовать символы.,! и |, т. к. они зарезервиро­ваны в Delphi для других целей.

При задании ключевых полей они должны быть первыми в структуре таблицы.


Глава 2. Реляционные базы данных и средства работы с ними


33


(_____ ЗамечаниеJ

Если требуется обеспечить перенос или совместимость данных из таблиц Paradox с таблицами других форматов, желательно выбирать имя поля длиной не более 10 символов и составлять его из латинских букв и цифр.

Поддержка концепции целостности данных обеспечивает правильность ссылок между таблицами. Например, если в БД имеются таблицы клиентов и заказов, то эти таблицы могут быть связаны следующим образом: каждая запись таблицы заказов ссылается через индексное поле на запись в таблице клиентов, соответ­ствующую сделавшему заказ клиенту. Если в таблице клиентов любым способом удалить запись с информацией о каком-либо клиенте, то BDE автоматически удалит все записи, соответствующие этому клиенту, и из таблицы заказов. По­добное удаление взаимосвязанных записей называют каскадным.

Для полей можно определить специальный диапазон, в котором должны нахо­диться вводимые в них значения. Кроме того, для каждого поля можно опреде­лить минимальное и максимальное допустимые значения. При попытке ввода в поле значения, выходящего за допустимые границы, возникает исключение, значение не вводится и содержимое поля не изменяется. Например, для поля Salary (оклад) в качестве минимального значения логично указать ноль, тем самым в это поле запрещается вводить отрицательные значения. Максимальное значение поля Salary зависит от организации, страны и от других факторов.

Наряду с диапазоном допустимых значений для каждого поля можно задать значение по умолчанию, которое автоматически заносится в поле при добавле­нии к таблице новой записи.

При работе с конфиденциальной информацией может потребоваться защита таб­лиц и их полей. Для каждой таблицы Paradox следует указать основной пароль, который используется при изменениях во всей таблице, связанных со сменой структуры или с редактированием данных в любом поле. Возможно также задание дополнительного пароля, позволяющего ограничить доступ к конкретному полю или группе полей таблицы, а также набора операций, применимых к таблице (на­пример, разрешения только на чтение записей таблицы без возможности их мо­дификации). После установки паролей они будут автоматически запрашиваться и контролироваться при любой попытке доступа к таблице.

Определенным недостатком таблиц Paradox является наличие относительно большого количества типов файлов, требуемых для хранения содержащихся в таблице данных. При копировании или перемещении какой-либо таблицы из одного каталога в другой необходимо обеспечить копирование или перемещение всех файлов, относящихся к этой таблице. Файлы таблиц Paradox имеют сле­дующие расширения:

□ db — таблица с данными;

□ mb — BLOB-данные;

□ рх — главный индекс (ключ);

□ xg* и yg* — вторичные индексы;



Часть I. Основы работы с базами данных


П val — параметры для проверки данных и целостности ссылок;

□ tv и fam — форматы вывода таблицы в программе Database Desktop.

(Замечание^

Указанные файлы создаются только если в них есть необходимость; конкретная таблица может не иметь всех приведенных файлов.

Кроме названных файлов, при работе в сети для управления доступом к табли­цам Paradox используются файлы с расширением net.

Средства для работы

с реляционными базами данных

Хотя система Delphi не имеет своего формата таблиц БД, она тем не менее обеспечивает мощную поддержку большого количества различных СУБД — как локальных (например, dBase или Paradox), так и промышленных (например, Sybase или InterBase). Средства Delphi, предназначенные для работы с БД, мож­но разделить на два вида:

□ инструменты □ компоненты

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

Компоненты предназначены для создания приложений, осуществляющих опера­ции с БД.

Напомним, что в Delphi имеется окно Обозревателя дерева объектов, которое отображает иерархическую структуру объектов текущей формы. При разработке приложений баз данных это окно удобно использовать для просмотра структуры базы данных и изменения связей между компонентами. Кроме того, в окне Редактора кода имеется вкладка Diagram, служащая для отображения и настройки взаимосвязей между элементами баз данных.

Инструменты

Для операций с БД система Delphi предлагает следующий набор инструментов.

□ Borland Database Engine (BDE) — процессор баз данных, который представ­ляет собой набор динамических библиотек и драйверов, предназначенных для организации доступа к БД из Delphi-приложений. BDE является цен­тральным звеном при организации доступа к данным.

□ BDE Administrator — утилита для настройки различных параметров BDE, настройки драйверов баз данных, создания и удаления драйверов ODBC, создания и обслуживания псевдонимов.

□ Database Desktop — программа создания и редактирования таблиц, SQL-запросов и запросов QBE.

□ SQL Explorer — Проводник БД, позволяющий просматривать и редактиро­вать БД и словари данных.


Глава 2. Реляционные базы данных и средства работы с ними


35


П SQL Builder — программа визуального конструирования SQL-запросов.

□ SQL Monitor — программа отслеживания порядка выполнения SQL-запросов

к удаленным БД.

□ Data Pump — программа для переноса данных (схемы базы данных и содер­жимого) между БД.

□ IBConsole — программа для управления удаленными БД.

□ InterBase Server Manager — программа для запуска сервера InterBase.

□ SQL Links — драйверы для доступа к удаленным промышленным СУБД, та­ким как Microsoft SQL Server или Oracle. К промышленному серверу InterBase, поставляемому с Delphi, доступ также можно организовать напря­мую через BDE, не используя драйвер SQL Links. В Delphi 7 вместо SQL Links для доступа к базам данных SQL Server рекомендуется использовать dbExpress.

□ dbExpress — набор драйверов для доступа к базам данных SQL с помощью таких компонентов, как SQLConnection, SQLDataSet, SQLQuery, SQLStoredProc и SQLTable. dbExpress включает в свой состав следующие драйверы:

 

• InterBase (файл dbexpint.dll);

• DB2 (файл dbexpdb2.dll);

• Oracle (файл dbexpora.dll);

• MSSQL (файл dbexpmss.dll);

• MySQL (файл dbexpmys.dll).

□ InterBase Server — клиентская и серверная части сервера InterBase.

Одни инструменты, например, BDE Administrator и SQL Explorer, можно ис­пользовать для работы с локальными и удаленными БД, другие, например, IBConsole, — для работы с удаленными БД.

Компоненты

Рассмотрим компоненты, используемые для создания приложений БД. Кроме компонентов, Delphi предоставляет разработчику специальные объекты, напри­мер, объекты типа Field. Как и другие элементы управления Delphi, связанные с БД компоненты делятся на визуальные и невизуальные.

Невизуальные компоненты предназначены для организации доступа к данным, содержащимся в таблицах. Они представляют собой промежуточное звено меж­ду данными таблиц БД и визуальными компонентами.

Визуальные компоненты используются для создания интерфейсной части прило­жения. С их помощью пользователь может выполнять такие операции с табли­цами БД, как просмотр или редактирование данных. Визуальные компоненты также называют элементами, чувствительными к данным.


36


Часть I. Основы работы с базами данных


Компоненты, используемые для работы с БД, находятся на страницах Data Access, Data Controls, dbExpress, DataSnap, BDE, ADO, InterBase, Decision Cube, Rave и InterBase Admin Палитры компонентов. Некоторые компоненты предна­значены специально для работы с удаленными БД в архитектуре "клиент-сервер". Отметим, что в Палитре компонентов Delphi 7 появились новые стра­ницы и по сравнению с предыдущими версиями изменилось распределение компонентов, используемых для работы с БД, по страницам. В частности, вме­сто страницы QReport появилась страница Rave.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: