Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Логическое проектирование реляционной БД




Преобразование ER–диаграммы в схему базы данных

База данных создаётся на основании схемы базы данных. Для преобразования ER–диаграммы в схему БД приведём уточнённую ER–диаграмму, содержащую атрибуты сущностей (рис. 3).

 

Рис. 3. Уточнённая ER–диаграмма проектной организации

 

Примечание. Многозначные атрибуты на рисунке выделены подчеркиванием.

Преобразование ER–диаграммы в схему БД выполняется путем сопоставления каждой сущности и каждой связи, имеющей атрибуты, отношения (таблицы) БД. Связь типа 1:n (один-ко-многим) между отношениями реализуется через внешний ключ. Ключ вводится для того отношения, к которому осуществляется множественная связь. Внешнему ключу должен соответствовать первичный или уникальный ключ основного (родительского) отношения.

Связь участвовать между ПРОЕКТАМИ и СОТРУДНИКАМИ принадлежит к типу n:m (многие-ко-многим). Этот тип связи реализуется через вспомогательное отношение Участие, которое содержит комбинации первичных ключей соответствующих исходных отношений.

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

 

Рис. 4. Обозначения, используемые на схеме базы данных

 

Полученная схема реляционной базы данных (РБД) приведена на рис. 5.

 

Рис. 5. Схема РБД, полученная из ER–диаграммы проектной организации

 

Бинарная связь между отношениями не может быть обязательной для обоих отношений. Такой тип связи означает, что, например, прежде чем добавить новый проект в отношение ПРОЕКТЫ, нужно добавить новую строку в отношение ЭТАПЫ, и наоборот. Поэтому для такой связи необходимо снять с одной стороны условие обязательности. Так как все эти связи будут реализованы с помощью внешнего ключа, снимем условие обязательности связей для отношений, содержащих первичные ключи.

Схема на рис. 5 содержит три цикла: "сотрудники–проекты–участие– сотрудники", "отделы–сотрудники–проекты–отделы" и "отделы–сотрудники– участие–проекты–отделы". Цикл допустим только в том случае, если связи, входящие в него, независимы друг от друга. Например, для нашей ПрО справедливо такое правило: сотрудник любого отдела может быть участником (исполнителем или консультантом) проекта любого отдела. Эти связи независимы, поэтому цикл "отделы–сотрудники–участие–проекты–отделы" не будет приводить к нарушению логической целостности данных.

С другой стороны, только сотрудник отдела, отвечающего за выполнение проекта, может быть руководителем проекта. Но система не помешает нам назначить руководителем проекта сотрудника любого отдела. При добавлении проекта с внешним ключом Руководитель система проверит только, что такой человек есть в таблице СОТРУДНИКИ. А значение внешних ключей Отдел в таблицах СОТРУДНИКИ и ПРОЕКТЫ сравнивать не будет.

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

Рассмотрим эту ситуацию в общем случае. Сначала слегка упростим схему: реализуем связь "руководить" через таблицу УЧАСТИЕ – это позволит не отвлекаться на малозначительные детали.

Будем считать, что в выполнении проекта могут участвовать только сотрудники, работающие в том же отделе, к которому относится проект (рис. 6,а). При циклической схеме СУБД не сможет гарантировать логическую целостность данных без использования дополнительных средств.

Один из способов разрешения таких ситуаций – разорвать цикл, исключив одну из связей (рис. 6,б) или введя промежуточное отношение (рис. 6,в). В нашем случае можно было бы разорвать связь "сотрудники–проекты", если бы каждый сотрудник участвовал во всех проектах своего отдела. Промежуточное отношение можно было бы использовать, если бы существовала общая связь между сущностями, входящими в цикл. Например, если бы каждый сотрудник заключал договор с отделом на выполнение работ в рамках проекта, то отношение ДОГОВОРЫ отражало бы связь между отделом, сотрудником и проектом.

Другой способ разрешения цикла заключается в том, что в промежуточное отношение СОТРУДНИКИ – ПРОЕКТЫ, которое реализует связь многие-комногим, добавляются (мигрируют) внешние ключи Код отдела (D_id) из отношений СОТРУДНИКИ и ПРОЕКТЫ (рис. 6,г). Эти ключи проверяются на равенство друг другу с помощью соответствующего ограничения целостности (check). Использование этого способа возможно в том случае, когда соответствующие связи (отдел–проект и отдел–сотрудник) имеют тип один-ко-многим и являются обязательными.

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

Рис.6. Некоторые способы разрешения циклов в схеме базы данных

 

Примем для нашей ПрО, что руководитель проекта может одновременно выполнять и другие обязанности в этом проекте, чтобы цикл "сотрудники– проекты–участие–сотрудники" не приводил к возможности нарушения логической целостности данных. Зато цикл "отделы–сотрудники (руководители)– проекты–отделы" включает зависимые связи: руководитель проекта назначается из того отдела, который отвечает за выполнение проекта в целом. Здесь можно было бы применить разрыв связи "отделы–проекты" и определять, к какому отделу относится проект через руководителя (по отделу руководителя проекта). Но такой подход в данном случае имеет существенный недостаток. Заменив руководителя проекта сотрудником другого отдела, можно одновременно изменить отдел, отвечающий за выполнение проекта, т.е. объединить в одно действие два независимых изменения, а это недопустимо.

Исходя из вышесказанного мы не будем разрывать связь, а примем решение реализовать эту проверку программно. Приложение должно будет при назначении руководителя проекта выдавать список сотрудников того отдела, который отвечает за выполнение данного проекта. Руководителя можно будет выбрать только из этого списка, а не вводить вручную.

 

Составление реляционных отношений

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

Отношения приведены в табл. 1-5. Для каждого отношения указаны атрибуты с их внутренним названием, типом и длиной. Типы данных обозначаются так: N – числовой, C – символьный тип фиксированной длины, V – символьный тип переменной длины, D – дата (этот тип имеет стандартную длину, зависящую от СУБД, поэтому она не указывается). О правилах выбора типов данных подробно рассказано в [1].

Потенциальными ключами отношения ОТДЕЛЫ являются атрибуты Аббревиатура и Название отдела. Первый занимает меньше места, поэтому мы выбираем его в качестве первичного ключа.

 

Таблица 1. Схема отношения ОТДЕЛЫ (Departs)

Содержание поля Имя поля Тип, длина Примечания
Аббревиатура отдела D_ID С(10) первичный ключ
Название отдела D_NAME V(100) обязательное поле
Комнаты D_ROOMS V(20) обязательное многозначное поле
Телефоны D_PHONE V(40) обязательное многозначное поле

 

Потенциальными ключами отношения СОТРУДНИКИ являются поля Паспортные данные, ИНН и Номер страхового пенсионного свидетельства. Все они занимают достаточно много места, а паспортные данные кроме того могут меняться. Введём суррогатный первичный ключ Номер сотрудника.

 

Таблица 2. Схема отношения СОТРУДНИКИ (Employees)

Содержание поля Имя поля Тип, длина Примечания
Номер E_ID N(4) суррогатный первичный ключ
Фамилия, имя, отчество E_NAME V(50) обязательное поле
Дата рождения E_BORN D обязательное поле
Пол E_SEX C(1) обязательное поле, 'м' или 'ж'
Паспортные данные E_PASP V(50) обязательное поле
ИНН E_INN С(12) обязательное уникальное поле
Номер пенсионного страхового свидетельства E_PENS С(14) обязательное уникальное поле
Отдел E_DEPART C(10) внешний ключ (к Departs)
Должность E_POST V(30) обязательное поле
Оклад E_SAL N(8,2) обязательное поле, > 4500 руб.
Данные об образовании E_EDU V(200) обязательное многозначное поле
Адреса E_ADDR V(100) многозначное поле
Телефоны E_PHONE V(30) многозначное поле
Логин E_LOGIN V(30)  

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

В отношении ПРОЕКТЫ три потенциальных ключа: Номер проекта, Название проекта и Сокращённое названиие. Меньше места занимает первый из них, но он малоинформативен. Зато сокращённое название, используемое в качестве внешнего ключа в других таблицах, позволит специалисту идентифицировать проект без необходимости соединения с отношением ПРОЕКТЫ.

 

Таблица 3. Схема отношения ПРОЕКТЫ (Projects)

Содержание поля Имя поля Тип, длина Примечания
Номер проекта P_ID N(6) обязательное уникальное поле
Название проекта P_TITLE V(100) обязательное поле
Сокращённое название P_ABBR С(10) первичный ключ
Отдел P_DEPART C(10) внешний ключ (к Departs)
Заказчик P_COMPANY V(40) обязательное поле
Данные заказчика P_LINKS V(200) обязательное поле
Руководитель P_CHIEF N(4) внешний ключ (к Employees)
Дата начала проекта P_BEGIN D обязательное поле
Дата окончания проекта P_END D обязательное поле, больше даты начала проекта
Реальная дата окончания P_FINISH D  
Стоимость проекта P_COST N(10) обязательное поле
Полученная сумма P_SUM N(10) обязательное поле, значение по умолчанию – 0

 

Потенциальным ключом отношения ЭТАПЫ является комбинация внешнего ключа и номера этапа, а потенциальным ключом вспомогательного отношения УЧАСТИЕ является комбинация первых трёх полей этого отношения. Можно вообще не вводить первичный ключ для данных отношений, т.к. на них никто не ссылается. Но уникальность этих комбинации является в данном случае ограничением целостности данных, поэтому мы возьмём эти комбинации в качестве первичных ключей соответствующих отношений.

 

Таблица 4. Схема отношения ЭТАПЫ ПРОЕКТА (Stages)

Содержание поля Имя поля Тип, длина Примечания
Проект S_PRO C(10) внешний ключ (к Projects) составной первичный ключ
Номер этапа S_NUM N(2)  
Название этапа S_TITLE V(200) обязательное поле
Дата начала этапа S_BEGIN D обязательное поле
Дата окончания этапа S_END D обязательное поле, > даты начала
Реальная дата окончания S_FINISH D больше даты начала этапа
Стоимость этапа S_COST N(10) обязательное поле
Полученная сумма по этапу S_SUM N(10) обязательное поле, значение по умолчанию – 0
Форма отчётности S_FORM V(100) обязательное поле

 

Таблица 5. Схема отношения УЧАСТИЕ (Job)

Содержание поля Имя поля Тип, длина Примечания *
Проект J_PRO C(10) внешний ключ (к Projects)
Сотрудник J_EMP N(4) внешний ключ (к Employees)
Роль J_ROLE V(20) обязательное поле
Доплата J_BONUS N(2)  

* – в отношении УЧАСТИЕ первичный ключ состоит из первых 3-х полей этого отношения.

 

Нормализация полученных отношений (до 4НФ)

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

1НФ.Для приведения таблиц к 1НФ требуется составить прямоугольные таблицы (одно значение атрибута – одна ячейка таблицы) и разбить сложные атрибуты на простые.

Примечание. В реальных БД сложные атрибуты разбиваются на простые, если:

а) этого требует внешнее представление данных;

б) в запросах поиск может осуществляться по отдельной части атрибута.

Разделим атрибут Фамилия, имя, отчество на два атрибута Фамилия и

Имя, отчество, Паспортные данные на Номер паспорта (уникальный), Дата выдачи и Кем выдан, а Данные об образовании – на Вид образования, Специальность, Номер диплома и Год окончания учебного заведения. Многозначные атрибуты Комнаты и Телефоны из отношения ОТДЕЛЫ вынесем в отдельное отношение КОМНАТЫ, а домашние и мобильные телефоны и адреса сотрудников – в отношение АДРЕСА-ТЕЛЕФОНЫ. Так как в комнате может не быть телефона, первичный ключ отношения КОМНАТЫ не определен (ПК не может содержать null–значения), но на этих атрибутах можно определить составной уникальный ключ. В отношении АДРЕСАТЕЛЕФОНЫ также нет потенциальных ключей: оставим это отношение без первичного ключа, т.к. на это отношение никто не ссылается. Данные об образовании сотрудников также вынесем в отдельное отношение.

Что касается рабочих телефонов сотрудников, то один из этих номеров – основной – определяется рабочим местом сотрудника (рассматриваются только стационарные телефоны). Будем хранить этот номер в атрибуте Рабочий телефон. Наличие других номеров зависит от того, есть ли в том же помещении (комнате) другие сотрудники, имеющие стационарные телефоны. Добавим в отношение СОТРУДНИКИ атрибут Номер комнаты, чтобы дополнительные номера телефонов сотрудника можно было вычислить из других кортежей с таким же номером комнаты.

Связь между отношениями СОТРУДНИКИ и КОМНАТЫ реализуем через составной внешний ключ (Номер комнаты, Рабочий телефон).

Мы также удалим вычислимый атрибут Полученная сумма из отношения

ПРОЕКТЫ, т.к. он является суммой значений аналогичного атрибута из отношения ЭТАПЫ ПРОЕКТОВ. Но атрибут Стоимость проекта оставим, т.к. она фигурирует в документации по проекту. А для обеспечения логической целостности данных предусмотрим в приложении проверку того, что сумма по всем этапам совпадает со стоимостью проекта.

2НФ.В нашем случае составные первичные ключи имеют отношения ЭТАПЫПРОЕКТА и УЧАСТИЕ. Неключевые атрибуты этих отношений функционально полно зависят от составных первичных ключей.

3НФ. В отношении ПРОЕКТЫ атрибут Данные заказчика зависит от атрибута Заказчик, а не от первичного ключа, поэтому его следует вынести в отдельное отношение ЗАКАЗЧИКИ. Но при этом первичным ключом нового отношения станет атрибут Заказчик, т.е. длинная символьная строка. Целесообразнее перенести в новое отношение атрибуты Заказчик и Данные заказчика и ввести для него суррогатный ПК. Так как с каждым заказчиком может быть связано несколько проектов, связь между отношениями ПРОЕКТЫ и ЗАКАЗЧИКИ будет 1:n и суррогатный ПК станет внешним ключом для отношения ПРОЕКТЫ.

В отношении СОТРУДНИКИ атрибут Оклад зависит от атрибута Должность. Поступим с этой транзитивной зависимостью так же, как в предыдущем случае: создадим отношение ДОЛЖНОСТИ, перенесём в него атрибуты Должность и Оклад, а первичным ключом сделаем название должности.

В отношениях СОТРУДНИКИ и ОБРАЗОВАНИЕ атрибуты (Дата выдачи и Кем выдан) и (Номер диплома и Год окончания учебного заведения) зависят не от первичного ключа, а от атрибутов соответственно Номер паспорта и Специальность. Но если мы выделим их в отдельное отношение, то получим связи типа 1:1. Следовательно, здесь декомпозиция нецелесообразна.

4НФ. Отношение АДРЕСА-ТЕЛЕФОНЫ нарушают 4НФ, т.к. не всякий телефон привязан к конкретному адресу (т.е. мы имеем две многозначных зависимости в одном отношении). Но выделять Телефоны в отдельное отношение не стоит, т.к. эти сведения носят справочный характер и не требуется их автоматическая обработка.

Отношения, полученные после нормализации, приведены в табл. 6-15.

 

Таблица 6. Схема отношения ОТДЕЛЫ (Departs)

Содержание поля Имя поля Тип, длина Примечания
Аббревиатура отдела D_ID V(12) первичный ключ
Название отдела D_NAME V(100) обязательное поле

 

Таблица 7. Схема отношения КОМНАТЫ (Rooms)

Содержание поля Имя поля Тип, длина Примечания
Отдел R_DEPART V(12) внешний ключ (к Departs)
Номер комнаты R_ROOM N(4) составной уникальный ключ
Телефон R_PHONE V(20)

 

Таблица 8. Схема отношения ДОЛЖНОСТИ (Posts)

Содержание поля Имя поля Тип, длина Примечания
Название должности P_POST V(30) первичный ключ
Оклад P_SAL N(8,2) обязательное поле, > 4500 руб.

 

Таблица 9. Схема отношения СОТРУДНИКИ (Employees)

Содержание поля Имя поля Тип, длина Примечания
Идентификатор сотрудника E_ID N(4) суррогатный первичный ключ
Фамилия E_FNAME V(25) обязательное поле
Имя, отчество E_LNAME V(30) обязательное поле
Дата рождения E_BORN D обязательное поле
Пол E_SEX C(1) обязательное поле
Серия и номер паспорта E_PASP C(10) обязательное уникальное поле
Когда выдан паспорт E_DATE D обязательное поле
Кем выдан паспорт E_GIVEN V(50) обязательное поле
ИНН E_INN C(12) обязательное уникальное поле
Номер пенсионного страхового свидетельства E_PENS C(14) обязательное уникальное поле
Отдел E_DEPART V(12) внешний ключ (к Departs)
Должность E_POST V(30) внешний ключ (к Posts)
Номер комнаты E_ROOM N(4) составной внешний ключ (к Rooms)
Рабочий телефон E_PHONE V(20)
Логин E_LOGIN V(30)  

 

Таблица 10. Схема отношения ОБРАЗОВАНИЕ (Edu)

Содержание поля Имя поля Тип, длина Примечания
Идентификатор сотрудника U_ID N(4) внешний ключ (к Employees)
Вид образования U_TYPE V(20) обязательное поле
Специальность U_SPEC V(40)  
Номер диплома U_DIPLOM V(15)  
Год окончания учебного заведения U_YEAR N(4) обязательное поле

 

Таблица 11. Схема отношения АДРЕСА-ТЕЛЕФОНЫ (AdrTel)

Содержание поля Имя поля Тип, длина Примечания
Идентификатор сотрудника A_ID N(4) внешний ключ (к Employees)
Адрес A_ADDR V(50)  
Телефон A_PHONE V(30)  

 

Таблицы ОБРАЗОВАНИЕ и АДРЕСА-ТЕЛЕФОНЫ не имеют потенциаль-

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

 

Таблица 12. Схема отношения ЗАКАЗЧИКИ (Clients)

Содержание поля Имя поля Тип, длина Примечания
Номер заказчика C_ID N(4) суррогатный первичный ключ
Заказчик C_COMPANY V(40) обязательное поле
Адрес заказчика C_ADR V(50) обязательное поле
Контактное лицо C_PERSON V(50) обязательное поле
Телефон C_PHONE V(30)  

 

Таблица 13. Схема отношения ПРОЕКТЫ (Projects)

Содержание поля Имя поля Тип, длина Примечания
Номер проекта P_ID N(6) обязательное уникальное поле
Название проекта P_TITLE V(100) обязательное поле
Сокращённое название P_ABBR С(10) первичный ключ
Отдел P_DEPART V(12) внешний ключ (к Departs)
Заказчик P_COMPANY N(4) внешний ключ (к Clients)
Руководитель P_CHIEF N(4) внешний ключ (к Employees)
Дата начала проекта P_BEGIN D обязательное поле
Дата окончания проекта P_END D обязательное поле, больше даты начала проекта
Реальная дата окончания P_FINISH D больше даты начала проекта
Стоимость проекта P_COST N(10) обязательное поле, > 0

 

Таблица 14. Схема отношения ЭТАПЫ ПРОЕКТА (Stages)

Содержание поля Имя поля Тип, длина Примечания
Проект S_PRO C(10) внешний ключ (к Projects) составной первичный ключ
Номер этапа S_NUM N(2)  
Название этапа S_TITLE V(200) обязательное поле
Дата начала этапа S_BEGIN D обязательное поле
Дата окончания этапа S_END D обязательное поле, больше даты начала этапа
Реальная дата окончания S_FINISH D больше даты начала этапа
Стоимость этапа S_COST N(10) обязательное поле
Полученная сумма по этапу S_SUM N(10) обязательное поле, значение по умолчанию – 0
Форма отчётности S_FORM V(100) обязательное поле

 

Таблица 15. Схема отношения УЧАСТИЕ (Job)

Содержание поля Имя поля Тип, длина Примечания  
Проект J_PRO C(10) внешний ключ (к Projects) составной ПК
Сотрудник J_EMP N(4) внешний ключ (к Employees)
Роль J_ROLE V(20) обязательное поле
Доплата J_BONUS N(2)    

Схема базы данных после нормализации приведена на рис. 7.

 

Определение дополнительных ограничений целостности

Перечислим ограничения целостности, которые не указаны в табл. 6–15.

1. Атрибут Вид образования может принимать одно из следующих значений: 'начальное', 'среднее', 'средне-специальное', 'высшее'.

2. Атрибут Роль может принимать одно из двух значений: 'исполнитель' или 'консультант'.

3. В поле Доплата хранится величина доплаты сотруднику за участие в проекте (в процентах к его окладу). Значение поля больше либо равно 0.

4. Нумерация в поле Номер этапа начинается с 1 и является непрерывной для каждого проекта.

 

Рис. 7. Окончательная схема БД проектной организации

 

5. Дата начала первого этапа проекта должна соответствовать началу проекта в целом, дата завершения последнего этапа должна соответствовать завершению проекта в целом. Этапы не должны пересекаться по времени и между ними не должно быть разрывов.

6. Стоимость проекта должна быть равна сумме стоимостей всех этапов этого проекта.

Ограничения 4-6 нельзя реализовать в схеме отношения. В реальных БД подобные ограничения целостности реализуются вручную или программно (через внешнее приложение или специальную процедуру контроля данных – триггер).

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

 

Описание групп пользователей и прав доступа

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

s – чтение данных (select);

i – добавление данных (insert);

u – модификация данных (update); d – удаление данных(delete).

 

Таблица 16. Права доступа к таблицам для групп пользователей

Таблицы Группы пользователей (роли)
Руководители организации Сотрудники отд. кадров Руководители проектов Бухгалтеры Участники проектов
Отделы S SIUD S S  
Комнаты S SUID S S S
Должности SIUD     S  
Сотрудники S SUID S S  
Адресателефоны S SUID S S  
Образование S SUID S S  
Заказчики SIUD   S    
Проекты SIUD   S    
Этапы проектов SIUD   SUI    
Участие S   S S  

 

Права на изменение данных в таблице УЧАСТИЕ будут назначены через представление, т.к. изменять данные этой таблицы может только руководитель проекта. Описание представлений приведено в п.2.5.2. "Создание представлений (готовых запросов)".

Права назначает администратор БД (или администратор безопасности, если система сложная и администраторов несколько).

 


Поделиться:

Дата добавления: 2015-01-01; просмотров: 569; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.007 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты