Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Теоретические языки запросов





Операций, выполняемые над отношениями, можно разделить на две группы. Первую группу составляют операции над множествами, к которым относятся операции:

объединения
пересечения
разности
деления
декартова произведения.

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

реляционная алгебра;

реляционное исчисление.

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

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

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

S (поставщики);

Р (детали);

SP (поставки).

Первичными ключами этих таблиц являются соответственно: П# (код поставщика), Д# (код детали) и составной ключ (П#, Д#). Содержимое таблиц приведено в таблице 3.7. Для удобства изложения предположим, что в рассматриваемых языках запросов нет ограничений на употребление символов русского алфавита в именах атрибутов. Каждое из полей П# и Д# таблицы SP в отдельности является внешним ключом по отношению к таблице S и Р соответственно.

 

Таблица 3.7. Таблицы поставщиков, деталей и поставок

S   Р   SP
П# Имя Статус Город_П
S1 Сергей   Москва
S2 Иван   Шахты
S3 Борис   Шахты
S4 Николай   Москва
S5 Андрей   Минск

 

 
Д# Название Тип Вес Город_Д
Р1 гайка каленый   Москва
Р2 болт мягкий   Шахты
РЗ винт твердый   Ростов
P4 винт каленый   Москва
Р5 палец твердый   Шахты
Р6 шпилька каленый   Москва

 

 
# Д# Колич
     
S1 P2  
S1 P3  
S1 P4  
S1 P5  
S1 P6  
S2 P1  
S2 P2  
S3 P2  
S4 P2  
S4 P4  
S4 P5  

 

 

Предположим, что имена доменов (множеств допустимых значений) совпадают с именами атрибутов. Исключение составляют атрибуты Город_П (город, в котором находится поставщик) и Город_Д (город, в котором выпускается деталь), которые имеют общий домен: множество названий городов. Имя этого домена может быть, например, просто Город. Характеристики доменов как типов данных следующие: Д# - строка символов длиной 5, Имя - строка символов длиной 20, Статус - цифровое длиной 5, Город - строка символов длиной 15, Д# - строка символов длиной 6, Тип - строка символов длиной 6, Вес - цифровое длиной 5, Количество - цифровое длиной 5.

 

Реляционная алгебра

Реляционная алгебра как теоретический язык запросов по сравнению с реляционным исчислением более наглядно описывает выполняемые над отношениями действия.

Примером языка запросов, основанного на реляционной алгебре, является ISBL (Information System Base Language - базовый язык информационных систем). Языки запросов, построенные на основе реляционной алгебры, в современных СУБД широкого распространения не получили. Однако знакомство с ней полезно для понимания сути реляционных операций, выражаемых другими используемыми языками.

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

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

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

Рассмотрим перечисленные операции более подробно, сначала - операции реляционной алгебры Кодда, а затем - дополнительные операции, введенные Дейтом.

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

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

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

Объединением двух совместимых отношений R1 и R2 одинаковой размерности (Rl UNION R2) является отношение R, содержащее все элементы исходных отношений (с исключением повторений).

Пример 1. Объединение отношений.

Пусть отношением Rl будет множество поставщиков из Лондона, а отношение R2 - множество поставщиков, которые поставляют деталь Р1. Тогда отношение R обозначает поставщиков, находящихся в Лондоне, или поставщиков, выпускающих деталь Р1, либо тех и других.

 

R1   R2   R (R1 UNION R2)
П# Имя Статус Город_П
S1 Сергей   Москва
S4 Николай   Москва

 

 
П# Имя Статус Город_П
S1 Сергей   Москва
S2 Иван   Шахты

 

 
П# Имя Статус Город_П
S1 Сергей   Москва
S2 Иван   Шахты
S4 Николай   Москва

 

 

Вычитание совместимых отношений R1 и R2 одинаковой размерности (R1 MINUS R2) есть отношение, тело которого состоит из множества кортежей, принадлежащих Rl, но не принадлежащих отношению R2. Для тех же отношений R1 и R2 из предыдущего примера отношение R будет представлять собой множество поставщиков, находящихся в Лондоне, но не выпускающих деталь Р1, т. е. R={(S4, Николай, 20, Москва)}.

Заметим, что результат операции вычитания зависит от порядка следования операндов, т. е. R1 MINUS R2 и R2 MINUS R1 - не одно и то же.

Пересечение двух совместимых отношений R1 и R2 одинаковой размерности (R1 INTERSECT R2) порождает отношение R с телом, включающим в себя кортежи, одновременно принадлежащие обоим исходным отношениям. Для отношений R1 и R2 результирующее отношение R будет означать всех производителей из Лондона, выпускающих деталь Р1. Тело отношения R состоит из единственного элемента (S1, Сергей, 20, Москва).

Произведение отношения R1 степени к1 и отношения R2 степени к2 (R1 TIMES R2), которые не имеют одинаковых имен атрибутов, есть такое отношение R степени (к1+к2), заголовок которого представляет сцепление заголовков отношений R1 и R2, а тело - имеет кортежи, такие, что первые к1 элементов кортежей принадлежат множеству R1, а последние к2 элементов - множеству R2. При необходимости получить произведение двух отношений, имеющих одинаковые имена одного или нескольких атрибутов, применяется операция переименования RENAME, рассматриваемая далее.

Пример 2. Произведение отношений.

Пусть отношение R1 представляет собой множество номеров всех текущих поставщиков {S1, S2, S3, S4, S5}, а отношение R2 - множество номеров всех текущих деталей {Р1, Р2, РЗ, Р4, Р5, Р6}. Результатом операции Rl TIMES R2 является множество всех пар типа "поставщик-деталь", т. е. {(S1,P1), (S1,P2), (S1,P3), (S1,P4), (S1,P5), (S1,P6), (S2,P1),..., (S5,P6)}.

Заметим, что в теории множеств результатом операции прямого произведения является множество, каждый элемент которого является парой элементов, первый из которых принадлежит R1, а второй - принадлежит R2. Поэтому кортежами декартова произведения бинарных отношений будут кортежи вида: ((а, 6), (в, г)), где кортеж (а, б) принадлежит отношению R1, а кортеж (в, г) - принадлежит отношению R2. В реляционной алгебре применяется расширенный вариант прямого произведения, при котором элементы кортежей двух исходных отношений сливаются, что при записи кортежей результирующего отношения означает удаление лишних скобок, т. е. (а, б, в, г).

Выборка (R WHERE f) отношения R по формуле f представляет собой новое отношение с таким же заголовком и телом, состоящим из таких кортежей отношения R, которые удовлетворяют истинности логического выражения, заданного формулой f.

Для записи формулы используются операнды - имена атрибутов (или номера столбцов), константы, логические операции (AND - И, OR - ИЛИ, NOT - НЕ), операции сравнения и скобки.

Примеры 3. Выборки.

 

P WHERE Bec<14   SP WHERE П#="S1" AND Д#="P1"
Д# Название Тип Вес Город_Д
P1 гайка каленый   Москва
P5 палец твердый   Шахты

 

 
П# Д# Количество
S1 Р1  

 

 

Проекция отношения А на атрибуты X, Y,..., Z (А [X, Y,.., Z]), где множество {X, Y,..., Z} является подмножеством полного списка атрибутов заголовка отношения А, представляет собой отношение с заголовком X, Y,..., Z и телом, содержащим кортежи отношения А, за исключением повторяющихся кортежей. Повторение одинаковых атрибутов в списке X, Y,..., Z запрещается.

Операция проекции допускает следующие дополнительные варианты записи:

отсутствие списка атрибутов подразумевает указание всех атрибутов (операция тождественной проекции);

выражение вида R[ ] означает пустую проекцию, результатом которой является пустое множество;

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

Примеры 4. Проекции.

 

Р [Тип, Город_Д]   (S WHERE Город_П="Шахты") [П#]
Тип Город_Д
каленый Москва
мягкий Шахты
твердый Ростов
твердый Шахты

 

 
П# Город_П
S2 Шахты
S3 Шахты

 

 

Результатом деления отношения R1 с атрибутами А и В на отношение R2 с атрибутом В (R1 DIVIDEBY R2), где А и В простые или составные атрибуты, причем атрибут В - общий атрибут, определенный на одном и том же домене (множестве доменов составного атрибута), является отношение R с заголовком А и телом, состоящим из кортежей г таких, что в отношении R1 имеются кортежи (г, s), причем множество значений s включает множество значений атрибута В отношения R2.

Пример 5. Деление отношения.

Пусть R1 - проекция SP [П#, Д#], a R2 - отношение с заголовком Д# и телом {Р2, Р4}, тогда результатом деления R1 на R2 будет отношение R с заголовком П# и телом {S1, S4}.

R1   R2   R (R1 UNION R2)
П# Д#
S1 P1
S1 P2
S1 P3
S1 P4
S1 P5
S1 P6
S2 P1
S2 P2
S3 P2
S4 P2
S4 P4
S4 P5

 

 
Д#
P2
P4

 

 
П#
S1
S4

 

 

Соединение С (R1, R2) отношений R1 и R2 по условию, заданному формулой f, представляет собой отношение R, которое можно получить путем Декартова произведения отношений R1 и R2 с последующим применением к результату операции выборки по формуле f. Правила записи формулы f такие же, как и для операции селекции.

Другими словами, соединением отношения R1 по атрибуту А с отношением R2 по атрибуту В (отношения не имеют общих имен атрибутов) является результат выполнения операции вида:

(R1 TIMES R2) WHERE A 0 В,

где Q, - логическое выражение над атрибутами, определенными на одном (нескольких - для составного атрибута) домене. Соединение C ((R1, R2), где формула f имеет произвольный вид (в отличие от частных случаев, рассматриваемых далее), называют также f-соединением.

Важными с практической точки зрения частными случаями соединения являются эквисоединение и естественное соединение.

Операция эквисоединения характеризуется тем, что формула задает равенство операндов. Приведенный выше пример демонстрирует частный случай операции эквисоединения по одному столбцу. Иногда эквисоединение двух отношений выполняется по таким столбцам, атрибуты которых в обоих отношениях имеют соответственно одинаковые имена и домены. В этом случае говорят об эквисоединении по общему атрибуту.

Операция естественного соединения (операция JOIN) применяется к двум отношениям, имеющим общий атрибут (простой или составной). Этот атрибут в отношениях имеет одно и то же имя (совокупность имен) и определен на одном и том же домене (доменах).

Результатом операции естественного соединения является отношение R, которое представляет собой проекцию эквисоединения отношений R1 и R2 по общему атрибуту на объединенную совокупность атрибутов обоих отношений.

Пример 6. Q-соединение.

Необходимо найти соединение отношений S и Р по атрибутам Город_П и Город_Д соответственно, причем кортежи результирующего отношения должны удовлетворять отношению "больше" (в смысле лексикографического порядка - по алфавиту).

 

(S TIMES P) WHERE Город_П > Город_Д
П# Имя Статус Город_П Д# Название Тип Вес Города
S2 Иван   Шахты P1 гайка каленый   Москва
S2 Иван   Шахты P4 винт каленый   Москва
S2 Иван   Шахты P6 шпилька каленый   Москва
S3 Борис   Шахты P1 гайка каленый   Москва
S3 Борис   Шахты P4 винт каленый   Москва
S3 Борис   Шахты P6 шпилька каленый   Москва

 

Пример 7. Эквисоединение.

Пусть необходимо найти естественное соединение отношений S и Р по общему атрибуту, характеризующему город (в отношении S - это Город_П, а в отношении Р - Город_Д). Поскольку условие операции требует одинаковости имен атрибутов, по которым выполняется соединение, то применяется операция RENAME переименования атрибутов.

 

(S RENAME Город_П AS Город) JOIN (P RENAME Город_Д AS Город)
П# Имя Статус Город_П Д# Название Тип Вес
S1 Сергей   Москва P1 гайка каленый  
S1 Сергей   Москва P4 винт каленый  
S1 Сергей   Москва P6 шпилька каленый  
S2 Иван   Шахты P2 болт мягкий  
S2 Иван   Шахты P5 палец твердый  
S3 Борис   Шахты P2 болт мягкий  
S3 Борис   Шахты P5 палец твердый  
S4 Николай   Москва P1 гайка каленый  
S4 Николай   Москва P4 винт каленый  
S4 Николай   Москва P6 шпилька каленый  

 

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

Операция переименования позволяет изменить имя атрибута отношения и имеет вид:

RENAME <исходное отношение> <старое имя атрибута> AS <новое имя атрибута>,

где <исходное отношение> задается именем отношения либо выражением реляционной алгебры. В последнем случае выражение заключают в круглые скобки. Например:

RENAME Город_П AS Город_размещения_Поставщика.

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

RENAME <отн.> <ст. имя атр.1> AS <нов. имя атр.1>,<ст. имя атр.2> AS <нов. имя атр.2>,...,<ст. имя arp.N> AS <нов. имя aTp.N>.

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

EXTEND <исходное отношение> ADD <выражение> AS <новый атрибут>,

где к исходному отношению добавляется (ключевое слово ADD) <новый атрибут>, подсчитываемый по правилам, заданным <выражением>.

Исходное отношение может быть задано именем отношения и с помощью выражения реляционной алгебры, заключенного в круглые скобки. При этом имя нового атрибута не должно входить в заголовок исходного отношения и не может использоваться в <выражении>. Помимо обычных арифметических операций и операций сравнения, в выражении можно использовать различные функции, называемые итоговыми, такие как: COUNT (количество), SUM (сумма), AVG (среднее), МАХ (максимальное), MIN (минимальное). Например:

EXTEND (PJOIN SP) ADD (Вес * Количество) AS Общий_Вес.

Замечания.

Пользуясь операцией расширения, можно выполнить переименование атрибута. Для этого нужно в выражении указать имя атрибута, в конструкции AS определить новое имя этого атрибута, затем выполнить проекцию полученного отношения на множество атрибутов, исключая старый атрибут. Таким образом, запись (EXTEND S ADD Город_П AS Город) [П#, Имя, Статус, Город] эквивалента конструкции S RENAME Город_П AS Город.

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

EXTEND <отн.> ADD <выр.1> AS <атр.1>, <выр.2> AS <атр.2>,...,<выр.N> AS <атр.N>.

Операция подведения итогов SUMMARIZE выполняет "вертикальные" или групповые вычисления и имеет следующий формат:

SUMMARIZE <исх. отн> BY (<список атрибутов;") ADD <выр.> AS <новый атрибут>,

где исходное отношение задается именем отношения либо заключенным в круглые скобки выражением реляционной алгебры, <список атрибутов> представляет собой разделенные запятыми имена атрибутов исходного отношения A1, A2,..., AN, <выр.> - скалярное выражение, аналогичное выражению операции EXTEND, а <новый атрибут> - имя формируемого атрибута.

В списке атрибутов и в выражении не должен использоваться <новый атрибут>. Результатом операции SUMMARIZE является отношение R с заголовком, состоящим из атрибутов списка, расширенного новым атрибутом. Для получения тела отношения R сначала выполняется проецирование (назовем проекцию R1) исходного отношения на атрибуты A1, A2,..., AN, после чего каждый кортеж проекции расширяется новым (N+1)-M атрибутом. Поскольку проецирование, как правило, приводит к сокращению количества кортежей по отношению к исходному отношению (удаляются одинаковые кортежи), то можно считать, что происходит своеобразное группирование кортежей исходного отношения: одному кортежу отношения R1 соответствует один или более (если было дублирование при проецировании) кортежей исходного отношения. Значение (N+1)-гo атрибута каждого кортежа отношения R формируется путем вычисления выражения над соответствующей этому кортежу группой кортежей исходного отношения.

Пример 8. Подведение итогов. Пусть требуется вычислить количество поставок по каждому из поставщиков.

SUMMARIZE SP BY (П#) ADD COUNT AS Количество_поставок
П# Количество_поставок
S1  
S2  
S3  
S4  

 

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

SUMMARIZE SP BY (Д#) ADD SUM Количество AS Общее_число_прставок AVG Количество AS Среднее_число_поставок.

К основным операторам, позволяющим изменять тело существующего отношения, отнесем операции:

реляционного присвоения,

вставки,

обновления,

удаления.

Операцию присвоения можно представить следующим образом:
<выражение-цель>:= <выражение-источник>, где оба выражения задают совместимые (точнее, эквивалентные) по структуре отношения. Типичный случай выражений: в левой части - имя отношения, а в правой - некоторое выражение реляционной алгебры. Выполнение операции присвоения сводится к замене предыдущего значения отношения на новое (начальное значение, если тело отношения было пустым), определенное выражением-источником.

С помощью операции присвоения можно не только полностью заменить все значения отношения-цели, но и добавить или удалить кортежи. Приведем пример, в котором в отношение S дописывается один кортеж:

S:=S UNION {{< П#: 'S6' >, < Имя: 'Борис' >, < Статус: '50' >, <Город_П: 'Мадрид' >}}.

Более удобными операциями изменения тела отношения являются операции вставки, обновления и удаления. Операция вставки INSERT имеет следующий вид:

INSERT <выражение-источник> INTO <выражение-цель>,

где оба выражения должны быть совместимы по структуре. Выполнение операции сводится к вычислению <выражение-источник> и вставке полученных кортежей в отношение, заданное <выражение-цель>. Пример:

INSERT (S WHERE Город_П='Москва') INTO Temp.

Операция обновления UPDATE имеет следующий вид:

UPDATE <выражение-цель> <список элементов>,

где <список элементов> представляет собой последовательность разделенных запятыми операций присвоения <атрибут>:= <скалярное выражение>.

Результатом выполнения операции обновления является отношение, полученное после присвоения соответствующих значений атрибутам отношения, заданного целевым выражением. Например, UPDATE P WHERE Тип='каленый' Город:= 'Шахты'. Эта операция предписывает изменить значение атрибута Город (независимо от того, каким оно было) на новое значение - 'Шахты' таких кортежей отношения P, атрибут Тип которых имеет значение 'каленый'.

Операция удаления DELETE имеет следующий вид:
DELETE <выражение-цель>, где <выражение-цель> представляет собой реляционное выражение, описывающее удаляемые кортежи.

Например, DELETE S WHERE Статус < 20.

Операция реляционного сравнения может использоваться для прямого сравнения двух отношений. Она имеет синтаксис:

<выражение1>? <выражение2>,

где оба выражения задают совместимые по структуре отношения, а знак? - один из следующих операторов сравнения: = (равно),? (не равно), < (собственное подмножество), < (подмножество), >. (надмножество), > (собственное надмножество).

Например, сравнение: "Совпадают ли города поставщиков и города хранения деталей?" можно записать так: S [Город_П] = Р [Город_Д].

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

Свойство замкнутости позволяет записывать вложенные выражения реляционной алгебры, основой которых выступают рассмотренные ранее элементарные операций:

объединение

проекция

пересечение

выборка

и т. д.

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

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

2. Существуют тождественные преобразования, позволяющие по-разному записывать одно и то же выражение. Например, следующие выражения эквивалентны (здесь А - отношение, С, C1, C2 - выражения):

A WHERE C1 AND C2 и (A WHERE C1) INTERSECT (A WHERE C2), A WHERE C1 OR C2 и (A WHERE C1) UNION (A WHERE C2), A WHERE NOT С и A MINUS (A WHERE C).

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

 







ЧТО ПРОИСХОДИТ ВО ВЗРОСЛОЙ ЖИЗНИ? Если вы все еще «неправильно» связаны с матерью, вы избегаете отделения и независимого взрослого существования...

Конфликты в семейной жизни. Как это изменить? Редкий брак и взаимоотношения существуют без конфликтов и напряженности. Через это проходят все...

ЧТО ПРОИСХОДИТ, КОГДА МЫ ССОРИМСЯ Не понимая различий, существующих между мужчинами и женщинами, очень легко довести дело до ссоры...

Система охраняемых территорий в США Изучение особо охраняемых природных территорий(ООПТ) США представляет особый интерес по многим причинам...





Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2024 zdamsam.ru Размещенные материалы защищены законодательством РФ.