Зачем нужны базы данных

Используйте проверочные ограничения

База данных — это не просто набор таблиц. В неё встроено много инструментов, которые помогут с сохранностью и качеством данных.

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

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

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

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

Используйте , чтобы убедиться, что значения входят в диапазон (например чтобы цена не была отрицательной).

Масштабируемость SQL Server 2012:

  • Горячее добавление памяти и процессоров. SQL Server 2012 позволяет не выключая и не перезагружая сервер добавлять в него оперативную память и процессоры (эта функция должна также поддерживаться и оборудованием).
  • Репликация БД. SQL Server 2012 позволяет создавать копии БД в удалённых филиалах. Поддерживаются различные механизмы репликации с использованием транзакций, слияния и моментальных снимков. Репликация может быть как односторонней, когда например, изменения из центрального офиса реплицируются в филиалы, так и двусторонней. SQL Server 2012 поддерживает распределённые приложения и гео-распределённую кластеризацию.
  • Распределение ресурсов (Resource Governor). SQL Server 2012 позволяет распределять ресурсы и назначать приоритет для различных задач. Эта функция позволяет избежать случаев резкого падения производительности всего сервера, и прерывания работы всех пользователей при выполнении одной какой-либо сложной задачи.
  • Поддержка архитектуры Intel Itanium. Для сверхвысоких нагрузок выпущена версия SQL Server 2012, работающая на RISC-серверах, построенных на платформе Intel Itanium (IA-64). Данная редакция SQL Server 2012 применяется в крупных ЦОД для обработки больших объёмов информации. SQL Server 2012 в редакции Itanium поддерживает 64 процессорных ядер и 2 терабайта оперативной памяти. Поддерживаются технологии горячего добавления/отключения процессора и памяти, также поддерживается технология отказоустойчивого зеркалирования памяти и 8-ми узловая кластеризация.

Построение кластера является достаточно сложной задачей. При построении кластера проводится сложный анализ бизнес-приложения, использующего СУБД, рассчитывается нагрузочная способность и требуемые ресурсы, прогнозируется рост БД и рост нагрузочной способности, в соответствии с этим планируется инфраструктура кластеров и подбирается оборудование. Компания ЛанКей обладает опытом построения кластеров SQL Server в ряде крупных компаний. Планирование и развёртывание кластеров SQL Server производят сертифицированные инженеры MCSE, MCDBA, MCTS: SQL Server.

SQL — язык реляционной базы данных

Язык реляционной базы данных в системе SQL Server называется Transact-SQL. Это разновидность самого значимого на сегодняшний день языка базы данных — языка SQL (Structured Query Language — язык структурированных запросов). Происхождение языка SQL тесно связано с проектом, называемым System R, разработанным и реализованным компанией IBM еще в начале 80-х годов прошлого столетия. Посредством этого проекта было продемонстрировано, что, используя теоретические основы работы Эдгара Ф. Кодда, возможно создание системы реляционных баз данных.

В отличие от традиционных языков программирования, таких как C#, C++ и Java, язык SQL является множество-ориентированным (set-oriented). Разработчики языка также называют его запись-ориентированным (record-oriented). Это означает, что в языке SQL можно запрашивать данные из нескольких строк одной или нескольких таблиц, используя всего лишь одну инструкцию. Это одно из наиболее важных преимуществ языка SQL, позволяющее использовать этот язык на логически более высоком уровне, чем традиционные языки программирования.

Другим важным свойством языка SQL является его непроцедурность. Любая программа, написанная на процедурном языке (C#, C++, Java), пошагово описывает, как выполнять определенную задачу. В противоположность этому, язык SQL, как и любой другой непроцедурный язык, описывает, что хочет пользователь. Таким образом, ответственность за нахождение подходящего способа для удовлетворения запроса пользователя лежит на системе.

Язык SQL содержит два подъязыка: язык описания данных DDL (Data Definition Language) и язык обработки данных DML (Data Manipulation Language). Инструкции языка DDL также применяются для описания схем таблиц баз данных. Язык DDL содержит три общие инструкции SQL: CREATE, ALTER и DROP. Эти инструкции используются для создания, изменения и удаления, соответственно, объектов баз данных, таких как базы данных, таблицы, столбцы и индексы.

В отличие от языка DDL, язык DML охватывает все операции по манипулированию данными. Для манипулирования базами данных всегда применяются четыре общие операции: извлечение, вставка, удаление и модифицирование данных (SELECT, INSERT, DELETE, UPDATE).

Критерии оптимального инструмента разработки СУБД

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

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

Ничего, что бы отвечало этим требованиям, я найти не смог. Поэтому решил написать свой фреймворк, решающий поставленные задачи. В качестве основных технологий были выбраны TypeScript в связке с Angular2. При этом фреймворк проектировался так, чтобы его можно было использовать для разработки приложений не только с применением Angular, но и с помощью других JavaScript-библиотек. Хотелось бы поделиться тем, что получилось: возможно, кому-то пригодится.

Мультимодельные СУБД на основе реляционной модели

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

Автору, однако, больше нравится реализация мультимодельности в Microsoft SQL Server, на примере которого поддержка РСУБД документной и графовой моделей и будет описана.

Документная модель в MS SQL Server

О том, как в MS SQL Server реализована поддержка документной модели, на Хабре уже было две отличных статьи, ограничусь кратким пересказом и комментарием:

  • Работаем с JSON в SQL Server 2016
  • SQL Server 2017 JSON

Способ поддержки документной модели в MS SQL Server достаточно типичен для реляционных СУБД: JSON-документы предлагается хранить в обычных текстовых полях. Поддержка документной модели заключается в предоставлении специальных операторов для разбора этого JSON:

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

Вторым аргументом обоих операторов является выражение в JSONPath-подобном синтаксисе.

Абстрактно можно сказать, что хранимые таким образом документы не являются в реляционной СУБД «сущностями первого класса», в отличие от кортежей. Конкретно в MS SQL Server в настоящее время отсутствуют индексы по полям JSON-документов, что делает затруднительными операции соединения таблиц по значениям этих полей и даже выборку документов по этим значениям. Впрочем, возможно создать по такому полю вычислимый столбец и индекс по нему.

Дополнительно MS SQL Server предоставляет возможность удобно конструировать JSON-документ из содержимого таблиц с помощью оператора — возможность, в известном смысле противоположную предыдущей, обычному хранению. Понятно, что какой бы быстрой ни была РСУБД, такой подход противоречит идеологии документных СУБД, по сути хранящих готовые ответы на популярные запросы, и может решать лишь проблемы удобства разработки, но не быстродействия.

Наконец, MS SQL Server позволяет решать задачу, обратную конструированию документа: можно разложить JSON по таблицам с помощью . Если документ не совсем плоский, потребуется использовать .

Графовая модель в MS SQL Server

Поддержка графовой (LPG) модели реализована в Microsoft SQL Server тоже вполне предсказуемо: предлагается использовать специальные таблицы для хранения узлов и для хранения ребер графа. Такие таблицы создаются с использованием выражений и соответственно.

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

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

Проиллюстрируем сказанное примером. Пусть графовые данные имеют схему как на приведенном рисунке. Тогда для создания соответствующей структуры в базе данных нужно выполнить следующие DDL-запросы:

Основная специфика таких таблиц заключается в том, что в запросах к ним возможно использовать графовые паттерны с Cypher-подобным синтаксисом (впрочем, «» и пр. пока не поддерживаются). Также на основе измерений производительности можно предположить, что способ хранения данных в этих таблицах отличен от механизма хранения данных в обычных таблицах и оптимизирован для выполнения подобных графовых запросов.

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

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

О языке SQL

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

Тогда на помощь приходил язык программирования SQL. Вообще, он разрабатывался еще в 1986 году, но массово его начали применять только с 2008 года. Создавать и работать с базами данных на чистом языке SQL довольно-таки неудобно. Весь этот процесс происходит через командную строку, выводится база там же.

Для упрощения создания баз данных появились программы, которые имеют графический интерфейс и практически сами создают запросы на SQL языке. То есть пользователь ничего руками не пишет, лишь создает при помощи функции Drag and drop. Но хочется отметить, что изучение этого языка просто необходимо при разработке больших баз данных. Вы должны понимать, как все это работает, как делаются запросы и прочее.

Механизмы доступа к данным базы на сервере.

Все серверные СУБД
имеют клиентскую часть, которая обращается
к БД посредством СУБД. Между клиентским
прилож. и СУБД не существует прямой
связи и дополнительно встраиваются
программные модули, позволяющие
клиентскому приложению получать доступ
к БД, создаваемым с помощью разных СУБД.
Такие модули называются механизмами
доступа к данным.Существует
2 основных способа доступа к данным из
клиентских приложений: использование
прикладного интерфейса и использование
универсального программного интерфейса.
Прикладной
программный интерфейс
(API) предст. соб. набор функций, вызываемых
из клиентского приложения. Он может
работать только с СУБД данного
производителя и при ее замене придется
переписывать значительную часть кода
клиентского приложения.Универсальный
механизм доступа
к данным обеспечивает возможность
использования одного и того же интерфейса
для доступа к разным типам СУБД. Обычно
он реализован в виде специальных
дополнительных модулей, называемых
драйверами.
Наиболее распространенным программным
интерфейсом, обеспечивающим доступ к
данным конкретной базы данных является
ODBC
фирмы Microsoft. Для доступа к данной конкретн.
СУБД, кроме клиентск. части необходимо
приложение ODBC
и драйвер. ODBC – открытый стандарт
совместимости БД, разработанный в 1990-х
для предоставления независимого от
СУБД способа обработки информации из
реляц БД. ODBC – интерфейс, с помощью
которого прикладн проги могу обращ-ся
к БД и обраб-ть независ от СУБД способом.
ODBC-драйвер
выполняет все вызовы ODBC-функций и
«переводит» их на язык источника данных.
СУБД хранит и выводит данные в ответ на
запросы со стороны ODBC-драйвера. Приложение
ODBC
– для определения доступа источника
данных для конкрет. компа и описания
источн. данных. Задание ODBC-источника
данных является действием, которое
осуществляется средствами операционной
системы, управляющей компьютером.
Источник
данных –
структура дан. ODBC,
идентифицирующая БД и СУБД, которая ее
обрабатывает. С его помощью могут быть
заданы: 1.пользовательский
– ист. дан., доступный только текущему
пользователю на текущем компьютере;
2.файловый
– фал, кот. может совместно использоваться
пользователем БД; 3.системный
– источник данных, доступный всем
пользователям и службам текущего
компьютера. Преимущества: — простота
разработки приложения; — позволяет
создавать распределенные гетерогенные
приложения без учета конкретной СУБД
– приложения становятся независимыми
от СУБД.

Недостатки: —
снижение скорости доступа к данным; —
увеличение времени обработки запросов;
— предварит инсталляция и настройка
ОДВС на кждом рабочем месте; — представляет
доступ только к SQL-ориентированным
БД.

OLEDB
и ADO
– осн. часть универс-го мех. доступа к
данным фирмы Майкрософт, позволяющ.
осуществить доступ к реляцион. и
нереляцион. источн. данных. OLEDB
– реализация разработанного Майкрософт
объективного стандарта OLE.
Для доступа к источнику дан. С пом. OLEDB
треб-ся на клиентском компе установаить
провайдер для данной СУБД. Механизм
доступа к данным ADO:
– высокоуровнев. программн. интерфейс
для доступа к дан. из приложения; —
Содержит набор объектов, исп-емых для
соединения с источником дан., чтения,
добавления и модификации данных.

SQLite3 manager LITE

Сайт производителя: http://www.pool-magic.net/sqlite-manager.htm

Цена: .

Критерий Оценка (от 0 до 2)
Функциональность 2
Цена 2
Работа с UTF-8
Русский интерфейс
Удобство 1
Итог 5

По сравнению с предыдущей программой “SQLite3 manager LITE” выглядит более функциональным. Кроме того, что можно просто просматривать данные в таблицах, также можно просматривать и создавать триггеры, индексы, представления и т.д. Дополнительно можно экспортировать все мета-данные базы данных. При этом можно создавать файлы с данными для экспорта таблиц в Paradox и Interbase.

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

У бесплатной версии есть один недостаток – не понимает данные в кодировке UTF-8. Есть, конечно, возможность указать кодировку базы данных при открытии файла, но в списке кодировок UTF-8 отсутствует. Как работает Full-версия программы я так и не увидел, т.к. на сайте производителя чёрт ногу сломит. Висит какой-то непонятный javascript, выводящий непонятную инфу. В общем, сложилось впечатление, что проект успешно заглох.

Установите для себя правила именования таблиц и полей

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

Ещё нужно определиться как будут называться таблицы — во множественном числе () или в единственном (). Каждая базовая структура в БД обычно настроена на множественное число, поэтому и именовать таблицы стоит соответственно.

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

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

Ключевые возможности

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

Шаблоны документов — это печатные формы данных. Они создаются в любом текстовом редакторе, способном сохранять в форматах: Microsoft Word (*.docx, *.docm, *.xml), OpenOffice Writer (*.odt), OpenOffice Calc (*.ods) или HTML (*.html).

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

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

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

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

Работа в локальной сети и сети Интернет. Ядром базы данных служит сервер баз данных Firebird. Благодоря клиент-серверной технологии с базой данных могут работать удаленно по локальной сети или сети Интернет неограниченное число пользователей.

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

Скрипты. Начиная с DataExpress 3 beta в программу встроен скриптовый движок RemObject Pascal Script. Скрипты для тех кому выражения немного жмут :). Возможности скриптов очень широки: управление почти любым элементом интерфейса программы, управление стандартными окнами, создание своих вариантов окон, автоматизация OLE, подключение внешних DLL-библиотек, полноценные SQL-запросы и т. д.

SQL-запросы. В скриптах можно составлять полноценные выражения SELECT. Вам доступна вся мощь Firebird SQL.

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

SQLiteManager

Сайт производителя: http://www.sqlabs.com/

Цена: 49$ Есть Demo-версия

Критерий Оценка (от 0 до 2)
Функциональность 2
Цена 1
Работа с UTF-8 2
Русский интерфейс
Удобство 1
Итог 6

SQLiteManager как и предыдущая программа имеет достаточно удобный интерфейс, прекрасно понимает UTF-8 и наряду с этим имеет ряд своих “фишек”. Среди которых:

  1. Анализатор SQL-запросов
  2. Проверка целостности базы данных
  3. Оптимизация базы данных
  4. Возможность использования в программе своих скриптов (по-моему VBScript) для повышения удобства работы.

К дополнительным функциям программы можно отнести возможность генерации отчётов по базе данных. Demo-версия имеет свои жёсткие ограничения по запросам, например, в результаты SELECT попадают только первые 20 записей из набора. В плане удобства работы подпортило впечатление уж очень сильно мельтешение при перерисовки окон. У меня не такой уж и древний комп, но даже при 512 Mb видюшки окна заметно моргали.

Классификации СУБД

По модели данных

Примеры:

  • Иерархические
  • Сетевые
  • Реляционные
  • Объектно-ориентированные
  • Объектно-реляционные
По степени распределённости
  • Локальные СУБД (все части локальной СУБД размещаются на одном компьютере)
  • Распределённые СУБД (части СУБД могут размещаться не только на одном, но на двух и более компьютерах).
По способу доступа к БД

Файл-серверные

В файл-серверных СУБД файлы данных располагаются централизованно на файл-сервере. СУБД располагается на каждом клиентском компьютере (рабочей станции). Доступ СУБД к данным осуществляется через локальную сеть. Синхронизация чтений и обновлений осуществляется посредством файловых блокировок.
Преимуществом этой архитектуры является низкая нагрузка на процессор файлового сервера.
Недостатки: потенциально высокая загрузка локальной сети; затруднённость или невозможность централизованного управления; затруднённость или невозможность обеспечения таких важных характеристик, как высокая надёжность, высокая доступность и высокая безопасность. Применяются чаще всего в локальных приложениях, которые используют функции управления БД; в системах с низкой интенсивностью обработки данных и низкими пиковыми нагрузками на БД.
На данный момент файл-серверная технология считается устаревшей, а её использование в крупных информационных системах — недостатком.
Примеры: Microsoft Access, Paradox, dBase, FoxPro, Visual FoxPro.

Клиент-серверные

Клиент-серверная СУБД располагается на сервере вместе с БД и осуществляет доступ к БД непосредственно, в монопольном режиме. Все клиентские запросы на обработку данных обрабатываются клиент-серверной СУБД централизованно.
Недостаток клиент-серверных СУБД состоит в повышенных требованиях к серверу.
Достоинства: потенциально более низкая загрузка локальной сети; удобство централизованного управления; удобство обеспечения таких важных характеристик, как высокая надёжность, высокая доступность и высокая безопасность.
Примеры: Oracle Database, Firebird, Interbase, IBM DB2, Informix, MS SQL Server, , PostgreSQL, MySQL, Caché, ЛИНТЕР.

Встраиваемые

Встраиваемая СУБД — СУБД, которая может поставляться как составная часть некоторого программного продукта, не требуя процедуры самостоятельной установки. Встраиваемая СУБД предназначена для локального хранения данных своего приложения и не рассчитана на коллективное использование в сети.
Физически встраиваемая СУБД чаще всего реализована в виде подключаемой библиотеки. Доступ к данным со стороны приложения может происходить через SQL либо через специальные программные интерфейсы.
Примеры: OpenEdge, SQLite, BerkeleyDB, Firebird Embedded, Microsoft SQL Server Compact, ЛИНТЕР.

Групповая проверка доработок

Обработка для массовой проверки доработок конфигурации: Открытие форм, Печать, Формирование отчетов, Проведение документов, Запись справочников, ПВХ, ПВР.
Выдает список обнаруженных ошибок.
Рекомендуется применять для тестирования обновленной конфигурации, перед установкой пользователям.
В коде используются универсальные методы поэтому подходит для большинства конфигураций, построенных на базе библиотеки стандартных подсистем.
Проверялась на Зарплата и управление персоналом КОРП 3.1.8.216, Управление торговлей 11, 1С:ERP Управление предприятием 2.4.7.141, Бухгалтерия предприятия КОРП 3.0.68.66.

2 стартмани

Отказоустойчивость SQL Server 2012:

Database Mirroring в SQL Server 2012
 

Кластеры высокой доступности (High Availability Cluster). Крупные компании, которым требуется непрерывность функционирования, постоянная доступность БД и распределение нагрузки, используют SQL Server 2012 в режиме кластера. SQL Server 2012 поддерживает 16-ти узловую кластеризацию, причём кроме кластеризации ядра СУБД, поддерживается также кластеризация Analysis Services, Notification Services и Replication Services. Кластер SQL Server 2012 позволяет обеспечить режим функционирования 24/7 для критических бизнес-приложений.

Двух узловой кластер на базе SQL Server 2012

Состав СУБД

Обычно современная СУБД содержит следующие компоненты:

  • ядро, которое отвечает за управление данными во внешней и оперативной памяти и журнализацию,
  • процессор языка базы данных, обеспечивающий оптимизацию запросов на извлечение и изменение данных и создание, как правило, машинно-независимого исполняемого внутреннего кода,
  • подсистему поддержки времени исполнения, которая интерпретирует программы манипуляции данными, создающие пользовательский интерфейс с СУБД
  • сервисные программы (внешние утилиты), обеспечивающие ряд дополнительных возможностей по обслуживанию информационной системы
Оцените статью
Рейтинг автора
5
Материал подготовил
Андрей Измаилов
Наш эксперт
Написано статей
116
Добавить комментарий