<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>NoSQL</title>
    <description/>
    <link>https://tproger.ru/tag/nosql</link>
    <atom:link href="https://tproger.ru/tag/nosql/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sun, 25 Oct 2026 02:23:46 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>NoSQL</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Куда двигаться после изучения Django: советы для Python-разработчиков</title>
      <link>https://tproger.ru/articles/kuda-dvigatsya-posle-izucheniya-django--sovety-dlya-python-razrabotchikov-257299</link>
      <comments>https://tproger.ru/articles/kuda-dvigatsya-posle-izucheniya-django--sovety-dlya-python-razrabotchikov-257299?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгения Епихина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kuda-dvigatsya-posle-izucheniya-django--sovety-dlya-python-razrabotchikov-257299</guid>
      <description><![CDATA[<p>В статье разбираемся, почему Django — далеко не финиш в карьере, и в каких направлениях можно двигаться Python-разработчику.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kuda-dvigatsya-posle-izucheniya-django--sovety-dlya-python-razrabotchikov-257299">Куда двигаться после изучения Django: советы для Python-разработчиков</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Парсинг]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[Raspberry Pi]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Асинхронное программирование]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[NoSQL]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Neo4j]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 12 Aug 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Django — это веб-фреймворк на языке Python, который позволяет быстро создавать сложные веб-приложения. Он включает в себя готовые компоненты для работы с базами данных, маршрутизацией URL, обработкой форм, аутентификацией пользователей и админ-панелями, что значительно ускоряет разработку и упрощает поддержку проектов.</p><p>Владение Django — это старт, а не финиш. Чтобы оставаться востребованным, нужно постоянно расширять знания и навыки. В этой статье разберем пути и направления для улучшения своих компетенций.</p><h2>Почему владение Django — не предел для разработчика</h2><h2>Особенности Django</h2><p>Django используют для разработки веб-приложений разной сложности: при работе с большими базами данных, для создания сервисов, способных обслуживать большое количество пользователей. На нём создают соцсети, новостные сайты, веб-версии приложений, онлайн-магазины.</p><p>Основные плюсы:</p><ul><li><b>Полноценный стек</b>: ORM для работы с базой, мощная система маршрутизации URL, шаблоны для рендеринга, встроенная админка, формы, система аутентификации и авторизации.</li><li><b>Архитектура MTV (Model-Template-View)</b>: похожа на классический MVC, но с особенностями, которые упрощают разделение логики, представления и данных.</li><li><b>Безопасность</b>: Django автоматически защищает от CSRF, XSS, SQL-инъекций и других распространенных атак. Не нужно писать много дополнительного кода.</li><li><b>Активное сообщество и экосистема</b>: тысячи сторонних пакетов, расширений и готовых решений.</li><li><b>Поддержка нескольких баз данны</b>х: PostgreSQL, MySQL, SQLite, Oracle и др.</li></ul><p>Ограничения:</p><ul><li><b>Синхронная природа Django</b>.</li><li><b>Монолитность</b>: архитектура фреймворка ориентирована на создание крупных приложений, но в микросервисах может быть избыточна.</li><li><b>Ограниченная гибкость ORM</b>: нестандартные SQL-запросы иногда сложно выразить средствами ORM, приходится использовать raw SQL или сторонние библиотеки для запросов.</li><li><b>Строгие правила организации кода</b>: требуют дисциплины и могут ограничивать свободу в архитектурных решениях.</li><li><b>Недостаточная производительность</b>: уступает лёгким асинхронным фреймворкам (например, FastAPI), особенно под высокими нагрузками. Но для большинства проектов пока это не критично.</li></ul><h2>В каком направлении двигаться после изучения Django</h2><blockquote>Задача — создавать продукт, который будет нужен конечному потребителю.</blockquote><h3>Первое направление для развития — расширить инструментарий для решения разных задач в веб-разработке</h3><p>Возможные пути:</p><ul><li>Изучить другие веб-фреймворки (Flask, FastAPI)</li><li>Углубиться в асинхронное программирование (asyncio, aiohttp)</li><li>Работать с API и микросервисами</li></ul><h4>Flask и FastAPI</h4><p>Flask — минималистичный микрофреймворк, даёт полную свободу в выборе компонентов. Используют для небольших приложений и микросервисов.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-12/bbe7c040-14de-426d-9a10-c556f7319bee.png" alt="" /><figcaption>Пример простой команды на Flask</figcaption></figure><p>FastAPI — современный асинхронный фреймворк, ориентирован на создание высокопроизводительных API. Поддерживает стандарт OpenAPI и автоматическую генерацию документации. Он быстрее Flask и Django благодаря asyncio и Pydantic.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-12/33a27277-5136-4a03-8af2-f436db42fa99.png" alt="" /><figcaption>Пример простого API на FastAPI</figcaption></figure><h4>Асинхронное программирование</h4><p>Веб-разработка всё активнее использует асинхронные технологии. Django не всегда справляется с задачами высокой конкурентной нагрузки.</p><p>Поэтому изучение asyncio — стандартной библиотеки Python для асинхронного программирования — откроет перед вами новые возможности. Вместе с aiohttp или тем же FastAPI вы сможете создавать приложения, которые обрабатывают тысячи одновременных соединений. Это особенно важно для real-time сервисов, чат-приложений и систем с интенсивным обменом данными.</p><h3>Второе направление — расширить навыки в смежных областях</h3><p>Можно пойти по пути расширения компетенций за пределы основной специализации. Важно не только уметь писать код, но и понимать, как приложения разворачиваются и работают в продакшене. Знание DevOps-практик помогает наладить эффективное взаимодействие между разработкой и эксплуатацией.</p><h4>Изучение DevOps и контейнеризации</h4><p>Контейнеры позволяют запускать приложения в изолированной среде, это упрощает настройку и развертывание. Например, Docker помогает упаковать приложение с зависимостями в один контейнер, а Kubernetes — управлять такими контейнерами в продакшене. Знание этих технологий улучшит взаимодействие с операционной командой и ускорит выпуск новых версий приложений.</p><h4>CI/CD и автоматизация процессов</h4><p>Непрерывная интеграция (Continuous Integration) и непрерывное развертывание (Continuous Deployment) — ключевые практики современной разработки ПО. Они позволяют автоматизировать сборку, тестирование и доставку приложений, масштабировать процессы.</p><p>Инструменты CI/CD (например, Jenkins, GitLab CI/CD, GitHub Actions) помогают настроить автоматические пайплайны, которые обеспечивают быструю обратную связь и минимизируют человеческий фактор в релизах. Автоматизация процессов снижает количество ошибок и позволяет сосредоточиться на разработке новых функций.</p><p>Настройка непрерывной интеграции и доставки (Continuous Integration / Continuous Delivery) снижает поток ошибок при релизах и экономит время. Пример: GitHub Actions для автоматического запуска тестов и сборки проекта при каждом коммите.</p><h4>Больше знаний в области баз данных</h4><p>Помимо классических реляционных баз данных (PostgreSQL, MySQL), современные приложения часто используют NoSQL для специфичных задач. MongoDB, Redis, Cassandra обеспечивают гибкость в хранении данных, горизонтальное масштабирование и высокую производительность при работе с большими объемами информации.</p><p>Графовые базы данных (Neo4j, ArangoDB) предназначены для эффективного хранения и анализа связей между объектами, что важно для социальных сетей, рекомендательных систем и других приложений с богатой структурой.</p><p>Так, Redis хорошо подходит для кэширования данных, а Neo4j — для сложных связей между объектами.</p><h3>Третье направление — переход к другим аспектам Python-разработки</h3><p>Рассмотрим четыре варианта карьерного развития для Python-программиста: Data Science и машинное обучение, автоматизация бизнес-процессов, разработка десктопных приложений и встраиваемые системы (IoT).</p><p>Почему стоит попробовать?</p><ul><li>Высокий спрос на специалистов. Они востребованы в банках и инвестиционных компаниях, в сфере медицины и биотехнологии, в консалтинге,  автомобильной промышленности и т.д..</li><li>Широкий набор библиотек: pandas, NumPy, scikit-learn, TensorFlow, PyTorch.</li><li>Возможность работать с реальными задачами: от бизнеса до науки.</li></ul><h4>Автоматизация и скрипты для бизнеса</h4><p>Python часто используется для автоматизации рутинных задач: парсинга данных, обработки файлов, интеграции систем, генерации отчетов. Создание скриптов для автоматизации бизнес-процессов помогает повысить эффективность работы и снизить количество ошибок.</p><p>Знание таких библиотек, как openpyxl (работа с Excel), requests (HTTP-запросы), BeautifulSoup и Scrapy (парсинг веб-страниц), а также умение писать скрипты под конкретные задачи, делают разработчика ценным специалистом в корпоративной среде.</p><p>Примеры задач:</p><ul><li>Автоматическая загрузка данных из Excel и их преобразование</li><li>Скрипты для отправки email-рассылок</li><li>Интеграция с CRM и другими сервисами через API</li></ul><h4>Разработка десктопных приложений (PyQt, Kivy)</h4><p>Хотя сейчас популярность уходит к вебу и мобильным платформам, десктопные приложения на Python востребованы в таких сферах: инструменты для анализа, редакторы, утилиты.</p><p>Инструменты для создания:</p><ul><li>PyQt — мощный фреймворк для создания кроссплатформенных GUI.</li><li>Kivy — библиотека для разработки приложений с поддержкой сенсорных экранов.</li></ul><p>Этот путь подходит тем, кто хочет создавать удобные инструменты с графическим интерфейсом для пользователей на Windows, macOS или Linux.</p><h4>Встраиваемые системы и IoT</h4><p>В области IoT и встроенных систем Python набирает популярность благодаря легкости освоения и поддержке на маломощных устройствах. Помогают в этом  платформы по типу Raspberry Pi и MicroPython.</p><p>Изучение этого направления открывает возможности работы с аппаратным обеспечением, созданием прототипов и внедрением инновационных решений в промышленности и бытовой технике.</p><p>Например, с помощью Python на Raspberry Pi можно  разрабатывать датчики для мониторинга состояния оборудования на производстве и разрабатывать прототипы носимых устройств для сбора данных о здоровье.</p><blockquote>Если рассматривать профессию “Python-разработчик на Django”, то сразу получится сужение до конкретной библиотеки на конкретном языке. Если же в резюме у специалиста стоит, что он “разработчик Python”, возможностей сильно больше. Если написать про себя “разработчик”, будет не понятно, разработчик чего. Но изменив резюме на “DevOps инженера”, становится понятен карьерный трек.</blockquote>]]></content:encoded>
    </item>
    <item>
      <title>Как работает Sharding в базах данных?</title>
      <link>https://tproger.ru/articles/kak-rabotaet-sharding-v-bazah-dannyh-</link>
      <comments>https://tproger.ru/articles/kak-rabotaet-sharding-v-bazah-dannyh-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Владислав Устинов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-rabotaet-sharding-v-bazah-dannyh-</guid>
      <description><![CDATA[<p>Что такое Sharding. Показываем, как работает шардинг в базах данных. Рассматриваем пошаговую инструкцию и основные нюансы ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-rabotaet-sharding-v-bazah-dannyh-">Как работает Sharding в базах данных?</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[NoSQL]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 15 May 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Когда данных становится слишком много для одного сервера, на помощь приходит шардинг — способ разбить базу на части и разложить их по разным машинам. Это помогает масштабироваться, ускоряет запросы и снижает нагрузку. Но вместе с плюсами шардинг приносит и новые сложности: как искать данные, как проводить транзакции между серверами, как считать агрегаты. Сегодня разбираемся, как всё устроено, какие бывают подходы к шардингу и что нужно учесть при его внедрении.</p><h2>Как работает database sharding</h2><p>Database sharding (шардирование базы данных) — это техника горизонтального масштабирования, при которой большая база разделяется на несколько частей. Их называют шардами. Эти шарды распределяются по другим серверам и связываются в одну систему. Рассмотрим подробнее.</p><h3>Принцип: разбиение данных на независимые сегменты (шарды)</h3><p>Каждый шард работает как отдельная независимая база данных. Ключевым элементом здесь выступает ключ шардирования (shard key). Это правила, которые определяют, в какой именно шард попадёт конкретная строка данных.</p><p>Например, мы можем задать правило: если у нас есть user_id и его значение меньше тысячи, то данные попадают в шард 1, если значение больше тысячи, то в шард 2.</p><p>Главная цель такого разделения — добиться независимости шардов. В идеале запрос, касающийся данных одного пользователя (или одного документа, заказа и т. д.), должен обрабатываться только одним шардом.</p><p>Так, мы можем параллельно обрабатывать много запросов и увеличивать пропускную способность системы.</p><h3>Общая архитектура: клиент — роутер — шард</h3><p>Чтобы приложение могло понять, в какой шард отправить запрос, нужна особая архитектура.</p><p><b>Клиент</b>: Программа на стороне пользователя, которая отправляет стандартный запрос к базе данных (например, SELECT * FROM users WHERE user_id = 123).</p><p><b>Маршрутизатор запросов</b> или роутер (Query Router): Это что-то вроде посредника между клиентом и шардом, который выполняет роль диспетчера. Он принимает запрос, при помощи sharding ключа определяет, что это за данные, в какой шард и с какой целью их надо отправить. Далее он отправляет запрос на нужный шард.</p><p><b>Шард (Shard)</b>: Получает запрос, выполняет и возвращает результат обратно маршрутизатору, который затем передаёт его клиенту.</p><p>Благодаря такой архитектуре мы можем «скрыть» database sharding на стороне клиента и обеспечить централизованное управление запросами. Не надо сильно заморачиваться с кодом и архитектурой приложений, ведь вся логика будет на серверах.</p><h3>Основные компоненты: шард, маршрутизатор, реплика-сеты</h3><p>Мы уже рассмотрели, что такое шарды и маршрутизаторы, теперь обратим внимание на реплика-сеты. Это сервера с копией данных шардов. Если главный сервер шарда выходит из строя, одна из реплик автоматически берёт на себя его роль. Так, мы можем повысить отказоустойчивость нашей системы.</p><p>Ещё в этой схеме обычно применяют серверы конфигурации. Это отдельный компонент, который хранит метаданные о шардах. Он содержит информацию о том, какие диапазоны ключей или хеши какому шарду соответствуют. Маршрутизаторы периодически обращаются к серверам конфигурации, чтобы получить актуальную карту распределения данных и лучше понять, в какой шард направить тот или иной запрос.</p><h2>Виды шардинга</h2><p>Существует много вариантов, как разбить базу данных на шарды. Этот выбор будет зависеть от множества факторов: структуры данных, типичных запросов, требований к производительности и сложности управления. Разберём основные виды шардинга.</p><h3>Горизонтальный sharding (по строкам): самый популярный</h3><p>При горизонтальном шардинге мы «нарезаем» нашу базу данных по строкам. Допустим, у нас таблица с клиентами. Мы задаём диапазон ключу шардирования с user_id от 1 до 1 000 000. Данные в этом диапазоне, построчно будут храниться в шадре 1. Если user_id попадает в диапазон от 1 000 001 до 2 000 000, то эти данные отправляем на шадр 2. И так далее.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-04-30/ced7c0e7-fcbb-4f28-870b-91682a38f689.png" alt="Что такое Sharding" /><figcaption>Горизонтальный шардинг</figcaption></figure><p>Благодаря этому способу мы можем равномерно распределять данные, и нам будет проще масштабировать систему при помощи создания новых шадров и добавления серверов.</p><p>Горизонтальный sharding — идеальный вариант, когда основная проблема — это огромное количество строк в таблицах и высокая нагрузка на чтение/запись.</p><h3>Вертикальный шардинг (по столбцам): разделение по функциональности</h3><p>Если горизонтальный шардинг режет таблицу поперёк (по строкам), то вертикальный — вдоль, разделяя столбцы. Таблица делится на несколько с меньшим количеством столбцов. Обычно они группируются по частоте использования или по смысловой нагрузке. Например, в таблице юзеров можно выделить часто запрашиваемые user_id, username, email в одну таблицу, а редко используемые — biography, preferences, last_login_details — в другую.</p><p>Это полезно, когда у таблицы очень много столбцов или когда группы столбцов имеют совершенно разные паттерны доступа. Мы можем улучшить производительность запросов, так как они работают с таблицами меньшей ширины.</p><h3>Directory-based sharding: использование хеш-таблицы маршрутов</h3><p>При горизонтальном и вертикальном шардинге маршрутизатор часто сам, при помощи специальных функций, определяет, какие данные в какой шадр отправить. Это не всегда удобно. При таком подходе мало гибкости. Поэтому был придуман вид шардинга, который опирается на хеш-таблицы и называется directory-based. Его суть в том, что мы создаём централизованный каталог, который связывает наши ключи шардирования и шарды.</p><p>Вот пример того, как это работает:</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-04-30/8dc151d5-591c-4a6c-8564-898afc26aaa1.png" alt="Как работает шардинг в базах данных" /><figcaption>Directory-based sharding</figcaption></figure><ul><li>Клиентское приложение отправляет запрос (например, получить данные для order_id = 98765).</li><li>Маршрутизатор запросов перехватывает его.</li><li>Маршрутизатор обращается к каталогу: с запросом, где найти order_id = 98765.</li><li>Каталог ищет в своей таблице соответствий правило, под которое подпадает order_id = 98765. Для быстрого поиска он часто использует эффективные структуры данных, такие как хеш-таблицы или B-деревья (это внутренняя деталь реализации самого каталога).</li><li>Допустим, каталог находит правило «Диапазон order_id 90000-99999 → Shard-3» и сообщает это маршрутизатору.</li><li>Маршрутизатор перенаправляет исходный запрос на Shard-3.</li></ul><p>При таком подходе удобнее перемещать данные между шардами, изолировать их и менять логику.</p><h3>Range-based sharding: разбиение по диапазонам значений</h3><p>По сути, это тот же горизонтальный sharding с разбиением данных на кусочки по строкам при помощи диапазонов.</p><p>Администратор системы (или автоматизированный инструмент) определяет границы диапазонов для ключа шардинга. Маршрутизатор получает запрос, смотрит на значение этого ключа и сравнивает его с известными диапазонами, чтобы определить целевой шард.</p><p>Этот способ простой, логичный и отлично подходит для работы с данными за определённый период. Но у него есть проблема. Допустим, мы запустили форум и проводим шардирование по трём ключам:</p><ul><li>id от 1 до 1000 — шард 1;</li><li>id от 1001 до 2000— шард 2;</li><li>id от 2001 до 3000 — шард 3.</li></ul><p>Когда пользователи начнут регистрироваться, у нас будет активен шард 1, потом шард 2. Далее вся нагрузка перейдёт на шард 3. Они не будут одновременно равномерно работать. Это может стать проблемой при оптимизации.</p><h3>Hash-based sharding: равномерное распределение по хешу ключа</h3><p>Этот подход помогает добиться максимально равномерного распределения нагрузки по всем шардам. Работает следующим образом:</p><p><b>Берём значение ключа</b> для конкретной строки данных (например, user_id = 2001).</p><p><b>Применяем к нему хеш-функцию</b>. Хеш-функция (например, MD5, SHA-1, MurmurHash) — это алгоритм, который превращает входные данные (наш user_id) в строку или число фиксированной длины (хэш), которое выглядит почти случайно. Даже небольшое изменение на входе (например, user_id = 2001 и user_id = 2002) обычно даёт совершенно разные хеши.</p><p><b>Вычисляем номер шарда</b>. Чаще всего делим значение хеша на количество шардов и берём остаток от деления. Например, 548291 % 3 = 2. Далее в зависимости от остатка распределяем данные по шардам. Значение с остатком 2 пойдёт в шард 2, если остаток 1, то в шард 1 и так далее.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-04-30/bb6c10d3-0c7a-4499-ab9a-11d2d3c34be0.jpg" alt="Что такое Sharding" /><figcaption>Hash-based sharding</figcaption></figure><p>Так мы получаем более равномерное распределение данных. Но из минусов — в такой базе сложно обрабатывать диапазоны и добавлять новые шарды в систему.</p><h2>Примеры реализации</h2><h3>MongoDB: встроенная поддержка шардинга</h3><p>MongoDB — это NoSQL база данных, которая была разработана с закосом на горизонтальное масштабирование. То есть она адаптирована к тому, чтобы работать на нескольких серверах и расширять это число по мере необходимости. Поэтому sharding здесь доступен из коробки, нам не надо заморачиваться со внешними расширениями.</p><p>Рассмотрим пример, как настроить sharding и работать с ним:</p><ul><li>sh.addShard() — добавляем сервер в кластер как шард. MongoDB понимает, что может использовать этот сервер для хранения части данных.</li><li>use socialApp; sh.enableSharding("socialApp") — переключаемся на базу данных «socialApp». При помощи команды sh.enableSharding() разрешаем шардинг в этой БД.</li><li>sh.shardCollection("socialApp.users", { "user_id": 1 }) — применяем sharding к коллекции users. Мы указываем полное имя коллекции (socialApp.users) и ключ шарда ({ "user_id": 1 }). Цифра 1 означает, что мы используем шардинг по диапазонам. Эти диапазоны не нужно задавать вручную, MongoDB определяет их самостоятельно.</li><li>db.users.insertMany([...]) — вставляем данные в коллекцию users. MongoDB автоматически определяет, на какой шард поместить каждого пользователя.</li><li>db.users.findOne({ user_id: 1 }) — запрашиваем данные пользователя user_id = 1. Mongos сам определит, на каком шарде они находятся.</li></ul><h3>PostgreSQL + Citus</h3><p>В PostgreSQL нет поддержки встроенного шардинга, поэтому приходится устанавливать на сервер Citus. Это популярное расширение, которое как раз добавляет возможности горизонтального масштабирования и шардинга. Оно превращает кластер стандартных серверов PostgreSQL в распределённую базу данных.</p><p>Посмотрим на пример использования SQL-команд для настройки шардинга с помощью Citus:</p><ul><li>CREATE EXTENSION citus; — активируем Citus в текущей базе данных.</li><li>CREATE TABLE app_logs (...) — создаём таблицу app_logs на узле-координаторе точно так же, как создали бы обычную таблицу в PostgreSQL.</li><li>SELECT create_distributed_table('app_logs', 'service_name'); — при помощи этой команды включаем sharding. Citus понимает, что таблицу app_logs нужно распределить по рабочим узлам, используя поле service_name как ключ шардинга. Citus по умолчанию применяет Hash-based sharding, то есть, равномерно распределяет по шардам при помощи хеш-функций.</li><li>INSERT INTO app_logs — добавляем данные логов. Citus перехватывает запрос, вычисляет хеш от значения service_name для каждой строки и распределяет данные по шардам.</li><li>SELECT ... FROM app_logs — запрашиваем данные. Если фильтруем по service_name (как в первом SELECT), Citus направит запрос на нужный шард.</li></ul><h3>MySQL + Vitess</h3><p>MySQL — ещё одна система управления базами данных, у которой по умолчанию нет поддержки шардинга. Ситуацию спасает Vitess. Это система кластеризации баз данных — что-то вроде сторонней платформы, которая помогает организовать работу в рамках кластера.</p><p>Vitess вместо прямых команд для шардинга определяет его правила в отдельном JSON-файле, который называется VSchema (Vitess Schema).</p><p>Допустим, у нас есть база данных commerce. Вот как она выглядит в виде кода:</p><p>А вот так она выглядит в виде таблицы:</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-04-30/1dd751fd-aa6e-49f1-9883-6431fa53b08f.png" alt="Как работает шардинг в базах данных" /><figcaption>Пример структуры базы данных</figcaption></figure><p>В базе данных есть таблица orders, её мы и хотим шардировать по customer_id при помощи хеширования (hash-based sharding).</p><p>Файл VSchema (vschema.json) может выглядеть примерно так:</p><ul><li>"sharded": true — указываем, что база данных шардирована.</li><li>"vindexes" — определяем hash_index типа hash, который будет использовать хеш-функцию для распределения.</li><li>"tables" — описываются правила для конкретных таблиц.</li><li>"orders" — настраиваем таблицу orders.</li><li>"column_vindexes" — определяем, какой столбец является ключом ("column": "customer_id") и какой vindex ("name": "hash_customer_id") использовать для него.</li></ul><h2>Проблемы шардирования</h2><h3>Перераспределение шардов (resharding)</h3><p>Со временем может потребоваться изменить количество шардов или способ разделения данных. Например, добавить серверы для увеличения мощности или изменить ключ шардирования. Этот процесс называется решардингом.</p><p>При решардинге часто приходится перегонять большие объёмы данных между серверами. Если используется хеш-шардинг, и мы меняем количество шардов, то пересчитываются ключи, по которым распределяются данные.</p><p>Например, раньше у нас было 4 шарда. Мы брали user_id, например 9, делили на 4 и получали остаток — 1. Значит, данные шли на шард номер 1. После масштабирования стало 5 шардов, и 9 % 5 = 4 — теперь те же данные должны храниться на шардe 4.</p><p>Такое перемещение затратно по ресурсам: грузит сеть, диски, может занять часы или даже дни. Иногда для этого приходится останавливать запись, что делает процесс ещё рискованнее.</p><h3>Неравномерная нагрузка (hot shards)</h3><p>Вспомним вид шардирования Range-based sharding. Это когда мы разбиваем данные по диапазонам. У нас был пример выше с форумом и шардингом user_id:</p><ul><li>id от 1 до 1000 — шард 1;</li><li>id от 1001 до 2000— шард 2;</li><li>id от 2001 до 3000 — шард 3.</li></ul><p>Мы столкнулись с проблемой, что шард 1 и шард 2 после завершения диапазонов простаивали, а вся новая нагрузка приходилась на шард 3.</p><p>Такую проблему называют горячим шардом (hot shards). Производительность всей системы начинает зависеть от самого загруженного шарда. Преимущества шардирования снижаются.</p><p>Чтобы этого избежать, приходится либо более въедливо продумывать ключи шардирования, либо вручную разделять слишком нагруженный шард.</p><h3>Сложности с глобальными транзакциями и агрегациями</h3><p>Допустим, нужно перевести деньги со счёта А на счёт Б — операция состоит из двух шагов: списание и зачисление. Транзакция позволяет объединить их в единое целое: либо всё выполнится, либо ничего. Это защищает от потери данных и ошибок. В классических базах данных за это отвечают принципы ACID — они гарантируют надёжность в пределах одного сервера.</p><p>Но если счёт А находится на одном шарде, а счёт Б — на другом, стандартная транзакция не сработает. Между независимыми серверами нельзя просто так обеспечить ACID-гарантии. Для этого нужны сложные и медленные механизмы координации, например двухфазный коммит (2PC). Либо приходится идти на компромисс и использовать eventual consistency — когда данные приходят в согласованное состояние с небольшой задержкой. Например, деньги уже списались, но ещё не зачислились.</p><p>Аналогичная проблема и с агрегациями: посчитать сумму продаж или число пользователей уже не получится одной SQL-командой. Каждый шард сначала считает свою часть, а потом результат нужно собрать и объединить — это требует дополнительной координации и может усложниться при фильтрации или группировках.</p><h3>Сложность управления и мониторинга</h3><p>Шардированный кластер — это распределённая система, управлять которой сложнее, чем одним сервером.</p><p><b>Больше компонентов</b>: Вместо одной базы данных появляется множество шардов (часто с репликами), маршрутизаторы запросов, серверы конфигурации. Всё это нужно настраивать, обновлять и обслуживать.</p><p><b>Мониторинг</b>: Требуется отслеживать состояние каждого шарда, равномерность распределения нагрузки, задержки в сети, работу маршрутизаторов. Нужны более сложные инструменты мониторинга.</p><p><b>Отладка</b>: Найти источник проблемы в распределённой системе сложнее. Ошибка может быть где угодно: в приложении, маршрутизаторе, на одном из шардов или в сети.</p><p><b>Резервное копирование</b>: Создание согласованных резервных копий и восстановление данных со множеством независимых шардов требует более сложных процедур.</p><h2>Когда стоит применять Sharding</h2><h3>Рост объёма данных и нагрузок</h3><p>Sharding стоит применять, если БД сильно разрослась, хранить её на одном сервере становится сложно и дорого. Серверу приходится обрабатывать много данных, и поэтому увеличивается время отклика.</p><p>Иногда серверу приходится одновременно читать и записывать слишком много запросов. Система становится перегруженной, пользователи замечают задержки и нестабильную работу. Здесь тоже поможет sharding.</p><h3>Не справляется один сервер/реплика</h3><p>Допустим, у нас один сервер и он не справляется с запросами и большими данными. Конечно, мы можем заняться вертикальным масштабированием, поставить CPU производительнее, добавить больше ОЗУ и так далее. Однако у этого подхода есть ограничения. Во-первых, каким бы мощным ни был бы сервер, он со временем упрётся в потолок своей производительности. Во-вторых, иногда дешевле купить несколько новых серверов помощнее, чем прокачивать старый. Поэтому создание кластера и распределение в нём нагрузки при помощи шардинга — часто более выигрышное решение, чем один сервер.</p><h3>Потребность в геораспределённости или отказоустойчивости</h3><p>Если пользователи находятся в разных частях света, то деление данных и хранение ближе к ним может ускорить работу приложения. Мы можем при помощи шардинга размещать данные в разных дата-центрах, ближе к определённым группам пользователей. Например, так делает Youtube. Компания размещает свои сервера в разных странах, чтобы видео прогружались быстрее и в более высоком качестве.</p><p>Мы можем хранить все данные и обрабатывать запросы на одном сервере и сделать его реплику с копией данных. Если этот сервер падает, то его заменяет реплика. Но что, если эта реплика тоже упадёт? Тогда нам и помогает sharding с репликацией. В случае сбоев отвалятся только отдельные серверы с некоторыми наборами данных. Конечно, здесь тоже, в теории, можно положить весь кластер, включая реплики, но сделать это сложнее.</p><p>Шардирование — полезный инструмент при работе с СУБД. А узнать про большее число подобных инструментов можно в нашем <a href="https://t.me/+qUpIFTBINgJkOGJi">телеграм канале</a>!</p>]]></content:encoded>
    </item>
    <item>
      <title>Зачем разработчику знать SQL, если есть NoSQL? Разбираемся на примерах</title>
      <link>https://tproger.ru/articles/zachem-razrabotchiku-znat-sql--esli-est-nosql--razbiraemsya-na-primerah</link>
      <comments>https://tproger.ru/articles/zachem-razrabotchiku-znat-sql--esli-est-nosql--razbiraemsya-na-primerah?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Владислав Устинов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/zachem-razrabotchiku-znat-sql--esli-est-nosql--razbiraemsya-na-primerah</guid>
      <description><![CDATA[<p> Зачем разработчику знать SQL, если есть NoSQL. Показываем основные отличия SQL и NoSQL. Рассматриваем пошаговую инструкцию и важные особенности ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/zachem-razrabotchiku-znat-sql--esli-est-nosql--razbiraemsya-na-primerah">Зачем разработчику знать SQL, если есть NoSQL? Разбираемся на примерах</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[NoSQL]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 19 Mar 2025 10:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Ключевые отличия SQL и NoSQL</h2><h3>Структура данных: реляционные таблицы vs. Документо-ориентированные, графовые, ключ-значение базы</h3><p>SQL — язык запросов, с помощью которого мы можем обращаться к реляционным базам данных и манипулировать ими. Они имеют строгую структуру и отношения, логика их схемы напоминает таблицу или несколько связанных таблиц.</p><p>Рассмотрим пример таблицы ниже:</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-03-12/a2ede9fc-5a44-48c8-8cb4-d49eae7761b6.jpg" alt="Зачем разработчику знать SQL" /><figcaption>Пример таблицы Excel</figcaption></figure><p>Это таблица excel, в которую занесены данные о различных персонажах. В ней мы можем фильтровать данные, искать их, сортировать содержимое, писать значения с разными типами, обращаться к данным во внешних таблицах. При помощи запросов SQL возможно всё то же самое в реляционной базе.</p><p>Давайте создадим нашу таблицу при помощи SQL:</p><p>Командой CREATE TABLE создаём таблицу, которую называем «Персонажи». В скобках прописываем название столбцов, напротив указываем тип данных, который здесь будет храниться. Например, VARCHAR(50) — это текст до 50 символов, DATE — дата, INT — число. PRIMARY KEY — первичный ключ строки. Он нужен, чтобы у каждой строки таблицы был свой уникальный номер.</p><p>Далее заполним нашу таблицу при помощи команды INSERT INTO Персонажи VALUES:</p><p>Заполняем значениями в кавычках, через запятую. Запятые отделяют столбцы друг от друга.</p><p>А теперь добавим ещё одного персонажа и отфильтруем значения по столбцу «Фильм_Сериал»:</p><p>Команда INSERT INTO добавляет нового персонажа в уже существующую базу.</p><p>В скобках после INSERT INTO мы перечисляем столбцы, которые хотим заполнить. VALUES — значения для этих столбцов.</p><p>Эта команда выбирает все столбцы в таблице «Персонажи», проверяя, что новое значение добавилось.</p><p>Далее проводим фильтрацию по сериалу: «Игра престолов»:</p><ul><li>SELECT — выбирает данные из столбцов.</li><li>После SELECTпишем, какие именно столбцы хотим видеть (не всё, а только эти шесть).</li><li>FROM Персонажи — указываем таблицу, из которой берём данные.</li><li>WHERE Фильм_Сериал — выбираем столбец, по которому будем искать данные.</li></ul><p>В результате получим вот такие данные:</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-03-12/5ed2fec8-f939-4ba5-8297-ef5226c7c0c6.jpg" alt="Зачем разработчику знать SQL" /><figcaption>Визуализация вывода</figcaption></figure><p>NoSQL в сравнении с SQL не просто другой язык, а целая философия организации базы данных. Никаких строгих таблиц — всё зависит от того, с чем работаем. В NoSQL есть много видов данных, под каждый из них существуют свои системы управления базами данных (СУБД). Вот основные из них:</p><p><b>Документо-ориентированные базы (MongoDB):</b> данные лежат в виде документов, похожих на JSON, но это не совсем он, а BSON. Различия кроются в том, что это его бинарная версия.</p><p>Пример:</p><p>Слева в кавычках мы пишем название наших полей, например, «Персонаж». Далее через двоеточие указываем значение (тоже в кавычках) и заканчиваем запись для поля запятой. Всё это внутри фигурных скобок.</p><p><b>Ключ-значение (Redis):</b> это тип NoSQL баз данных, где информация хранится в виде пар «ключ-значение», как в словаре: ключ — уникальный идентификатор, значение — любые данные, связанные с ним. Например, запись Джона Сноу будет выглядеть так:</p><p>Внутри фигурных скобок прописываем ключ в кавычках. Далее через двоеточие пишем значение. Отделяем поля между собой при помощи запятой.</p><p><b>Графовые базы (Neo4j):</b> здесь данные — это узлы.</p><p>CREATE (Джон:Персонаж {имя: "Джон Сноу", дом: "Старк"});</p><p>Создаётся узел с меткой Персонаж, который представляет Джона Сноу. Узел имеет два свойства: имя со значением «Джон Сноу» и дом со значением «Старк». Переменная Джон — временное имя для ссылки на узел.</p><p>CREATE (Тирион:Персонаж {имя: "Тирион Ланнистер", дом: "Ланнистер"});</p><p>Далее создаётся ещё один узел с меткой Персонаж, представляющий Тириона Ланнистера. У него тоже два свойства: имя — «Тирион Ланнистер» и дом — «Ланнистер». Переменная Тирион позволяет ссылаться на этот узел.</p><p>CREATE (Джон)-[:ЛАЙК]-&gt;(Тирион);</p><p>Затем появляется направленная связь (ребро) между узлами Джон и Тирион. Она имеет тип ЛАЙК и указывает, что Джон «лайкает» Тириона. Скобки () обозначают узлы, а [:ЛАЙК] со стрелкой -&gt; показывает направление отношения.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-03-12/f97cfff4-8608-4b0f-ba06-7ce5198da147.jpg" alt="Зачем разработчику знать SQL" /><figcaption>Пример визуализации графа из кода</figcaption></figure><h3>Гибкость схемы SQL против NoSQL: строгая схема vs динамическая структура</h3><p>Представьте, что у нас есть база данных с персонажами из фильмов и сериалов — огромная таблица на миллион строк. Теперь мы решили добавить в неё нестандартную запись: включить в список реальную историческую личность, а заодно создать новый столбец «факты», чтобы указать, чем личность запомнилась. Сделать это можно при помощи команды CREATE, но есть проблема.</p><p>Дело в том, что если мы создадим новый столбец в большой базе данных и запишем туда значение только для одного персонажа, то остальные строки в столбце для других примут значение null. И это не очень удобно, так как большое количество null усложняет запросы и может запутать разработчика при обработке данных.</p><p>В этом фундаментальное различие SQL и NoSQL. Первый плохо подходит для работы с неструктурированными данными.</p><p>В NoSQL мы можем при помощи MongoDB прописать значение только для одного персонажа, не трогая других:</p><p>Сравните данные Илона Маска и Сайтамы, у них есть различия в схеме.</p><p>Для такой записи в SQL нам пришлось бы добавлять поле «Чем известен» для всех персонажей в базе. Другие бы тогда получили значение null:</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-03-12/e9f5f43b-ae55-41bf-a58c-bf1807d5c9bc.jpg" alt="Зачем разработчику знать SQL" /></figure><p>Из-за строгой схемы надо заранее продумывать логику структуры. Если база данных уже большая и её логику надо поменять, это чревато неудобствами.</p><p>У NoSQL, в отличие от SQL, нет строгой схемы, благодаря этому он отлично подходит для работы с плохо структурированными данными.</p><h2>Транзакции в SQL и NoSQL: ACID (SQL) vs. BASE (NoSQL)</h2><p>Транзакция — набор тех операций, которые либо выполняются полностью, либо не выполняются совсем. Представим перевод денег: снимаем 500 рублей с нашего счёта и отправляем их на другой. Если что-то сломается на полпути, транзакция либо отменится, либо завершит оба шага. В базах данных транзакции нужны, чтобы данные оставались надёжными. Рассмотрим основные различия транзакций SQL и NoSQL.</p><h3>ACID (SQL)</h3><p>SQL-базы данных работают по принципу ACID-транзакций, что гарантирует стабильность и предсказуемость работы с данными. Этот набор правил включает атомарность, согласованность, изоляцию и долговечность.</p><p><b>Атомарность (Atomicity)</b> — транзакция выполняется как единое целое. Если хоть одна операция внутри неё не удалась, всё отменяется. Например, если при переводе денег сервер внезапно отключился, система откатит изменения, и средства не исчезнут.</p><p><b>Согласованность (Consistency) </b>— данные всегда соответствуют правилам базы. Если на счёте 80$, а мы пытаемся перевести 100$, система просто не даст выполнить такую операцию.</p><p><b>Изоляция (Isolation) </b>— параллельные транзакции не мешают друг другу. Пока одна выполняется, другая видит только конечный результат. Например, если один процесс переводит 100$ со счёта A на счёт B, а другой в этот момент проверяет баланс, он увидит либо старое состояние, либо уже обновлённое, но никогда промежуточное.</p><p><b>Долговечность (Durability) </b>— завершённая транзакция остаётся в базе навсегда, даже в случае сбоя. Если мы пополнили счёт на 100$, эта информация будет сохранена, независимо от того, что произойдёт с сервером после.</p><h3>BASE (NoSQL)</h3><p>BASE-модель, которую используют NoSQL-базы данных, строится на трех принципах: базовая доступность, мягкое состояние и конечная согласованность. В отличие от строгих ACID-правил, здесь делается упор на скорость и масштабируемость, даже если это временно снижает точность данных.</p><p><b>Базовая доступность (Basically Available)</b> — система всегда отвечает на запросы, даже если часть данных ещё не синхронизирована. Например, ставя лайк, мы сразу видим его, даже если информация ещё не дошла до сервера.</p><p><b>Мягкое состояние (Soft State)</b> — данные могут временно быть несогласованными. Ради высокой доступности система допускает, что информация изменяется без нашего участия. Например, когда у нового видео на YouTube лайков больше, чем просмотров — это результат того, что одни данные обновились быстрее других.</p><p><b>Конечная согласованность (Eventual Consistency) </b>— если систему оставить в покое, она сама «додумает» и согласует данные между всеми узлами. Допустим, у поста 50 лайков, но у разных пользователей отображаются разные числа: кто-то видит 49, кто-то 53. Через некоторое время система синхронизируется, и у всех будет одинаковое значение.</p><p>BASE-жизнь — это про скорость и гибкость. Главное, чтобы данные в итоге сошлись, а не были идеальными в каждый момент времени.</p><h2>Масштабируемость: вертикальное (SQL) vs горизонтальное (NoSQL) масштабирование</h2><h3>Вертикальное масштабирование (SQL)</h3><p>Реляционные базы данных изначально проектировались для работы на одном сервере (или кластере серверов) с использованием строгой структуры данных (таблицы, строки, столбцы) и поддержки ACID-транзакций.</p><p>Если наше «железо» не справляется с обработкой реляционной базы, то проще его прокачать, например, установить больше памяти, либо купить новый сервер помощнее и перенести на него данные. При таком масштабировании мы как бы гонимся вверх, стараемся получить больше памяти и производительное «железо».</p><p>Конечно, можем купить второй сервер или кластер серверов и распределить на них часть нагрузки, но это будет сложно из-за архитектуры реляционных баз.</p><h3>Горизонтальное масштабирование (NoSQL)</h3><p>При горизонтальном масштабировании мы докупаем дополнительные сервера и распределяем между ними нагрузку. NoSQL базы данных изначально проектировались для работы на множестве серверов. Здесь не нужна строгая схема хранения данных, и они лучше оптимизированы для работы с большим объёмом информации.</p><p>Благодаря этому мы можем распределять нагрузку NoSQL среди множества серверов. Это значит, что если нам не хватает производительности, то можно просто докупить новые устройства.</p><p>Вертикальное масштабирование здесь тоже возможно, но оно часто дороже, хуже подходит для больших баз данных и, в целом, менее удобно из-за архитектуры NoSQL.</p><blockquote>Первое и главное преимущество SQL — строгая структура данных и операций. У базы есть контракт, который ты обязан соблюдать при добавлении, изменении или запросе данных. Правило простое: «Либо всё, либо откат». Второе преимущество — мощный и популярный язык запросов. Сложные аналитические задачи ему по плечу. Уверен, реляционные БД будущего будут опираться на опыт SQL.<br /><br />Строгая структура — одновременно и ограничение. Добавление полей или связей может стать проблемой при реализации на клиенте. Второй момент — горизонтальное масштабирование. Реляционные базы данных очень сложно масштабировать горизонтально. Ты не можешь просто подключить ещё один кластер и продолжать спокойно существовать. Есть ещё определённые проблемы с производительностью, если между объектами существует много связей.<br /><br />Плюсы NoSQL в гибкости, лёгкости масштабирования, высокой производительности при больших нагрузках и разнообразии предметно-ориентированных решений. Например, Redis — для кеширования, Firebase — для реалтайм-обновлений и так далее. Структуру данных можно менять на лету, идеально для проектов с частыми изменениями структуры данных.<br /><br />Минусы в том, что у многих NoSQL свои системы команд и запросов — их приходится учить. Также есть сложности с консистентностью данных.</blockquote><h2>Где использовать SQL и NoSQL</h2><h3>Сценарии, где SQL незаменим</h3><p>SQL хорош там, где важны точность, структура и сложные взаимосвязи данных.</p><h4>Финансовые и банковские системы</h4><p>Здесь цена любой ошибки — чьи-то деньги, поэтому важна точность. Транзакции по стандарту ACID гарантируют, что деньги не потеряются при сбоях. Связь между счетами, клиентами и операциями проще строить через реляционные базы данных.</p><p>Примеры систем: PostgreSQL, Oracle Database, Microsoft SQL Server.</p><h4>Аналитика и сложные запросы</h4><p>В аналитике нужно регулярно вытаскивать данные из таблиц и строить зависимости. В SQL есть операторы JOIN, GROUP BY и оконные функции, которые решают задачи, наподобие расчёта среднего чека за квартал, в пару строк.</p><p>Примеры систем: MySQL, Snowflake, Google BigQuery.</p><h4>Работа с отчётами и BI-системами</h4><p>Данные для бизнеса — это таблицы, сводки, графики. SQL легко интегрируется с инструментами вроде Power BI или Tableau. Строгая схема помогает избежать путаницы в метриках.</p><p>Примеры систем: PostgreSQL, SQL Server, Redshift.</p><h4>Логирование и аудит данных</h4><p>В этой сфере важно понимать, кто, что и когда изменил. Реляционные базы фиксируют историю изменений с точными связями. Триггеры и индексы ускоряют поиск по логам.</p><p>Примеры систем: SQLite, PostgreSQL, MariaDB.</p><h4>Управление складом и инвентаризацией</h4><p>Данные о товарах, поставках и остатках связаны между собой. Реляционная модель идеально описывает такие структуры. Запросы вроде «что заканчивается на складе» пишутся быстро и понятно.</p><p>Примеры систем: MySQL, Oracle Database.</p><h3>Где NoSQL работает лучше?</h3><p>NoSQL — это про скорость, гибкость и масштабирование. Там, где SQL требует строгих рамок, NoSQL даёт свободу и справляется с хаосом больших данных. Вот сценарии, где он выигрывает:</p><h4>Высоконагруженные системы и real-time сервисы</h4><p>Допустим, у нас стриминговый сервис, здесь миллионы запросов в секунду, а задержки недопустимы. Горизонтальное масштабирование размазывает нагрузку по серверам. Данные отправляются быстро, без сложных JOIN’ов.</p><p>Примеры систем: Cassandra, MongoDB, DynamoDB.</p><h4>Гибкие структуры данных и работа с JSON</h4><p>В реальной жизни данные далеко не всегда приходят в виде строгой схемы. У кого-то может быть указан email, у кого-то его нет, но есть телефон. Поэтому для работы с такой информацией лучше подходят документо-ориентированные базы, которые хранят JSON или BSON без строгой структуры. Если мы добавим новое поле, такая база не сломается.</p><p>Примеры систем: MongoDB, CouchDB, Firebase.</p><h4>Графовые базы для рекомендаций и соцсетей</h4><p>Иногда связи между объектами важнее самих данных. Графовые базы строят сети вроде «друзья друзей» или «похожие товары» за доли секунды. SQL для этой задачи медленнее.</p><p>Примеры систем: Neo4j, ArangoDB, OrientDB.</p><h2>Почему SQL и NoSQL нужно знать вместе?</h2><p>SQL даёт точность и структуру, данные в NoSQL — это про скорость и гибкость. В реальных проектах их часто используют вместе, чтобы закрыть слабые места друг друга.</p><h3>Примеры гибридных архитектур: SQL и NoSQL в одном проекте</h3><h4>Работа с каталогами товаров, запросами и системой рекомендаций в интернет-магазинах</h4><p>Представим интернет-магазин: каталог товаров и заказы лежат в SQL — там важны связи и точность. А рекомендации «похожие товары» или история просмотров — в NoSQL, чтобы быстро отдавать данные и не мучиться со схемой.</p><p>Например, PostgreSQL хранит данные о клиентах и транзакциях, а MongoDB — отзывы и пользовательские профили. Всё в одном проекте, каждый инструмент на своём месте.</p><h4>Кеширование запросов с помощью Redis и SQL</h4><p>SQL силён в сложных запросах, но в больших базах может тормозить. А если у нас есть операция, которая предполагает повторный подсчёт? Это будет долго. Здесь выручает Redis, NoSQL-база типа «ключ-значение».</p><p>Представим аналитику продаж: SQL вычисляет «топ-10 товаров за месяц» Готовый список сохраняем в Redis. Теперь, когда нам нужен этот топ, данные тянутся из Redis за миллисекунды, нам не надо заново проводить вычисления в SQL.</p><h4>Использование NoSQL для логов, SQL — для отчётности</h4><p>Логи — это поток данных: миллионы записей, структура не всегда предсказуема. NoSQL вроде Cassandra или MongoDB «переваривает» их без проблем благодаря скорости записи и горизонтальному масштабированию. А потом из этого хаоса SQL, например, MySQL, вытягивает нужное для отчётов: «сколько ошибок за день» или «кто чаще ломает систему». NoSQL собирает сырые данные, SQL их структурирует.</p><h2>Стоит ли учить SQL? Мнение экспертов</h2><p>Мы решили спросить у экспертов, что бы они посоветовали молодым разработчикам изучать в первую очередь, SQL или NoSQL. Делимся мнениями:</p><blockquote>Мой совет — начинайте с SQL. Вот почему:<br /><br />1) База знаний. SQL учит вас основам работы с данными — как их хранить и извлекать. Это фундамент, который пригодится в любом проекте, даже если вы потом перейдёте на NoSQL.<br /><br />2) Широкое применение. SQL встречается повсюду — от стартапов до банков. Знание SQL сразу даёт вам больше шансов найти работу или понять, что происходит в существующем проекте.<br /><br />Но это не значит, что NoSQL можно просто игнорировать. После SQL я бы рекомендовал изучить хотя бы одну NoSQL базу — например, Redis или MongoDB. Современные проекты часто требуют гибкости и скорости, которые дают NoSQL системы. Зная обе технологии, вы сможете выбирать инструмент под задачу, а не подстраиваться под то, что знаете.</blockquote><blockquote>Первым делом нужно освоить SQL. Это фундаментальный навык, который необходим в любой сфере, связанной с данными. Знание реляционных баз помогает понять, как правильно структурировать данные, оптимизировать запросы и обеспечивать их целостность. Независимо от того, с какой технологией будет иметь дело разработчик в будущем, понимание SQL даст ему прочную основу.<br /><br />После освоения SQL я бы рекомендовал изучить и NoSQL. Важно понимать, какие задачи он решает, какие бывают типы нереляционных баз и в каких случаях их применение оправдано. Даже если специалист в своей работе чаще использует SQL, знание NoSQL поможет ему грамотно проектировать архитектуру и принимать взвешенные технологические решения.</blockquote><blockquote>Не существует как такового единого NoSQL как системы управления базы данных, зачастую это очень сильно различающийся набор решений, поэтому стоит начать с SQL, для разных СУБД он довольно мало отличается синтаксически. SQL — это фундамент. NoSQL даст более полное понимание того, как можно работать с базами данных. Можно отметить, что в SQL добавляются фичи NoSql и наоборот.</blockquote><p>SQL и NoSQL желательно знать вместе. Как видно исходя из комментариев экспертов и примеров, SQL — первый ключ к базам данных, NoSQL — второй, для более сложных сценариев.</p>]]></content:encoded>
    </item>
    <item>
      <title>Это БАЗА (данных): Как подключиться и выполнить запрос?</title>
      <link>https://tproger.ru/articles/kak-podklyuchitsya-k-baze-dannyh-i-vypolnit-zapros-</link>
      <comments>https://tproger.ru/articles/kak-podklyuchitsya-k-baze-dannyh-i-vypolnit-zapros-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Елизавета Малышева]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-podklyuchitsya-k-baze-dannyh-i-vypolnit-zapros-</guid>
      <description><![CDATA[<p>Как подключиться к базе данных. Показываем основные запросы к базам данных. Рассматриваем пошаговую инструкцию по использованию ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-podklyuchitsya-k-baze-dannyh-i-vypolnit-zapros-">Это БАЗА (данных): Как подключиться и выполнить запрос?</a>»</p>]]></description>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[NoSQL]]></category>
      <category><![CDATA[Уязвимость]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 16 Jan 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Хотите заплатить хакерам $15 миллионов за свои данные?</p><p>Это не шутка. Именно<a href="https://www.interfax.ru/world/920813"> такую сумму</a> заплатила американская сеть казино Caesars Entertainment злоумышленникам, которые увели их БД.</p><p>База данных ––  самое ценное, что есть у каждой компании. Именно в ней хранится вся чувствительная и важная для бизнеса информация. В этой статье расскажем, какие есть базы данных и как правильно с ними работать: подключаться и делать запросы.</p><h2>Такие разные базы данных</h2><p>Базы данных — основной инструмент программирования. БД хранят важную информацию о пользователях и позволяют этой информацией управлять.</p><p>Они делятся на два основных типа: реляционные и нереляционные.</p><p><b>Реляционная база</b> — как большой шкаф с ящиками. У каждого своя подпись, и в нём лежат только определенные вещи по порядку. Например, один ящик для носков, второй для шапок, третий –– для носовых платков.</p><p>Все очень аккуратно, ничего не теряется, но если нужно что-то изменить, например, носки переложить в ящик с платками –– будет не так-то просто.</p><p>Чтобы делать запросы к реляционной базе, нужно использовать язык SQL. А обрабатывать эти запросы будет СУБД –– система управления базами данных. Простыми словами –– штука, которая помогает вам управлять самой базой. Что-то из шкафа вытащить, кого-то в него спрятать.</p><p><b>Нереляционная база данных</b> — как огромная коробка, куда можно складывать всё, что угодно и как угодно. Это удобно, но для системы с чёткой структурой не подойдёт.</p><p>Какой тип БД выбрать для проекта –– зависит от целей компании, размера и особенностей бизнеса. Разберём каждый тип.</p><h2>Реляционные базы данных (SQL)</h2><p>Реляционные базы –– таблицы, где данные организованы в строки и столбцы. У каждой таблицы строгая схема, которая определяет типы данных и их взаимосвязь. Реляционные базы используются для приложений, где важны точность и согласованность информации.</p><p>Посмотрим на конкретные примеры.</p><h3>MySQL</h3><p>Очень популярная база с открытым исходным кодом. Она надежная, удобная и быстрая. MySQL часто используют для веб-приложений. Например,  Airbnb, Netflix и Uber.</p><p>Её любят, потому что у неё качественная и подробная документация, а также большое сообщество.</p><h3>PostgreSQL</h3><p>Мощная и универсальная реляционная база данных, которая предлагает расширенные возможности. Среди них —  работа с JSON, хранение массивов и поддержка пользовательских типов данных. Это делает PostgreSQL гибким инструментом для решения самых разнообразных задач.</p><p>СУБД используется в сложных приложениях, где важны высокая надежность и гибкий функционал.</p><h3>SQLite</h3><p>Эта однофайловая СУБД мало весит и не требует сервера для работы. Она идеально подходит для небольших приложений, мобильных устройств и тестирования.</p><p>Если нужно будет что-то куда-то переносить –– процесс пойдёт быстро. За эту простоту SQLite и любят.</p><h2>Нереляционные базы</h2><p>Нереляционные базы данных подходят для работы с большими объемами, которые могут быть неструктурированными или слабо структурированными.</p><p>В отличие от реляционных, у этих баз нет строгой схемы, что делает их гибкими и удобными для многих современных приложений.</p><p>Разберём самые популярные варианты нереляционных баз.</p><h3>MongoDB</h3><p>NoSQL-база данных, которая хранит данные в формате JSON, обеспечивает гибкость и простоту работы. MongoDB часто используется в приложениях, требующих динамической структуры данных, а также в учебных и небольших проектах благодаря своей доступности и лёгкости освоения.</p><h3>Redis</h3><p>Высокопроизводительная база данных, оптимизированная для минимизации задержек при доступе к данным. Идеально подходит для кэширования, управления сессиями, обработки очередей сообщений и других задач, требующих мгновенного отклика.</p><h2>В чём разница между базами данных</h2><p>Выбор базы данных — долгосрочное решение, от которого зависит эффективность работы вашего приложения. Давайте подробнее разберём различия между реляционными и нереляционными базами данных, чтобы помочь вам сделать осознанный и правильный выбор.</p><p>Структура данных</p><figure><img src="https://media.tproger.ru/user-uploads/105990/2025-01-10/0da24965-ccd4-4f79-b395-82f484763ae0.png" alt="" /></figure><p>Масштабируемость</p><figure><img src="https://media.tproger.ru/user-uploads/105990/2025-01-10/30f9658d-daa5-46b7-932f-0e7772881a03.png" alt="" /></figure><p>Скорость и производительность</p><figure><img src="https://media.tproger.ru/user-uploads/105990/2025-01-10/05f69730-26ff-4f9c-ba20-044a59df6d02.png" alt="" /></figure><p>Выбор зависит от потребностей проекта: для сложных транзакционных систем с жесткой структурой данных лучше использовать реляционные базы, а для гибких, масштабируемых приложений с неструктурированными данными — нереляционные.</p><p>Для работы с базами данных важно уметь выполнять ключевые операции: извлечение, добавление, обновление и удаление данных. Разберём, что такое SQL-запросы и как выполнение этих операций отличается в реляционных и нереляционных базах данных.</p><h2>Подключаемся к MySQL</h2><p>Для реляционных баз данных используются стандартные операции:</p><ul><li>SELECT — получить данные;</li><li>INSERT — добавить новые данные;</li><li>UPDATE — обновить существующие данные;</li><li>DELETE — удалить данные.</li></ul><p>Поработаем с ними на примере MySQL. Представим, что у нас есть база с пользователями нашего блога. Чтобы поработать с ней, нужно настроить соединение с программой. Разберём этот процесс шаг за шагом.</p><h3>Шаг 1. Устанавливаем библиотеку</h3><p>Для работы с MySQL в Python нам понадобится библиотека mysql-connector-python.</p><p>Дла этого напишем команду в терминале:</p><p>С помощью неё можно подключиться к базе, отправлять к ней запросы и обрабатывать результаты этих запросов.</p><h3>Шаг 2. Настраиваем подключение</h3><p>Чтобы подключиться к базе данных MySQL, необходимо знать её параметры:</p><ul><li>Хост: адрес сервера, где находится база данных. Это может быть localhost;</li><li>Порт: номер порта для подключения. По умолчанию для MySQL — 3306-й порт;</li><li>Пользователь: имя пользователя, который имеет доступ к базе;</li><li>Пароль: пароль для этого пользователя;</li><li>Имя базы данных: конкретная база, с которой вы хотите работать.</li></ul><p>Как это может выглядеть:</p><ul><li>Хост: localhost</li><li>Порт: 3306</li><li>Пользователь: root</li><li>Пароль: “”</li><li>Имя базы данных: test_db</li></ul><h3>Шаг 3. Подключаемся к базе данных</h3><p>Теперь создадим программу, которая установит соединение с MySQL.</p><h4>Что тут происходит:</h4><ol><li>Импорт нужных библиотек: mysql.connector — это основной модуль для работы с MySQL в Python. Error — класс для обработки ошибок;</li><li>Настройка подключения: Используем метод mysql.connector.connect, в который передаются параметры: host, user, password и database. Это наши настройки для базы данных;</li><li>Проверка подключения:Метод is_connected() из переменной connection проверяет, удалось ли установить соединение;</li><li>Выполнение запросов:Создаём курсор для выполнения SQL-запросов с помощью connection.cursor(). После этого можно делать запросы к базе. Выбираем конкретную базу, получаем все данные, добавляем в неё сущность, а затем удаляем её. Последний запрос — получение одного конкретного юзера;</li><li>Закрытие соединения:Закрываем соединение с помощью метода connection.close() для того, чтобы избежать утечек ресурсов и проблем с безопасностью.</li></ol><p>Вы также можете обернуть код в try-except, чтобы отловить непредвиденные ошибки и не уронить сервер.</p><p>С помощью этого подхода можно быстро настроить подключение к MySQL и начать работу с базой данных в Python-проекте.</p><h2>Подключаемся к MongoDB</h2><p>Для нереляционных баз используем NoSQL-запросы. Функционал такой же: добавление, удаление, изменение и получение данных. А выглядят они по-другому. Посмотрим на примере MongoDB.</p><p>Для работы с MongoDB в Python используется библиотека pymongo. Разберём, как настроить соединение, выбрать базу данных и выполнить простой запрос.</p><h3>Шаг 1. Устанавливаем библиотеку</h3><p>Для начала установим библиотеку pymongo на своём компьютере. Введём команду в терминал:</p><h3>Шаг 2. Настраиваем подключение</h3><p>Чтобы подключиться к MongoDB, нужно знать параметры базы:</p><ul><li>Хост: адрес сервера;</li><li>Порт: порт, на котором работает MongoDB. По умолчанию — 27017;</li><li>Имя базы данных: название базы, которую вы хотите использовать;</li></ul><p>MongoDB автоматически создаст базу данных, если она не существует.</p><p>Пример настроенной базы:</p><ul><li>Хост: localhost</li><li>Порт: 27017</li><li>Имя базы данных: test_db</li></ul><h3>Шаг 3. Подключаемся и выполняем запрос</h3><p>Нам нужно подключиться к базе данных MongoDB, добавить, удалить и получить данные коллекции:</p><p>Разберём подробнее:</p><ol><li>Импорт библиотеки: Используем MongoClient из библиотеки pymongo, чтобы создать подключение к базе;</li><li>Создание подключения: Используем данные хоста и порта, где запущен MongoDB;</li><li>Выбор базы данных и коллекции: Выбираем нужную базу данных. В нашем случае –– test_db. Если базы нет, MongoDB создаст её при добавлении первого документа;</li><li>Добавление документа: Добавляем новый документ с пользователем с помощью insert_one(). А также выводим в консоль информацию о добавленном пользователе;</li><li>Удаление. Удаляем юзера и проверяем, получилось ли. Если нет, в консоли увидим запись, что такого юзера не существует;</li><li>Выполнение запроса: Ищем только что добавленный документ методом find_one() и проверяем, нашли ли. Тут то же самое: если юзера нет, то в консоли мы это увидим;</li><li>Закрытие подключения: Закрываем вызов через client.close() и оповещаем самих себя в консоли.</li></ol><p>Вы могли заметить, что мы везде заканчиваем код закрытием соединения. Это важно по нескольким причинам:</p><ol><li>Подключение к базе данных –– ресурсы сервера и клиента. Если соединение не закрыть, ресурсы останутся занятыми. Значит, их нельзя будет использовать для более нужных вещей;</li><li>Неиспользуемые открытые соединения приводят к утечкам памяти;</li><li>Открытое соединение может стать уязвимостью для атак, несанкционированного доступа или SQL-инъекций.</li></ol><p>В этом фрагменте кода реализовано то же самое, но с улучшениями. Мы обернули его в блок try-except, чтобы защитить сервер от ошибок и предотвратить его аварийное завершение работы.</p><p>В этой статье мы лишь поверхностно коснулись темы баз данных. Если у вас ещё нет лишних денег на выкуп своих данных, рекомендуем инвестировать время в изучение основ и тонкостей работы с БД.</p><p>Качественно спроектированная база данных не только повысит эффективность и прибыльность бизнеса, но и защитит его от серьёзных рисков. Кроме того, вы значительно прокачаете свои навыки программирования.</p><p>Удачи в разработке и безопасности ваших данных! 🚀</p>]]></content:encoded>
    </item>
    <item>
      <title>Проверь свои знания MongoDB: особенности и базовые операции</title>
      <link>https://tproger.ru/articles/prover-svoi-znaniya-mongodb--osobennosti-i-bazovye-operacii</link>
      <comments>https://tproger.ru/articles/prover-svoi-znaniya-mongodb--osobennosti-i-bazovye-operacii?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Сергей Лалетин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/prover-svoi-znaniya-mongodb--osobennosti-i-bazovye-operacii</guid>
      <description><![CDATA[<p>MongoDB — одна из самых популярных NoSQL-баз данных. Этот тест поможет вам проверить свои знания о её особенностях и основных принципах работы. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/prover-svoi-znaniya-mongodb--osobennosti-i-bazovye-operacii">Проверь свои знания MongoDB: особенности и базовые операции</a>»</p>]]></description>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[NoSQL]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 21 Nov 2024 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>MongoDB — одна из самых популярных NoSQL-баз данных. Этот тест поможет вам проверить свои знания о её особенностях и основных принципах работы. Если чувствуете, что нужно освежить знания, рекомендуем ознакомиться <a href="https://tproger.ru/articles/mongodb--chem-eta-baza-otlichaetsya-ot-drugih-">с этой статьёй о MongoDB</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Графовые базы данных: на примере творчества Beatles</title>
      <link>https://tproger.ru/articles/grafovye-bazy-dannyh</link>
      <comments>https://tproger.ru/articles/grafovye-bazy-dannyh?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Елизавета Ржевская]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/grafovye-bazy-dannyh</guid>
      <description><![CDATA[<p>Графовые базы данных — удобный инструмент, когда проект требует хранить данные с высокой степенью связности и часто их изменять. Разбираемся, в чем плюсы такой системы, и представляем творчество «Битлов» в виде графа</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/grafovye-bazy-dannyh">Графовые базы данных: на примере творчества Beatles</a>»</p>]]></description>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[NoSQL]]></category>
      <category><![CDATA[Графы]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 10 Aug 2024 10:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p><i>Представляем творчество Beatles в виде графа вместе с тестировщиками Noveo!</i></p><h2>Что такое графовые базы данных и зачем они нужны</h2><p>Проблема хранения данных со сложными связями между объектами остро стоит во множестве проектов. Реляционные базы данных оказываются неподходящим решением, поскольку не обеспечивают оптимальный поиск и взаимодействие с данными.</p><p>В этом случае на помощь приходят графовые базы данных. Они основаны на графовой модели, где граф состоит из <b>вершин (узлов)</b> и соединяющих их <b>ребер.</b></p><figure><img src="https://media.tproger.ru/user-uploads/28709/2024-07-25/acb55f87-e913-44fd-ac40-1dfdd894939a.jpg" alt="" /></figure><p>В графовой базе узлы — это сущности, из которых состоит база, а ребра — это типы отношений между сущностями. У узлов и ребер могут быть <b>свойства</b>, дающие дополнительную информацию о сущностях и отношениях между ними. Свойство — своего рода аналог ключа, который используется в реляционной базе данных.</p><p>Графовую базу данных можно изобразить как социальную сеть, в которой люди, относящиеся к различным группам, связаны друг с другом. Человека можно представить в виде узла c маркером «Person». У таких узлов есть свойства «Name», «Gender», «Location» и «Email». Типом отношений в такой базе выступает статус дружбы между людьми — «:FRIENDS_WITH», у которого также есть свойство «YearsOfFriendship» (продолжительность дружбы). Человек (узел «Person») связан со своим местом нахождения (узел «Location») через отношение «:LIVES_IN».</p><figure><img src="https://media.tproger.ru/user-uploads/28709/2024-07-25/3b5ea319-e9e5-4ab6-bea8-63706a97ba35.jpg" alt="" /></figure><p>Преимущество подобной системы в том, что можно легко модифицировать список свойств того или иного узла: это делает систему более гибкой по сравнению с реляционной, где в таблицу пришлось бы добавлять или удалять столбец, соответствующий тому или иному атрибуту.</p><figure><img src="https://media.tproger.ru/user-uploads/28709/2024-07-25/03049441-b496-47af-b1dd-b7466ea91906.jpg" alt="" /></figure><p>Для того чтобы определиться, подходит ли графовая база именно под задачи вашего текущего проекта, полезно будет ответить на следующие вопросы:</p><ul><li><b>Являются ли данные в системе высоко связанными?</b> Графовые базы удобны в тех случаях, когда данные имеют высокую степень связности и требуют значительного анализа внутренних отношений.</li></ul><ul><li><b>Является ли извлечение данных более приоритетным по сравнению с их хранением? </b>Графовые базы оптимизированы для извлечения данных. Если вам часто нужно это действие, графовые базы для вас предпочтительны.</li></ul><ul><li><b>Насколько часто меняется модель данных? </b>Если модель данных неустойчива и требует частых изменений, удобно использовать графовые базы – они ориентированы на сами данные, что делает их достаточно гибкими.</li></ul><p>Еще одним важным термином, связанным с графовыми базами данных, является <b>RDF (Resource Description Framework, среда описания ресурса)</b> — модель представления данных в виде, пригодном для машинной обработки.</p><p>Ресурсом в RDF может быть любая сущность — как информационная (веб-сайт или изображение), так и неинформационная (человек, город и т.д.). Утверждение, высказываемое о ресурсе, является триплетом «Субъект — Предикат — Объект». Множество таких триплетов образуют ориентированный граф, в котором вершинами (узлами) являются субъекты и объекты, а ребрами (отношениями) — предикаты.</p><figure><img src="https://media.tproger.ru/user-uploads/28709/2024-07-25/84a2b972-382f-4753-a1d6-173192e4547e.jpg" alt="" /></figure><p>Для работы с RDF-данными существуют специальные языки. Один из самых распространенных — SPARQL (Simple Protocol and RDF Query Language).</p><p>Основные запросы для данного языка:</p><ul><li><b>SELECT</b> (извлечение необработанных значений и их представление в виде таблицы),</li></ul><ul><li><b>CONSTRUCT</b> (извлечение информации в формате RDF и преобразование результатов к определенной форме),</li></ul><ul><li><b>ASK</b> (формирование запроса типа Истина/Ложь),</li></ul><ul><li><b>DESCRIBE</b> (получение описания RDF-ресурса).</li></ul><p>Существует несколько ключевых терминов, относящихся к типам узлов и ребер в <b>RDF</b>-графе:</p><ul><li><b>IRI (Internationalized Resource Identifier) —</b> строка, однозначно идентифицирующая тот или иной узел и ребро. Использование IRI позволяет избежать повторения имен и возможных коллизий на этой почве.</li></ul><ul><li><b>Blank node (bnode, Пустой узел)</b> — этот узел используется, когда нет необходимости прямой ссылки на него. Он может быть достигнут через направленное ребро от других узлов.</li></ul><ul><li><b>Literals (Литералы)</b> — определенные значения, используемые для представления данных разных типов (строки, числа и даты). В отличии от IRIs и Blank Nodes, в триплете литералы могут быть только объектами. Примером литерала может служить обозначение даты: “YYYY-MM-DD”^^xsd:date, или указание языка строки: “some string”@en. В некоторых случаях литерал может опускаться. Например, для записи целочисленного значения полная запись с литералом выглядит следующим образом: 100^^xsd:integer. Без явного обозначения литерала будет записано лишь само число — 100.</li></ul><h2>Творчество The Beatles в виде графа</h2><p>На рисунке изображен фрагмент графа, относящегося к творчеству группы <b>The Beatles:</b></p><figure><img src="https://media.tproger.ru/user-uploads/28709/2024-07-25/64b1e428-2f7d-4421-866b-32cb4e5ed9f6.jpg" alt="" /></figure><p>Схематическое представление является наглядным и визуально понятным, но, если мы имеем дело с большим объемом данных и выполняем над ними некоторые действия (обмен, загрузка), оно может оказаться непригодным, поэтому существует несколько вариантов синтаксиса представления RDF-графа в текстовом формате. Описанный фрагмент в так называемом Turtle формате будет иметь вид списка, в котором на отдельной строке перечислены все триплеты, отделенные друг от друга символом «.».</p><p>PREFIX :</p><p>PREFIX rdf:</p><p>PREFIX xsd:</p><p>:The_Beatles rdf:type :Band .</p><p>:The_Beatles :name “The Beatles” .</p><p>:The_Beatles :member :John_Lennon .</p><p>:The_Beatles :member :Paul_McCartney .</p><p>:The_Beatles :member :Ringo_Starr .</p><p>:The_Beatles :member :George_Harrison .</p><p>:John_Lennon rdf:type :SoloArtist .</p><p>:Paul_McCartney rdf:type :SoloArtist .</p><p>:Ringo_Starr rdf:type :SoloArtist .</p><p>:George_Harrison rdf:type :SoloArtist .</p><p>:Please_Please_Me rdf:type :Album .</p><p>:Please_Please_Me :name “Please Please Me” .</p><p>:Please_Please_Me :date “1963-03-22″^^xsd:date .</p><p>:Please_Please_Me :artist :The_Beatles .</p><p>:Please_Please_Me :track :Love_Me_Do .</p><p>:Love_Me_Do rdf:type :Song .</p><p>:Love_Me_Do :name “Love Me Do” .</p><p>:Love_Me_Do :length 125 .</p><p>:Love_Me_Do :writer :John_Lennon .</p><p>:Love_Me_Do :writer :Paul_McCartney .</p><p>Список PREFIX в начале записи определяет общую часть IRIs для сущностей в данном графе. Указав ее один раз, мы избавляемся от необходимости каждый раз добавлять эту запись. Например, полная запись IRI, соответствующая сущности «группа “The Beatles”» выглядела бы следующим образом: &lt;http://stardog.com/tutorial/The_Beatles&gt;, однако замена общей части &lt;http://stardog.com/tutorial/&gt;  на символ «:» делает обозначение данной сущности значительно более компактным и удобным для восприятия — «:The_Beatles».</p><p>Графовые базы данных являются удобным инструментом для тех случаев, когда данные имеют высокую степень связности, а модель данных неустойчива и требует частых изменений. А с помощью удобного языка запросов SPARQL можно с легкостью извлекать необходимые данные.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как снизить нагрузку на CRM-систему</title>
      <link>https://tproger.ru/articles/kak-snizit-nagruzku-na-crm-sistemu</link>
      <comments>https://tproger.ru/articles/kak-snizit-nagruzku-na-crm-sistemu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Сергей Лалетин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-snizit-nagruzku-na-crm-sistemu</guid>
      <description><![CDATA[<p>Рассказали, как справляемся с нагрузкой внутренней CRM-системы: какие технологии и практики используем и почему.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-snizit-nagruzku-na-crm-sistemu">Как снизить нагрузку на CRM-систему</a>»</p>]]></description>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[NoSQL]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 14 Jun 2024 10:19:35 GMT</pubDate>
      <content:encoded><![CDATA[<blockquote>Я занимаюсь разработкой CRM-системы, которая собирает, связывает и анализирует информацию о клиентах. Благодаря ей мы можем создавать рекламные предложения и предоставлять важную для банка информацию таргетированно — и быть уверены, что клиент видит в ленте именно то, что нужно (или что-то, что настолько понравится, что станет нужным). В этом тексте расскажу, как мы снижаем нагрузку на CRM-систему, и разберу тонкости разработки.</blockquote><h2>Как выглядит наша CRM-система</h2><p>Мы используем микросервисную архитектуру, микросервисы в основном написаны на Java. Маршрутизатором трафика работает Traefik: он собирает в себя все запросы и определяет, в какой микросервис, в какой API, отправлять реквест. Схема работы выглядит так:</p><p>Клиент —&gt; Traefik —&gt; (mcp-api-cleaner, mcp-reseration, mcp-proressing)</p><p>Микросервисы взаимодействуют с NoSQL и Redis, из которой информация попадает в топики Kafka и дальше в mySQL. Данные хранятся до 90 дней и после удаляются.</p><p>Благодаря такой логике клиенты получают ответ более быстрый, чем при работе с SQL базами данных .</p><h2>Redis взяли по нескольким причинам</h2><p>Первая: в банковском секторе нужна скорость. Вторая — у Redis быстрое и удобное взаимодействие с Java. Третья — это очень популярная система управления базами данных и применяется во многих компаниях.</p><p>Но у работы с ней есть нюансы. Погнавшись за скоростью, можно не рассчитать нагрузку, что фатально повлияет на работу приложения.</p><h2>Мы тоже столкнулись со сложностями</h2><p>При экспоненциальном росте нагрузки на CRM-систему Redis переполнялся и падал с неопределенной периодичностью. Изучив проблему, мы поняли, что в базе копятся записи с одинаковым ключом.</p><p>Например, мы провели тренинг, на котором сотрудники выполняли одни и те же действия: зашли в профиль, выполнили задачи А и Б и так далее. Система проанализировала контакты и объединила пользователей по интересам. В результате мы получили дерево из тысяч записей с одинаковым ключом. Мало того что это увеличило нагрузку на аналитическую систему и замедлило работу приложения, так еще и подвергло риску отказоустойчивость внутри контура банка.</p><p>Первое, что пришло в голову — создать отдельный стенд для обучения, но глобально проблему это бы не решило, потому что заранее узнать, на каком аккаунте возникнет рост, мы не сможем. Да и создание такого демостенда — накладно и не очень честно по отношению к обучаемым, потому что учеба должна проходить на реальным платформе с реальными примерами.</p><p>Также думали и ограничить коммуникацию с одним пользователем в рамках какого-то времени, но это доставило бы неудобства реальным пользователям: мы могли заафектить реальных клиентов, к тому же при каждой записи получать COUNT по ID было бы очень дорого.</p><p>Последняя идея, пришедшая к нам, была такой: искать высоконагруженные ID в mySQL и уже потом удалять их из Redis. Но это бы тоже не сработало, потому что постоянно сканировать счетчик ID долго и дорого.</p><h2>Не найдя комфортного решения на текущей архитектуре, мы начали и тестировать другие инструменты</h2><p>Взяли MongoDB, это тоже NoSQL база данных, которая хранит информацию не в кэше, а в формате BSON, в виде документов, содержащих пары ключ-значение. Мы сравнили скорость работы с Redis и выяснили, что MongoDB работает медленнее. Поэтому остановились на компиляции Redis и MongoDb с помощью паттерна Cache aside. На тестирование ушло несколько месяцев.</p><p>Схема простая: данные попадают в Redis и сразу же записываются в MongoDB. Так мы получаем дублированный кэш с разным временем жизни. На стороне Redis данные хранятся ограниченное время, пару дней. При частых запросах мы не теряем в перформансе и не перегружаем Redis, потому что при нагрузке мы уже смело можем очищать данные по определенному ID.</p><p>Клиент в это время получает информацию из MongoDB (да, информация придет чуть позже, это медленнее процентов на 15, но решает проблему с нагрузкой).</p><p>На перформансе, при частых запросах, потерь в скорости почти нет: даже если данные успели стереться из Redis, они не превышают 10%. В дальнейшем данные уже попадают в Redis, и скорость возвращается.</p><h2>Так мы решили проблемы с нагрузкой</h2><p>Было приятно поделиться этой информацией, если хотите погрузиться в тему детальнее, пишите вопросы в комментариях.</p>]]></content:encoded>
    </item>
    <item>
      <title>27 распространённых вопросов по SQL с собеседований и ответы на них</title>
      <link>https://tproger.ru/articles/sql-interview-questions</link>
      <comments>https://tproger.ru/articles/sql-interview-questions?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Картофельный Повелитель]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/sql-interview-questions</guid>
      <description><![CDATA[<p>Подборка из 27 вопросов и задач по SQL, которые чаще всего задают на собеседованиях. Теория, практика, примеры запросов и ответы. Готовьтесь эффективно!</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/sql-interview-questions">27 распространённых вопросов по SQL с собеседований и ответы на них</a>»</p>]]></description>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[NoSQL]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 21 Aug 2020 11:50:13 GMT</pubDate>
      <content:encoded><![CDATA[<p>• Статья охватывает 27 ключевых вопросов по SQL: от теории (ключи, JOIN, ограничения) до практики (подзапросы, агрегатные функции)
• Каждый ответ содержит пример SQL-запроса, который можно сразу проверить
• Теоретическая часть покрывает СУБД, нормализацию, типы соединений и ограничения
• Практическая часть включает реальные задачи: поиск дублей, работу с датами, подзапросы</p><p>Вопросы по SQL на собеседованиях — обычное дело, и чтобы не завалиться, нужно хорошо понимать, как работать с базами данных. В этом списке представлены основные вопросы и задачи по SQL, которые часто встречаются на собеседованиях, а также ответы на них. Если вы готовитесь к интервью на Junior-позицию, также загляните в <a href="https://tproger.ru/articles/junior-developer-should-know">общий список вопросов для джуна</a>. Для системного изучения SQL рекомендуем <a href="https://tproger.ru/articles/dorozhnaya-karta-obucheniya-sql-dlya-dostizheniya-urovnya-middle-">дорожную карту SQL</a>.</p><h2>Теория</h2><h3>Что такое СУБД?</h3><p>Допустим, есть большая база данных, которой пользуются многие сотрудники: кто-то ищет информацию, а кто-то изменяет или даже удаляет её. Чтобы правильно обрабатывать все эти запросы, нужно специальное программное обеспечение, и именно такое ПО получило название системы управления базами данных (СУБД). Эта статья — часть нашего <a href="https://tproger.ru/articles/sql--polnyj-putevoditel---ot-pervyh-zaprosov-do-okonnyh-funkcij">полного путеводителя по SQL</a>.</p><h3>Какие типы СУБД в соответствии с моделями данных вы знаете?</h3><p>Этот вопрос по SQL предполагает не просто назвать, но и дать краткое описание каждому типу.Существует <a href="https://tproger.ru/translations/sql-nosql-database-models/">несколько типов СУБД</a>:</p><ol><li>Реляционные, которые поддерживают установку связей между таблицами с помощью первичных и внешних ключей. Пример — MySQL.Flat File — базы данных с двумерными файлами, в которых содержатся записи одного типа и отсутствует связь с другими файлами, как в реляционных. Пример — Excel.Иерархические подразумевают наличие записей, связанных друг с другом по принципу отношений один-к-одному или один-ко-многим. А вот для отношений многие-ко-многим следует использовать реляционную модель. Пример — Adabas.Сетевые похожи на иерархические, но в этом случае «ребёнок» может иметь несколько «родителей» и наоборот. Примеры — IDS и IDMS.Объектно-ориентированные СУБД работают с базами данных, которые состоят из объектов, используемых в ООП. Объекты группируются в классы и называются экземплярами, а классы в свою очередь взаимодействуют через методами. Пример — Versant.Объектно-реляционные обладают преимуществами реляционной и объектно-ориентированной моделей. Пример — IBM Db2.Многомерная модель является разновидностью реляционной и использует многомерные структуры. Часто представляется в виде кубов данных. Пример — Oracle Essbase.Гибридные состоят из двух и более типов баз данных. Используются в том случае, если одного типа недостаточно для обработки всех запросов. Пример — Altibase HDВ.</li></ol><h3>Что такое первичный ключ?</h3><p>Первичный ключ или PRIMARY KEY предназначен для однозначной идентификации каждой записи в таблице и является строго уникальным (UNIQUE): две записи таблицы не могут иметь одинаковые значения первичного ключа. Нулевые значения (NULL) в PRIMARY KEY не допускаются. Если в качестве PRIMARY KEY используется несколько полей, их называют составным ключом.Пример:</p><p>Здесь в качестве первичного ключа используется поле id.</p><h3>Когда используется PRIMARY KEY?</h3><p>PRIMARY KEY — это первичный ключ, который используется в качестве основного ключа и может быть использован для связи с дочерней таблицей, содержащей внешний ключ.</p><h3>А что такое внешний ключ?</h3><p>Внешний ключ или FOREIGN KEY также является атрибутом ограничения и обеспечивает связь двух таблиц. По сути, это поле или несколько полей, которые ссылаются на PRIMARY KEY в родительской таблице.Пример использования:</p><p>В данном случае внешний ключ, привязанный к полю user_id в таблице order, ссылается на первичный ключ id в таблице users, и именно по этим полям происходит связывание двух таблиц.</p><h3>Какие ещё ограничения вы знаете, как они работают и указываются?</h3><p>SQL-ограничения (constraints) указываются при создании или изменении таблицы. Это правила для ограничения типа данных, которые могут храниться в таблице. Действие с данными не будет выполнено, если нарушаются установленные ограничения.</p><ul><li>UNIQUE — гарантирует уникальность значений в столбце;</li><li>NOT NULL — значение не может быть NULL;</li><li>INDEX — создаёт индексы в таблице для быстрого поиска/запросов;</li><li>CHECK — значения столбца должны соответствовать заданным условиям;</li><li>DEFAULT — предоставляет столбцу значения по умолчанию&amp;</li></ul><h3>Для чего используется ключевое слово ORDER BY?</h3><p>Для сортировки данных в порядке возрастания (ASC) или убывания (DESC).Пример использования:</p><p>Выбираются пользователи, которые будут отсортированы по имени в порядке убывания. Дополните ответ на этот вопрос по SQL тем, что без указания DESC данные были бы отсортированы по умолчанию — в порядке возрастания. Подробнее о сортировке читайте в статье <a href="https://tproger.ru/articles/sql---eto-prosto--chast-vtoraya--sortiruem-">SQL — сортировка данных</a>.</p><h3>Назовите четыре основных типа соединения в SQL</h3><p>Чтобы объединить две таблицы в одну, следует использовать оператор JOIN. Соединение таблиц может быть внутренним (INNER) или внешним (OUTER), причём внешнее соединение может быть левым (LEFT), правым (RIGHT) или полным (FULL).</p><ul><li>INNER JOIN — получение записей с одинаковыми значениями в обеих таблицах, т.е. получение пересечения таблиц.</li><li>FULL OUTER JOIN — объединяет записи из обеих таблиц (если условие объединения равно true) и дополняет их всеми записями из обеих таблиц, которые не имеют совпадений. Для записей, которые не имеют совпадений из другой таблицы, недостающее поле будет иметь значение NULL.</li><li>LEFT JOIN — возвращает все записи, удовлетворяющие условию объединения, плюс все оставшиеся записи из внешней (левой) таблицы, которые не удовлетворяют условию объединения.</li><li>RIGHT JOIN — работает точно так же, как и левое объединение, только в качестве внешней таблицы будет использоваться правая.</li></ul><figure><img src="https://media.tproger.ru/uploads/2020/08/DFDFD.jpg" alt="" /></figure><p>Рассмотрим пример соединения SQL таблиц с использованием INNER JOIN. Следующий запрос выбирает все заказы с информацией о клиенте:</p><h3>А что такое Self JOIN?</h3><p>Такой вопрос тоже может прозвучать на собеседовании по SQL. Это выражение используется для того, чтобы таблица объединилась сама с собой, словно это две разные таблицы. Чтобы такое реализовать, одна из таких «таблиц» временно переименовывается.Например, следующий SQL-запрос объединяет клиентов из одного города:</p><h3>Для чего нужен оператор UNION?</h3><p>Он используется для объединения полученных данных из двух или более запросов, которые должны иметь одинаковое количество столбцов с одинаковыми типами данных и расположенных в том же порядке.Пример использования:</p><h3>Как работают подстановочные знаки?</h3><p>Это специальные символы, которые нужны для замены каких-либо знаков в запросе. Они используются вместе с оператором LIKE, с помощью которого можно отфильтровать запрашиваемые данные.</p><h3>Какими бывают подстановочные знаки?</h3><ul><li>% — заменить ноль или более символов;</li><li>_ — заменить один символ.</li></ul><p>Примеры:</p><p>Данный запрос позволяет найти данные всех пользователей, имена которых содержат в себе «test».</p><p>А в этом случае имена искомых пользователей начинаются на «t», после содержат какой-либо символ и «est» в конце. Ещё практика — <a href="https://tproger.ru/articles/5-zadanij-po-sql-s-realnyh-sobesedovanij">5 заданий с реальных собеседований</a>.</p><h3>Что делают псевдонимы Aliases?</h3><p>SQL-псевдонимы нужны для того, чтобы дать временное имя таблице или столбцу. Это нужно, когда в запросе есть таблицы или столбцы с неоднозначными именами. В этом случае для удобства в составлении запроса используются псевдонимы. SQL-псевдоним существует только на время запроса.Пример:</p><h3>Для чего нужен оператор INSERT INTO SELECT?</h3><p>Данный оператор копирует данные из одной таблицы и вставляет их в другую, при этом типы данных в обеих таблицах должны соответствовать.Пример использования:</p><h3>Что такое нормализация и денормализация?</h3><p>Нормализация отношений в SQL призвана <a href="https://tproger.ru/translations/db-scheme-design-guide/">организовать информацию в базе данных</a> таким образом, чтобы она не занимала много места и с ней было удобно работать. Это удаление избыточных данных, устранение дублей, идентификация наборов связанных данных через PRIMARY KEY, etc.Соответственно, денормализация является обратным процессом, который вносит в нормализованную таблицу избыточные данные.Подробнее о пяти нормальных формах и форме Бойса-Кодда можно узнать <a href="https://www.youtube.com/watch?v=nsXV4PGMmrk&amp;list=PLtULzFUr0kI5YKdBKKAzt7AFjjoMnGX_a">из данного видеокурса</a>.</p><h3>Объясните разницу между командами DELETE и TRUNCATE”</h3><p>Команда DELETE — это DML-операция, которая удаляет записи из таблицы, соответствующие заданному условию:</p><p>При этом создаются логи удаления, то есть операцию можно отменить.А вот команда TRUNCATE — это DDL-операция, которая полностью пересоздаёт таблицу, и отменить такое удаление невозможно:</p><h3>Чем VARCHAR отличается от NVARCHAR?</h3><p>Главное отличие в том, что VARCHAR хранит значения в формате ASCII, где символ занимает один байт, а NVARCHAR хранит значения в формате Unicode, где символ «весит» 2 байта. Тип VARCHAR следует использовать, если вы уверены, что в значениях не будет Unicode-символов. Например, VARCHAR можно применить к адресам электронной почты, состоящих из ASCII-символов.</p><h2>Практика</h2><h3>Как выбрать записи с нечётными Id?</h3><p>Один из самых распространённых вопросов на собеседовании. SQL запрос для выбора записей с нечётными id должен выглядеть следующим образом:</p><p>Если остаток от деления id на 2 равен нулю, перед нами чётное значение, и наоборот.</p><h3>Как найти дубли в поле email?</h3><p>Функция COUNT() возвращает количество строк из поля email. Оператор HAVING работает почти так же, как и WHERE, вот только применяется не для всех столбцов, а для набора, созданного оператором GROUP BY.</p><h3>При выборке из таблицы прибавьте к дате 1 день</h3><p>Функция DATE_ADD() прибавляет к дате заданный промежуток времени. Синтаксис выглядит следующим образом:</p><h3>Выберите только уникальные имена</h3><p>SELECT DISTINCT возвращает разные значения, даже если в выбранном столбце есть дубли.</p><h3>Найдите в таблице среднюю зарплату работников</h3><p>Функция AVG() применяется только к числовым типам данных и возвращает среднее значение по столбцу.</p><h3>А теперь получите список сотрудников с зарплатой выше средней</h3><h3>Даны таблицы workers и departments. Найдите все департаменты без единого сотрудника</h3><h3>Замените в таблице зарплату работника на 1000, если она равна 900, и на 1500 в остальных случаях</h3><p>Замена значений — одна из наиболее часто встречаемых задач по SQL на собеседованиях. Решить её несложно:</p><p>Оператор UPDATE используется для изменения существующих записей. Но ответы на подобные вопросы с собеседований по SQL должны быть более развёрнутыми. Уточните,что после UPDATE следует указать, какие записи должны быть обновлены. В противном случае обновятся все записи в таблице.В нашем примере условие задаётся через оператор CASE: если текущая зарплата равна 900, изменяем её на 1000, в остальных случаях — на 1500.</p><h3>При выборке из таблицы пользователей создайте поле, которое будет включать в себя и имена, и зарплату</h3><p>Функция CONCAT() используется для конкатенации (объединения) строк, неявно преобразуя при этом любые типы данных в строки.</p><h3>Переименуйте таблицу</h3><p>С помощью оператора ALTER TABLE можно добавлять, удалять, изменять столбцы, а также изменять название таблицы.</p><h2>Часто задаваемые вопросы</h2><h3>Какие вопросы по SQL чаще всего задают на собеседованиях?</h3><p>Чаще всего спрашивают про типы JOIN, разницу между WHERE и HAVING, первичные и внешние ключи, нормализацию и подзапросы. Практические задания обычно включают поиск дублей, агрегатные функции и работу с датами.</p><h3>Достаточно ли знать только SELECT для собеседования по SQL?</h3><p>Нет. Помимо SELECT на собеседованиях проверяют знание DDL-команд (CREATE, ALTER, DROP), DML-операций (INSERT, UPDATE, DELETE), ограничений (PRIMARY KEY, FOREIGN KEY, UNIQUE) и умение работать с подзапросами.</p><h3>Как лучше всего готовиться к SQL-собеседованию?</h3><p>Разберите теорию (ключи, JOIN, нормализация), а затем решайте практические задачи на платформах вроде LeetCode, HackerRank или SQLBolt. Пишите запросы руками — простое чтение ответов не закрепляет навык. Для углублённого изучения рекомендуем материалы по <a href="https://tproger.ru/articles/osnovy-postgresql-dlya-nachinayushhih--ot-ustanovki-do-pervyh-zaprosov-250851">основам PostgreSQL</a>, <a href="https://tproger.ru/articles/sql-indeksy-za-10-minut">SQL-индексам</a> и <a href="https://tproger.ru/articles/sovety-po-optimizacii-sql-zaprosov-dlya-snizheniya-nagruzki-na-bd">оптимизации SQL-запросов</a>. Также полезно понимать, <a href="https://tproger.ru/experts/junior-middle-senior-developers-differences">какие навыки ожидают от разработчика на каждом грейде</a>. Оконные функции часто спрашивают — <a href="https://tproger.ru/translations/sql-window-functions">разбор с примерами</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Знакомство с InfluxDB и базами данных временных рядов</title>
      <link>https://tproger.ru/translations/influxdb-guide</link>
      <comments>https://tproger.ru/translations/influxdb-guide?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Klara Oswald]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/influxdb-guide</guid>
      <description><![CDATA[<p>InfluxDB — база данных временных рядов. Рассматриваются её основные концепции: измерения, теги, поля, случаи использования и отличия от реляционных БД.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/influxdb-guide">Знакомство с InfluxDB и базами данных временных рядов</a>»</p>]]></description>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[NoSQL]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 06 Oct 2019 13:26:33 GMT</pubDate>
      <content:encoded><![CDATA[<p>InfluxDB, база данных временных рядов (<a href="https://en.wikipedia.org/wiki/Time_series_database">TSDB</a>), разработанная InfluxData, в последние несколько месяцев демонстрирует всё большую популярность. Она стала одной из справочников для разработчиков и инженеров, желающих внедрить мониторинг в реальном времени в свою собственную инфраструктуру. Но что именно из себя представляет InfluxDB? Зачем она нужна? Какую ценность вы можете привнести, внедрив InfluxDB в свою среду?</p><p>Эта статья — отправная точка для разработчиков, инженеров и ИТ-специалистов, которые хотят изучить InfluxDB, его концепции, случаи использования и реальные приложения.</p><p>Для начала поговорим в целом о базах данных временных рядов. О том, что они из себя представляют и чем отличаются от традиционных <a href="https://ru.wikipedia.org/wiki/Реляционная_база_данных">реляционных баз данных</a> (РБД). После этого рассмотрим концепции, которые определяют InfluxDB. Не знакомы с измерениями, тегами или полями? Всё будет объяснено.</p><h2>Что такое база данных временных рядов?</h2><p>БД временных рядов, исходя из названия, представляют собой системы баз данных, специально предназначенные для обработки информации, связанной со временем.</p><p>В основном все имеют дело с реляционными базами данных (<a href="https://ru.wikipedia.org/wiki/MySQL">MySQL</a> или <a href="https://ru.wikipedia.org/wiki/Microsoft_SQL_Server">SQL Server</a>). Возможно, вы также имели дело с базами данных <a href="https://ru.wikipedia.org/wiki/NoSQL">NoSQL</a> (<a href="https://ru.wikipedia.org/wiki/MongoDB">MongoDB</a> или <a href="https://ru.wikipedia.org/wiki/DynamoDB">DynamoDB</a>). Все они основаны на том, что у вас есть таблицы. Эти таблицы содержат столбцы и строки, каждая из которых определяет запись в вашей таблице. Часто эти таблицы специально предназначены для определённой цели. Одна может быть предназначена для хранения пользователей, другая — для фотографий или видео. Такие системы эффективны, масштабируемы и используются множеством гигантских компаний с миллионами запросов на своих серверах.</p><p>Базы данных временных рядов работают иначе. Данные по-прежнему хранятся в «коллекциях», но эти коллекции имеют общий знаменатель: они объединены со временем. Это означает, что для каждой точки, которую вы можете сохранить, у вас есть связанная с ней временная метка.</p><figure><img src="https://media.tproger.ru/uploads/2019/09/difference-relational-time-series-1024x288.png" alt="" /></figure><p>Возникает вопрос: нельзя ли использовать реляционную базу данных и просто включить в неё столбец с именем «время»? Например, в Oracle есть тип данных TIMESTAMP, который можно было бы использовать для этой цели. Конечно, такое возможно, но это неэффективно.</p><h2>Зачем нужны базы данных временных рядов?</h2><p>Три слова: быстрый приём данных.</p><p>Системы баз данных временных рядов построены так, чтобы быстро и эффективно принимать данные. Реляционные базы данных тоже имеют большую скорость загрузки данных (от 20 000 до 100 000 строк в секунду). Тем не менее, приём не постоянен во времени. У реляционных баз данных есть один ключевой аспект, который делает их медленными при росте данных — индексы.</p><p>При добавлении новых записей в реляционную БД и при наличии в таблице индексов СУБД будет многократно переиндексировать данные для быстрого и эффективного доступа к ним. Как следствие, производительность со временем снижается. При этом увеличивается нагрузка, что приводит к трудностям при чтении данных.</p><p>База данных временных рядов оптимизирована для быстрого приёма данных. Такие системы используют индексацию данных, объединённых со временем. Как следствие, скорость загрузки не уменьшается со временем и остается достаточно стабильной (от 50 до 100 тыс. строк в секунду на одном узле).</p><figure><img src="https://media.tproger.ru/uploads/2019/09/difference-dbms-tsdb.png" alt="" /></figure><h2>Специфичные концепции баз данных временных рядов</h2><p>Кроме высокой скорости приёма, базы данных временных рядов вводят специфичные для этих технологий концепции.</p><p>Одной из них является организация хранения данных. В традиционной РБД данные хранятся до тех пор, пока вы не решите их удалить. Учитывая сценарии использования БД временных рядов, вы можете не хранить ваши данные слишком долго: это или слишком дорого, или данные со временем теряют актуальность.</p><p>Системы вроде InfluxDB могут позаботиться об удалении данных через определённое время, используя концепцию, называемую политикой хранения. Вы также можете выполнять непрерывные запросы к оперативным данным для выполнения определённых операций. В реляционной БД можно найти эквивалентные операции (например «задания» в SQL), которые могут выполняться по заданному расписанию.</p><h3>Совершенно другая экосистема</h3><p>Особенности БД временных рядов хорошо видны, когда речь заходит об их экосистемах. Как правило, реляционные базы данных окружены приложениями, которые подключаются к ним для получения информации или добавления новых записей.</p><p>Часто база данных ассоциируется с одной системой. Клиенты подключаются к веб-сайту, который обращается к базе данных для получения информации. БД временных рядов созданы под множество клиентов (программ). Здесь нет простого сервера, обращающегося к БД, но есть куча разных сенсоров (к примеру), выполняющих вставку данных одновременно.</p><p>Как следствие, её инструменты были разработаны для того, чтобы предоставить эффективные способы потребления или производства данных.</p><h3>Потребление данных</h3><p>Потребление данных часто осуществляется с помощью инструментов мониторинга вроде <a href="https://grafana.com/">Grafana</a> или <a href="https://www.influxdata.com/time-series-platform/chronograf/">Chronograf</a>. Эти клиенты имеют встроенные решения для визуализации данных и даже для создания пользовательских предупреждений.</p><figure><img src="https://media.tproger.ru/uploads/2019/09/consumption-1024x355.jpg" alt="" /></figure><p>Эти инструменты часто используются для создания живых панелей мониторинга, которые могут быть представлены графиками, гистограммами, датчиками или картами окружающего мира.</p><h3>Производство данных</h3><p>Производство данных осуществляется агентами, которые нацеливаются на специальные элементы в инфраструктуре и извлекают из них метрики. Такие агенты называются «агентами мониторинга». Вы можете легко настроить их для запроса данных за определённый промежуток времени. Примерами являются <a href="https://www.influxdata.com/time-series-platform/telegraf/">Telegraf</a> (который является официальным агентом мониторинга), <a href="https://collectd.org/">CollectD</a> или <a href="https://github.com/statsd/statsd">StatsD</a>.</p><figure><img src="https://media.tproger.ru/uploads/2019/09/production-1024x436.jpg" alt="" /></figure><p>Теперь вы лучше понимаете, что такое базы данных временных рядов и чем они отличаются от реляционных. Пришло время углубиться в конкретные концепции InfluxDB.</p><h2>Концепции InfluxDB</h2><p>В этом разделе будут объяснены ключевые концепции InfluxDB и ключевые запросы, связанные с этими концепциями. InfluxDB встраивает свой собственный язык запросов и это заслуживает отдельного пояснения.</p><h3>Язык запросов InfluxDB</h3><p>Прежде чем начать, важно знать, какую версию InfluxDB вы используете в настоящее время. По состоянию на октябрь 2019 года InfluxDB выпускается в двух версиях: v1.7+ и v2.0.</p><p>InfluxDB v2.0 в настоящее время (на октябрь 2019 года) является альфа-версией и использует язык Flux. InfluxDB v1.7 оснащён языком InfluxQL (а также Flux, если его активировать). Пока лучше использовать InfluxQL, так как Flux не полностью установлен в текущей версии платформы.</p><figure><img src="https://media.tproger.ru/uploads/2019/10/e54p45p45p.png" alt="" /></figure><p>InfluxQL — это язык запросов, который очень похож на SQL, и позволяет любому пользователю запрашивать свои данные и фильтровать их. Вот пример запроса InfluxQL:</p><p>Дальше будут рассмотрены ключевые концепции InfluxDB, предоставляемые с соответствующими запросами IQL (InfluxQL).</p><h2>Ключевые концепции InfluxDB</h2><p>Рассмотрим список основных терминов, которые необходимо знать для работы с InfluxDB в 2019 году.</p><h3>База данных</h3><p>База данных — само по себе простое для понимания понятие, потому что вы привыкли использовать этот термин в реляционных базах данных. В SQL-среде БД будет содержать набор таблиц и схем и будет представлять один экземпляр самостоятельно.</p><p>В InfluxDB БД содержит набор измерений. Однако один экземпляр InfluxDB может содержать несколько баз данных. В этом его отличие от традиционных систем. Эта логика подробно представлена на графике ниже:</p><figure><img src="https://media.tproger.ru/uploads/2019/09/influx-internals.jpg" alt="" /></figure><p>Наиболее распространённые способы взаимодействия с базами данных — это либо их создание (CREATE DATABASE “devconnected”;), либо переход в них (USE devconnected;) для просмотра коллекций (вы должны быть «в базе данных», чтобы запрашивать коллекции, иначе это не сработает).</p><h3>Измерение</h3><p>Как показано выше, база данных хранит несколько измерений (measurement). Для простоты восприятия думайте об измерении как о таблице SQL. Она хранит данные и даже метаданные в разные моменты времени. Данные, которые должны сосуществовать вместе, должны храниться в одном измерении.</p><figure><img src="https://media.tproger.ru/uploads/2019/09/measurement-1.png" alt="" /></figure><h3>Теги и поля</h3><p>Обратите внимание, есть тонкая разница между тегами и полями.</p><p>Для тех, кто впервые начинает работать с InfluxDB, будет трудно понять, чем отличаются теги и поля. Они похожи на «столбцы», где вы можете хранить точно такие же данные. Определяя новый «столбец» в InfluxDB, вы можете либо объявить его как тег, либо как значение, и между ними есть различия.</p><p>Самая большая разница между ними заключается в том, что теги индексируются, а значения — нет. Теги можно рассматривать как метаданные, определяющие данные в измерении. Это подсказки, дающие дополнительную информацию о данных, но не сами данные. Поля — это сами данные. В прошлом примере столбец «температура» был бы полем.</p><p>Вернёмся к примеру cpu_metrics. Допустим, вы хотите добавить столбец с именем «location», определяющий местоположение датчика.</p><p>Что вам выбрать: тег или поле?</p><figure><img src="https://media.tproger.ru/uploads/2019/10/tags-vs-fields-1024x333.png" alt="" /></figure><figure><img src="https://media.tproger.ru/uploads/2019/10/tags-vs-fields-1024x333-1.png" alt="" /></figure><p>В данном случае стоит выбрать тег. Необходимо, чтобы столбец «местоположение» индексировался и учитывался при выполнении запроса к местоположению.</p><p>Хорошей практикой будет держать измерения относительно небольшими, когда речь идёт о большом количестве полей. Всё большее количество полей часто связано с меньшей производительностью. Вы можете создать другие измерения, чтобы сохранить другое поле и правильно его проиндексировать.</p><p>Теперь, когда мы добавили метку местоположения в измерение, немного углубимся в таксономию.</p><p>Набор тега называется «tag set». Имя столбца в теге называется «tag key». Значения тега называются «tag values». Та же систематика повторяется для полей. Вернёмся к чертежам.</p><figure><img src="https://media.tproger.ru/uploads/2019/10/taxonomy.png" alt="" /></figure><h3>Временная метка</h3><p>Временная метка (timestamp) — наверное, самое простое для определения ключевое слово. В InfluxDB — это дата и время, определённые в формате RFC3339. При использовании InfluxDB очень часто определяют столбец времени как метку в Unix-времени, выраженную в наносекундах.</p><p>Вы можете выбрать формат наносекунд для временного столбца и позже снизить точность, добавляя нули в конец значения, чтобы оно соответствовало формату наносекунд.</p><h3>Политика хранения</h3><p>Политика хранения определяет, как долго вы собираетесь хранить ваши данные. Политики хранения определяются для каждой базы данных и их может быть несколько. По умолчанию политика хранения будет autogen и хранит ваши данные вечно. Как правило, базы данных имеют несколько политик хранения, которые используются для разных целей.</p><figure><img src="https://media.tproger.ru/uploads/2019/09/retention-policies-1.png" alt="" /></figure><p>Представим, что вы используете InfluxDB для оперативного мониторинга всей инфраструктуры.</p><p>Например, вы хотите знать, когда сервер отключается. В этом случае вас интересуют данные, поступающие с этого сервера в настоящий момент или за несколько минут до этого. Вы не заинтересованы в хранении данных в течение нескольких месяцев, поэтому хотите определить небольшую политику хранения: например один или два часа.</p><p>Предположим, вы используете InfluxDB для IoT, например для сбора данных, поступающих из резервуара для воды. Позже вы захотите поделиться своими данными с группой научных специалистов, чтобы они могли их проанализировать. В этом случае вы можете хранить данные дольше: например пять лет.</p><h3>Точка</h3><p>Точка (point) — это просто набор полей с одинаковой отметкой времени. В SQL это будет выглядеть как строка или как уникальная запись в таблице. Здесь нет ничего особенного.</p><h2>Случаи использования InfluxDB</h2><p>Мониторинг DevOps — очень объёмная тема. Всё больше команд вкладывают средства в создание быстрой и надёжной архитектуры, основанной на мониторинге. Начиная от сервисов и заканчивая кластерами серверов, инженеры часто создают стек мониторинга, который обеспечивает интеллектуальные оповещения.</p><p>Чтобы узнать больше о мониторинге DevOps, ознакомьтесь со статьёй «Monitoring systemd services in realtime with Chronograf».</p><p>С помощью инструментов в начале статьи вы можете создать собственную инфраструктуру мониторинга и принести прямую пользу вашей компании или начинающему предприятию.</p><h3>IoT</h3><p>Развитие IoT, вероятно, будет революцией, которая произойдёт в ближайшие несколько лет. Предполагается, что к 2020 году более 30 миллиардов устройств будут считаться устройствами IoT. Независимо от того, осуществляете ли вы мониторинг одного устройства или гигантской сети таких девайсов, вам необходимо иметь точные и мгновенные показатели, чтобы вы могли принимать наилучшие решения.</p><p>Реальные компании уже работают с InfluxDB для IoT. Одним из примеров может быть <a href="https://www.worldsensing.com/">WorldSensing</a>, компания, которая нацелена на расширение умных городов с помощью индивидуальных концепций, таких как интеллектуальная парковка или система мониторинга трафика.</p><h3>Промышленные и умные заводы</h3><p>Заводы становятся всё более и более связанными. Процесс выполнения задач более автоматизирован, чем когда-либо. Как следствие, возникает очевидная необходимость иметь возможность контролировать каждый элемент производственной цепочки для обеспечения максимальной производительности. Но даже когда машины не выполняют всю работу и задействованы люди, мониторинг временных рядов даёт уникальную возможность донести соответствующие показатели до менеджеров.</p><p>Помимо повышения производительности, они могут способствовать созданию более безопасных рабочих мест, поскольку они способны быстрее обнаруживать проблемы.</p><h3>Ваше собственное воображение</h3><p>Приведённые выше примеры являются лишь примерами. Ваше воображение — это единственное ограничение для приложений, которые вы можете применить для баз данных временных рядов. Например, временные ряды могут использоваться даже в кибербезопасности.</p><h2>Идём дальше</h2><p>В этой статье было рассмотрено, что такое базы данных временных рядов и как они используются в реальном мире. А также много технических терминов, стоящих за InfluxDB.</p><p>Хороший совет — создайте что-то сами. <a href="https://docs.influxdata.com/influxdb/v1.7/introduction/installation/">Установите</a> InfluxDB, поиграйте с инструментами. Создайте информационную панель, поиграйтесь с запросами, настройте некоторые оповещения. Только так вы сможете сами «пощупать» эту технологию и составить о ней своё мнение.</p>]]></content:encoded>
    </item>
    <item>
      <title>MongoDB разработала собственный тип Open Source лицензии</title>
      <link>https://tproger.ru/news/mongodb-developed-new-license</link>
      <comments>https://tproger.ru/news/mongodb-developed-new-license?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Сергей Штукатуров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/mongodb-developed-new-license</guid>
      <description><![CDATA[<p>Разработчики СУБД сменили лицензию из-за провайдеров, зарабатывавших на её коде; для обычных пользователей общественного сервера ничего не изменится.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/mongodb-developed-new-license">MongoDB разработала собственный тип Open Source лицензии</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[NoSQL]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 16 Oct 2018 16:26:21 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчики системы управления базами данных с открытым исходным кодом MongoDB <a href="https://www.mongodb.com/blog/post/mongodb-now-released-under-the-server-side-public-license">объявили</a>, что теперь их продукт будет распространяться под лицензией <a href="https://www.mongodb.com/licensing/server-side-public-license">Server Side Public License</a> (SSPL). Такое решение приняли из-за большого количества провайдеров, использовавших код MongoDB для предоставления платных услуг клиентам. При этом сами создатели инструмента никаких отчислений не получали.</p><h3>Что изменится для пользователей MongoDB</h3><p>Как уверяют разработчики, для обычных пользователей, работающих с общественным сервером, ничего не изменится, ограничения новой лицензии их не коснутся. Однако провайдеры, желающие использовать исходный код системы для создания собственного сервера, предоставляющего платные услуги, должны будут либо купить коммерческую лицензию, либо предоставить сообществу доступ к исходному коду их разработки.</p><p>Server Side Public License не сильно отличается от GNU AGPLv3, под которой MongoDB распространялась раньше. Разработанный создателями базы данных стандарт затрагивает модель распространения SaaS (Software-as-a-Service), ставшую в последнее время популярной. Элиот Горовиц (Eliot Horowitz), сооснователь компании, считает, что использование новой лицензии поможет защитить и вдохновить ещё больше разработчиков открытого исходного кода.</p><h3>Причины изменения лицензии</h3><p>Элиот Горовиц заявил в блоге, что перед ним и коллегами встал выбор. Они могли сделать свой продукт полностью закрытым или перевести под закрытую лицензию ключевые файлы. Однако руководство MongoDB решило, что открытый исходный код делает возможным создание более качественного и безопасного ПО, а использование различных лицензий в рамках одного продукта препятствует целостности его восприятия. В результате было принято решение о создании нового типа лицензии.</p><p>У подобного подхода, однако, могут найтись и противники. MongoDB является коммерческой организацией, и, несмотря на открытую лицензию, работает для извлечения прибыли. Часть адептов Open Source считает, что такие действия идут вразрез с самой концепцией открытого ПО.</p><p>Open Source Initiative <a href="https://tproger.ru/articles/whats-difference-between-licenses/">насчитывает</a> уже некоторое количество различных лицензий для открытого ПО. Однако технологии не стоят на месте, и SSPL может оказаться востребованной среди разработчиков.</p>]]></content:encoded>
    </item>
    <item>
      <title>Разбираемся в типах NoSQL СУБД</title>
      <link>https://tproger.ru/translations/types-of-nosql-db</link>
      <comments>https://tproger.ru/translations/types-of-nosql-db?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Никита Прияцелюк]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/types-of-nosql-db</guid>
      <description><![CDATA[<p>Ключ-значение, документоориентированные, колоночные и графовые базы данных: устройство хранения, ключи, блоки и особенности каждого из типов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/types-of-nosql-db">Разбираемся в типах NoSQL СУБД</a>»</p>]]></description>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[NoSQL]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 08 Oct 2018 16:48:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>В этой статье мы познакомимся с разными типами NoSQL СУБД.</p><p>Всего есть 4 основных типа:</p><ol><li>Хранилище «ключ-значение» — в нём есть большая хеш-таблица, содержащая ключи и значения. Примеры: Riak, Amazon DynamoDB;</li><li>Документоориентированное хранилище — хранит документы, состоящие из тегированных элементов. Пример: CouchDB;</li><li>Колоночное хранилище — в каждом блоке хранятся данные только из одной колонки. Примеры: HBase, Cassandra;</li><li>Хранилище на основе графов — сетевая база данных, которая использует узлы и рёбра для отображения и хранения данных. Пример: Neo4J.</li></ol><h3>База данных типа «ключ-значение»</h3><p>Отсутствие схемы в базах данных «ключ-значение», например, Riak, — это как раз то, что вам нужно для хранения данных. Ключ может быть синтетическим или автосгенерированным, а значение может быть представлено строкой, JSON, блобом (BLOB, Binary Large Object, большой двоичный объект) и т.д.</p><p>Такие базы данных как правило используют хеш-таблицу, в которой находится уникальный ключ и указатель на конкретный объект данных. Существует понятие блока (bucket) — логической группы ключей, которые не группируют данные физически. В разных блоках могут быть идентичные ключи.</p><p>Производительность сильно вырастает за счёт кеширующих механизмов, которые работают на основе маппингов. Чтобы прочитать значение, вам нужно знать как ключ, так и блок, поскольку на самом деле ключ является хешем (блок + ключ).</p><p>В модели «ключ-значение» нет ничего сложного, так как реализовать её проще простого. Не лучший способ, если вам нужно только обновить часть значения или сделать запрос к базе данных.</p><p>Если поразмыслить о <a href="https://ru.wikipedia.org/wiki/Теорема_CAP">теореме CAP</a>, то становится довольно очевидно, что такие хранилища хороши в плане доступности (Availability) и устойчивости к разделению (Partition tolerance), но явно проигрывают в согласованности данных (Consistency).</p><p>Пример: посмотрим на набор данных, представленных таблицей ниже. Здесь ключ — это название страны, а значение — список адресов в этой стране:</p><figure><img src="https://media.tproger.ru/uploads/2018/10/table.png" alt="" /></figure><p>База данных такого типа позволяет читать и записывать значения с помощью ключа следующим образом:</p><ul><li>Get(key) возвращает значение, связанное с переданным ключом;</li><li>Put(key, value) связывает значение с ключом;</li><li>Multi-get(key1, key2, ..., keyN) возвращает список значений, связанных с переданным ключами;</li><li>Delete(key) удаляет запись для ключа из хранилища.</li></ul><p>И хотя базы данных типа «ключ-значение» могут пригодиться в определённых ситуациях, они не лишены недостатков. Первый заключается в том, что модель не предоставляет стандартные возможности баз данных вроде атомарности транзакций или согласованности данных при одновременном выполнении нескольких транзакций. Такие возможности должны предоставляться самим приложением.</p><p>Второй недостаток в том, что при увеличении объёмов данных, поддержание уникальных ключей может стать проблемой. Для её решения необходимо как-то усложнять процесс генерации строк, чтобы они оставались уникальными среди очень большого набора ключей.</p><p>Riak и <a href="https://ru.wikipedia.org/wiki/DynamoDB">Dynamo</a> от Amazon — самые популярные СУБД данных такого типа.</p><h3>Документоориентированная база данных</h3><p>Данные, представленные парами ключ-значение, сжимаются как хранилище документов схожим с хранилищем «ключ-значение» образом, с той лишь разницей, что хранимые значения (документы) имеют определённую структуру и кодировку данных. XML, JSON и BSON — некоторые из стандартных распространённых кодировок.</p><p>В следующем примере можно увидеть данные в виде «документа» который отображает названия определённых магазинов. Обратите внимание, что, хотя все три примера содержат местоположение, они отображают его по-разному:</p><p>Одним из ключевых различий между хранилищем «ключ-значение» и документоориентированным является то, что последний включает метаданные, связанные с хранимым содержимым, что даёт возможность делать запросы на основе содержимого. Например, в указанном примере можно попробовать найти все документы, в которых «City» равно «Noida», что вернёт все документы, связанные с магазинами в этом городе.</p><p><a href="https://ru.wikipedia.org/wiki/CouchDB">Apache CouchDB</a> — пример документоориентированной СУБД. CouchDB использует <a href="https://ru.wikipedia.org/wiki/JSON">JSON</a> для хранения данных, <a href="https://ru.wikipedia.org/wiki/JavaScript">JavaScript</a> в качестве языка запросов с использованием <a href="https://ru.wikipedia.org/wiki/MapReduce">MapReduce</a> и <a href="https://ru.wikipedia.org/wiki/HTTP">HTTP</a> для <a href="https://ru.wikipedia.org/wiki/API">API</a>. Данные и отношения не хранятся в таблицах так, как в традиционных реляционных базах данных, а по сути являются набором независимых документов.</p><p>Тот факт, что такие базы данных работают без схемы, делает простой задачей добавление полей в JSON-документы без необходимости сначала заявлять об изменениях.</p><p>Couchbase и MongoDB — самые популярные документоориентированные СУБД.</p><h3>Колоночная база данных</h3><p>В колоночных NoSQL базах данных данные хранятся в ячейках, сгруппированных в колонки, а не в строки данных. Колонки логически группируются в колоночные семейства. Колоночные семейства могут состоять из практически неограниченного количества колонок, которые могут создаваться во время работы программы или во время определения схемы. Чтение и запись происходит с использованием колонок, а не строк.</p><p>В сравнении с хранением данных в строках, как в большинстве реляционных баз данных, преимущества хранения в колонках заключаются в быстром поиске/доступе и агрегации данных. Реляционные базы данных хранят каждую строку как непрерывную запись на диске. Разные строки хранятся в разных местах на диске, в то время как колоночные базы данных хранят все ячейки, относящиеся к колонке, как непрерывную запись, что делает операции поиска/доступа быстрее.</p><p>Пример: получение списка заголовков нескольких миллионов статей будет трудоёмкой задачей при использовании реляционных баз данных, так как для извлечения заголовков придётся проходить по каждой записи. А можно получить все заголовки с помощью только одной операции доступа к диску.</p><p>Модель данных</p><ul><li>Колоночное семейство — структура, которая может легко группировать колонки и суперколонки;</li><li>Ключ — постоянное имя записи. У ключей может быть разное количество колонок, поэтому база данных может расширяться неравномерно;</li><li>Пространство ключей — определяет самый внешний уровень организации, как правило, имя приложения/базы данных.</li><li>Колонка — имеет упорядоченный список элементов — кортежей с именами и значениями.</li></ul><p>Самыми известными примерами являются Google BigTable и HBase с Cassandra, вдохновлённые BigTable.</p><p>BigTable представляет собой высокопроизводительное, сжатое и проприетарное хранилище данных от Google.  У него есть следующие атрибуты:</p><ul><li>Разреженность — некоторые ячейки могут быть пустыми;</li><li>Распределённость — данные разделены между многими узлами;</li><li>Постоянство — хранится на диске;</li><li>Многомерность — более 1 измерения;</li><li>Сопоставление — ключ и значение;</li><li>Отсортированность — сопоставления обычно не сортируются, но этот случай — исключение.</li></ul><p>Двумерная таблица, состоящая из строк и колонок, является частью реляционной системы баз данных.</p><figure><img src="https://media.tproger.ru/uploads/2018/10/table2.png" alt="" /></figure><p>Эту таблицу можно представить в виде BigTable-сопоставления следующим образом:</p><ul><li>Внешние ключи «3PillarNoida», «3PillarCluj», «3PillarTimisoara» и «3PillarFairfax» являются аналогами строк.</li><li>«address» и «details» — колоночные семейства.</li><li>В колоночном семействе «address» есть колонки «city» и «pincode».</li><li>В колоночном семействе «details» есть колонки «strength» и «projects».</li></ul><p>На колонки можно ссылаться с помощью колоночного семейства.</p><h3>Графовая база данных</h3><p>В графовой базе данных вы не найдёте строгого формата SQL или представления таблиц и колонок, вместо этого используется гибкое графическое представление, которое идеально подходит для решения проблем масштабируемости. Графовые структуры используются вместе с рёбрами, узлами и свойствами, что обеспечивает безиндексную смежность. При использовании графового хранилища данные могут быть легко преобразованы из одной модели в другую.</p><figure><img src="https://media.tproger.ru/uploads/2018/10/graf-2-e1538897300104.jpg" alt="" /></figure><ul><li>Такие базы данных используют рёбра и узлы для представления данных.</li><li>Узлы связаны между собой определённым отношениями, представленными рёбрами между ними.</li><li>У узлов и отношений есть некоторые свойства.</li></ul><figure><img src="https://media.tproger.ru/uploads/2018/10/graphtree.png" alt="" /></figure><p>Далее описаны некоторые особенности графовой базы данных на основе примера ниже:</p><figure><img src="https://media.tproger.ru/uploads/2018/10/graph3.jpg" alt="" /></figure><p>Помеченный, направленный, атрибутированный мультиграф: граф содержит узлы, которые помечены определёнными свойствами и которые имеют связи друг с другом, что представлено направленными рёбрами. Например, связь «Элис знает Боба» выражена ребром с некоторыми свойствами.</p><p>Хотя реляционные базы данных могут скопировать поведение графовых, рёбрам потребуется соединение (JOIN), что дорого обойдётся.</p><p>Пример использования</p><p>Любой рейтинг «Рекомендовано вам», который можно увидеть на разных сайтах, зачастую составляется исходя из того, как другие пользователи оценили продукт. Графовые базы данных отлично подходят для такого случая.</p><p>InfoGrid и Infinite Graph — самые популярные графовые базы данных. InfoGrid позволяет соединять множество рёбер (Relationships) и узлов (MeshObjects), что упрощает представление набора информации со сложными взаимными ссылками.</p><p>InfoGrid предлагает два типа баз данных:</p><ul><li><a href="http://infogrid.org/trac/wiki/MeshBase">MeshBase</a> — подходящий вариант для автономного развёртывания;</li><li><a href="http://infogrid.org/trac/wiki/NetMeshBase">NetMeshBase</a> — подойдёт для больших распределённых графов и имеет дополнительные возможности для взаимодействия с другими похожими NetMeshBase.</li></ul><p>Смотрите также: <a href="https://tproger.ru/translations/sql-vs-nosql/">SQL против NoSQL на примере MySQL и MongoDB</a></p>]]></content:encoded>
    </item>
    <item>
      <title>SQL против NoSQL на примере MySQL и MongoDB</title>
      <link>https://tproger.ru/translations/sql-vs-nosql</link>
      <comments>https://tproger.ru/translations/sql-vs-nosql?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Corewood]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/sql-vs-nosql</guid>
      <description><![CDATA[<p>Ключевые различия реляционной и нереляционной структуры при выборе СУБД: язык запросов, особенности и преимущества каждого из двух вариантов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/sql-vs-nosql">SQL против NoSQL на примере MySQL и MongoDB</a>»</p>]]></description>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[NoSQL]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 24 Sep 2018 15:50:32 GMT</pubDate>
      <content:encoded><![CDATA[<p>Когда необходимо выбрать СУБД, главный вопрос обычно заключается в выборе реляционной (SQL) или нереляционной (NoSQL) структуры. У обоих вариантов есть свои преимущества, а также несколько ключевых особенностей, которые стоит иметь в виду при выборе.</p><h2>Основные различия</h2><h3>Язык</h3><p>Представьте себе город — пусть он называется Город А, где все говорят на одном языке. Все дела ведутся на нём, он используется в любой форме коммуникации — в целом это единственное средство взаимодействия и взаимопонимания для обитателей города. Изменение языка в любой из сфер деятельности собьёт всех с толку.</p><p>Теперь представьте Город Б, где все обитатели говорят на разных языках. Они совершенно по-разному взаимодействуют с окружающим миром, и для них не существует «универсального» средства общения.</p><p>Эти два примера наглядно демонстрируют различия между реляционными и нереляционными базами данных, и за этими различиями скрываются ключевые особенности обеих СУБД.</p><p>Реляционные базы данных используют структурированный язык запросов (Structured Query Language, SQL) для определения и обработки данных. С одной стороны, это открывает большие возможности для разработки: SQL один из наиболее гибких и распространённых языков запросов, так что его выбор позволяет минимизировать ряд рисков, и будет особенно кстати, если предстоит работа с комплексными запросами. С другой стороны, в SQL есть ряд ограничений. Построение запросов на этом языке обязывает предопределять структуру данных и, как в случае с Городом А, последующее изменение структуры данных может быть губительным для всей системы.</p><p>Нереляционные базы данных, в свою очередь, предлагают динамическую структуру данных, которые могут храниться несколькими способами: ориентированно по колонкам, документо-ориентированно, в виде графов или на основе пар «ключ-значение». Такая гибкость означает следующее:</p><ul><li>Вы можете создавать документы, не задавая их структуру заранее;</li><li>Каждый документ может обладать собственной структурой;</li><li>У каждой базы данных может быть собственный синтаксис;</li><li>Вы можете добавлять поля прямо во время работы с данными.</li></ul><h3>Масштабируемость</h3><p>В большинстве случаев SQL базы данных вертикально масштабируемые, то есть вы можете увеличивать нагрузку на отдельно взятый сервер, наращивая мощность центральных процессоров, объёмы ОЗУ или системы хранения данных. А NoSQL базы данных горизонтально масштабируемы. Это означает, что вы можете увеличивать трафик, распределяя его или добавляя больше серверов к вашей СУБД. Всё равно, что добавлять больше этажей к вашему зданию, либо добавлять больше зданий на улицу. Во втором случае, система может стать куда больше и мощнее, делая выбор NoSQL базы данных предпочитаемым для больших или постоянно меняющихся структур данных.</p><h3>Структура</h3><p>В реляционных СУБД данные представлены в виде таблиц, в то время как в нереляционных — в виде документов, пар «ключ-значение», графов или wide-column хранилищ. Это делает SQL базы данных лучшим выбором для приложений, которые предполагают транзакции с несколькими записями — как, например, система учётных записей — или для устаревших систем, которые были построены для реляционных структур.</p><p>В число СУБД для SQL баз данных входят MySQL, Oracle, PostgreSQL и Microsoft SQL Server. Для работы с NoSQL подойдут MongoDB, BigTable, Redis, RavenDB Cassandra, HBase, Neo4j и CouchDB.</p><h2>SQL vs. NoSQL: MySQL или MongoDB</h2><p>Разобравшись с ключевыми структурными различиями SQL и NoSQL баз данных, стоит внимательно рассмотреть их функциональные особенности на примере MySQL и MongoDB.</p><h3>MySQL: реляционная СУБД</h3><p>Преимущества MySQL:</p><ul><li>Проверено временем: MySQL — крайне развитая СУБД, что означает наличие большого сообщества вокруг неё, множество примеров и высокую надёжность;</li><li>Совместимость: MySQL доступна на всех основных платформах, включая Linux, Windows, Mac, BSD и Solaris. Также у неё есть библиотеки для языков вроде Node.js, Ruby, C#, C++, Java, Perl, Python и PHP;</li><li>Окупаемость: Это СУБД с открытым исходным кодом, находящаяся в свободном доступе;</li><li>Реплицируемость: Базу данных MySQL можно распределять между несколькими узлами, таким образом уменьшая нагрузку и улучшая масштабируемость и доступность приложения;</li><li>Шардинг: В то время как шардинг невозможен на большинстве SQL баз данных, MySQL является исключением.</li></ul><h3>MongoDB: нереляционная СУБД</h3><p>Преимущества MongoDB:</p><ul><li>Динамическая схема: Как упоминалось выше, эта СУБД позволяет гибко работать со схемой данных без необходимости изменять сами данные;</li><li>Масштабируемость: MongoDB горизонтально масштабируема, что позволяет легко уменьшить нагрузку на сервера при больших объёмах данных;</li><li>Удобство в управлении: СУБД не нуждается в отдельном администраторе базы данных. Благодаря достаточному удобству в использовании, ей легко могут пользоваться как разработчики, так и системные администраторы;</li><li>Скорость: Высокая производительность при выполнении простых запросов;</li><li>Гибкость: В MongoDB можно без вреда для существующих данных, их структуры и производительности СУБД добавлять поля или колонки.</li></ul><h3>Какую СУБД выбрать?</h3><p>MySQL — верный выбор для любого проекта, который может положиться на предопределённую структуру и заданные схемы. С другой стороны, MongoDB — отличный вариант для быстрорастущих проектов без определённой схемы данных. В особенности если вы не можете определить схему для своей базы данных, вам не подходит ни одна из предлагаемых другими СУБД или в вашем проекте она постоянно меняется, как, например, в случае с мобильными приложениями, системами аналитики в реальном времени или контент-менеджмента.</p>]]></content:encoded>
    </item>
    <item>
      <title>SQL и NoSQL: разбираемся в основных моделях баз данных</title>
      <link>https://tproger.ru/translations/sql-nosql-database-models</link>
      <comments>https://tproger.ru/translations/sql-nosql-database-models?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Vladimir Gabrinevski]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/sql-nosql-database-models</guid>
      <description/>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[NoSQL]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 04 Sep 2016 00:57:10 GMT</pubDate>
      <content:encoded><![CDATA[<p>С незапамятных времен память была одной из самых важных и необходимых составляющих компьютера. Несмотря на разницу в методах реализации, большинство вычислительных машин оснащены необходимым аппаратным обеспечением для обработки и хранения информации. В наше время невозможно представить работу какого-либо приложения, хоть игры, хоть сайта, без получения, обработки и записи определённого типа данных. Системы управления базами данных (СУБД) — это высокоуровневое программное обеспечение, работающее с низкоуровневыми API. Для решения различных проблем создавались новые виды СУБД (реляционные, NoSQL и т.д.) и их новые реализации (MySQL, PostgreSQL, MongoDB, Redis и т.д.). В этой статье мы разберемся в основах баз данных и СУБД.</p><h3>Системы управления базами данных</h3><p>СУБД — это общий термин, относящийся ко всем видам абсолютно разных инструментов, от компьютерных программ до встроенных библиотек. Эти приложения управляют или помогают управлять наборами данных. Так как эти данные могут быть разного формата и размера, были созданы разные виды СУБД. Эта статья — часть нашего <a href="https://tproger.ru/articles/sql--polnyj-putevoditel---ot-pervyh-zaprosov-do-okonnyh-funkcij">полного путеводителя по SQL</a>.</p><p>СУБД основаны на моделях баз данных — определённых структурах для <a href="https://tproger.ru/translations/sql-recap/">обработки данных</a>. Каждая СУБД создана для работы с одной из них с учётом особенностей операций над информацией.</p><p>Хотя решений, реализующих различные модели баз данных, очень много, периодически некоторые из них становятся очень популярными и используются на протяжении многих лет. Сейчас самой популярной моделью является реляционная система управления базами данных (РСУБД).</p><h3>Модели баз данных</h3><p>Каждая СУБД реализует одну из моделей баз данных для логической структуризации используемых данных. Эти модели являются главным критерием того, как будет работать и управлять информацией приложение. Существует несколько таких моделей, среди которых самой популярной является реляционная.</p><p>Хотя она и является весьма мощной и гибкой, есть ситуации, решения которых она предложить не может. Тут на помощь придёт сравнительно новая модель, называемая NoSQL. Она набирает популярность и предлагает весьма интересные решения и дополнительный функционал. Из-за того, что эти системы не используют строгую структуризацию данных, они предлагают большую свободу действий при обработке информации.</p><h4>Реляционная модель</h4><p>Представленная в 70-х, реляционная модель предлагает математический способ структуризации, хранения и использования данных. Отношения (англ. relations) дают возможность группировки данных как связанных наборов, представленных в виде таблиц, содержащих упорядоченную информацию (например, имя и адрес человека) и соотносящих значения и атрибуты (его номер паспорта).</p><p>Благодаря десятилетиям исследований и разработки РСУБД работают производительно и надёжно. В сочетании с большим опытом использования администраторами реляционные базы данных стали выбором, гарантирующим защиту информации от потерь.</p><p>Несмотря на строгие принципы формирования и обработки данных, РСУБД могут быть весьма гибкими, если приложить немного усилий.</p><h4>Безмодельный (NoSQL) подход</h4><p>NoSQL-способ структуризации данных заключается в избавлении от ограничений при хранении и использовании информации. Базы данных NoSQL, используя неструктуризированный подход, предлагают много эффективных способов обработки данных в отдельных случаях (например, при работе с хранилищем текстовых документов).</p><h3>Популярные СУБД</h3><p>В этой статье мы опишем вам парадигмы основных решений для работы с базами данных. Хотя точные числа привести очень сложно, в большинстве случаев выбор делается в пользу реляционной модели или NoSQL. Прежде чем мы сравним их, давайте узнаем, что находится “под капотом” у каждой из них.</p><h4>РСУБД</h4><p>Реляционные системы управления базами данных берут своё название от реализуемой модели — реляционной. Сейчас они остаются, да и ещё какое-то время будут, самым популярным выбором для надёжного, безопасного и производительного хранения данных.</p><p>РСУБД требуют чётких и ясных схем — не стоит путать со специфическим определением для PostgreSQL — для работы с данными. Эти рамки, определённые пользователем, задают способ их хранения и использования. Схемы очень похожи на таблицы, столбцы которых отражают порядковый номер и тип информации в каждой записи, а строки — содержимое этих записей.</p><p>Самыми популярными РСУБД сейчас являются:</p><ul><li>SQLite: очень мощная встраиваемая РСУБД.</li></ul><ul><li>MySQL: самая популярная и часто используемая РСУБД.</li></ul><ul><li>PostgreSQL: самая продвинутая и гибкая РСУБД.</li></ul><h4>NoSQL-СУБД</h4><p>NoSQL-СУБД не используют реляционную модель структуризации данных. Существует много реализаций, рещающих этот вопрос по-своему, зачастую весьма специфично. Эти бессхемные решения допускают неограниченное формирование записей и хранение данных в виде ключ-значение.</p><p>В отличие от традиционных РСУБД, некоторые базы данных NoSQL, например, MongoDB, позволяют группировать коллекции данных с другими базами данных. Такие СУБД хранят данные как одно целое. Эти данные могут представлять собой одиночный объект наподобие JSON и вместе с тем корректно отвечать на запросы к полям.</p><p>NoSQL базы данных не используют общий формат запроса (как SQL в реляционных базах данных). Каждое решение использует собственную систему запросов.</p><h3>Сравнение SQL и NoSQL</h3><p>Для того, чтобы прийти к простому и понятному выводу, давайте проанализируем разницу между SQL- и NoSQL-подходами: Сравнение реляционных СУБД между собой — <a href="https://tproger.ru/translations/sqlite-mysql-postgresql-comparison">SQLite, MySQL, PostgreSQL</a>.</p><ul><li>Структура и тип хранящихся данных: SQL/реляционные базы данных требуют наличия однозначно определённой структуры хранения данных, а NoSQL базы данных таких ограничений не ставят.</li></ul><ul><li>Запросы: вне зависимости от лицензии, РСУБД реализуют SQL-стандарты, поэтому из них можно получать данные при помощи языка SQL. Каждая NoSQL база данных реализует свой способ работы с данными.</li></ul><ul><li>Масштабируемость: оба решения легко растягиваются вертикально (например, путём увеличения системных ресурсов). Тем не менее, из-за своей современности, решения NoSQL обычно предоставляют более простые способы горизонтального <a href="https://ru.wikipedia.org/wiki/Масштабируемость">масштабирования</a> (например, создания кластера из нескольких машин).</li></ul><ul><li>Надёжность: когда речь заходит о надёжности, SQL базы данных однозначно впереди.</li></ul><ul><li>Поддержка: РСУБД имеют очень долгую историю. Они очень популярны, и поэтому получить поддержку, платную или нет, очень легко. Поэтому, при необходимости, решить проблемы с ними гораздо проще, чем с NoSQL, особенно если проблема сложна по своей природе (например, при работе с MongoDB).</li></ul><ul><li>Хранение и доступ к сложным структурам данных: по своей природе реляционные базы данных предполагают работу с сложными ситуациями, поэтому и здесь они превосходят NoSQL-решения.</li></ul>]]></content:encoded>
    </item>
  </channel>
</rss>